查看原文
其他

知识练兵--python爬取国家社科基金项目数据库

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:杨长青

本文编辑:周聪聪

技术总编:张学人

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

孔子说温故而知新,可以为师矣。爬虫俱乐部已经介绍了很多python库,包括pyechartspandasre以及经常使用的requests库等等,大家有没有熟能生巧、运用自如呢?今天作为一次知识大练兵,小编带着大家去完成一个小任务--爬取国家社科基金库,听起来是不是很有意思?接下来让我们行动起来:

国家社科基金项目数据库的网址为:http://fz.people.com.cn/skygb/sk/?&p=1,该系统包含1994年到2018年社科基金立项信息,包括项目类别,学科分类,项目名称,立项时间,负责人,工作单位,结项时间等信息。

常规操作,我们首先查看一下源代码:

源代码中即有我们所需要的数据,而且小编在爬取的过程中几乎没有发现任何反爬措施,大大降低了爬虫难度,数据几乎是摆在我们面前。

主要的思路是:首先使用request模块获取源码,然后对源码使用正则表达式提取所需信息,并将数据导入到DataFrame中。我们以爬取单个页面为例:

  1.获取源代码,程序如下:

import requestsurl=r'http://fz.people.com.cn/skygb/sk/?&p=1'text=requests.get(url).text #获取源代码

这样就将第三页的源码存储在名为text的字符串中。

 2.正则提取

正则库的详细内容可以查看:《Python标准库:正则表达式》。上图是原代码中包含我们需要的信息的部分,python中正则表达式的用法和stata类似。可以发现每条信息的形式为:<spantitle="211高校">211高校</span>。211高校使我们需要的信息,类比可以写出正则表达式的形式:<spantitle=.*?">(.*?)</span></td>

然后使用正则函数findall函数提取信息,程序如下:

import reresult=re.findall('<span title=.*?">(.*?)</span></td>',text,re.S)

  如上就将所需信息全部保存到名为result的列表中:

3.导入DataFrame

该数据包含20种信息,接下来要做的是将一列变多列,将其变成20*20的矩阵形式,并导入到DataFrame。pandas的内容可查看:《pandas之数据的读入与导出》。程序如下:

import pandas as pdimport numpy as nptemp=np.array(result).reshape(-1,20) #将一列变多列columns=["项目批准号","项目类别 ","学科分类 ","项目名称 ","立项时间 ", "项目负责人 ","专业职务 ","工作单位 ","单位类别","所在省区市", "所属系统","成果名称","成果形式","成果等级","结项时间", "结项证书号","出版社","出版时间","作者","获奖情况"]df1=pd.DataFrame(temp,columns=columns)

 这样就完成了单个页面的抓取:

以上就抓取完成一个页面,该网站共有74791 条记录,总计3740页。其实我们改变链接后的&p=1,就可以完成翻页。接下来就可以使用循环,抓取所有数据,完整程序如下:

import requests import pandas as pdimport numpy as npimport recolumns=["项目批准号","项目类别","学科分类","项目名称","立项时间", "项目负责人","专业职务","工作单位","单位类别","所在省区市", "所属系统","成果名称","成果形式","成果等级","结项时间", "结项证书号","出版社","出版时间","作者","获奖情况"]final=pd.DataFrame(columns=columns)for i in range(1,4000): url=r'http://fz.people.com.cn/skygb/sk/?&p='+str(i) text=requests.get(url).text result=re.findall('<span title=.*?">(.*?)</span></td>',text,re.S) temp=np.array(result).reshape(-1,20) #将一列变多列 temp=pd.DataFrame(temp,columns=columns) frames=[final,temp] final = pd.concat(frames,axis=0, ignore_index=True) print("第 %d 页完成"%(i)) if len(temp)<20: print("全部完成") break #如果一页小于20个跳出循环

我们对爬取的数据做一个简单分析,利用爬取俱乐部之前介绍的pyechart库绘制排名靠前的单位立项数的情况,具体可参考:《python数据可视化神器:pyecharts》:

df=final[final["工作单位"]!=""].groupby(final["工作单位"]).size() #分组计算每个高校的立项数目df.sort_values(ascending=False,inplace=True) #降序排列from pyecharts import Barbar = Bar('历年社科立项总数')bar.add("立项数", df.index.tolist()[0:30],df.values.tolist()[0:30], width=3000,xaxis_rotate=60, is_more_utils = True #设置最右侧工具栏 )bar.show_config() #调试输出pyecharts的js配置信息bar.render('first01.html')

柱状图如下:

排名第一的是人大,华中师范竟然排名第二,有些出人意料,河南大学在众多学校中绝对堪称一匹黑马!我们利用这个小项目又把之前爬虫俱乐部介绍的库使用了一遍,温故而知新,希望和大家一起进步!以上就是今天介绍的全部内容,有任何问题都可以通过邮件和我们联系!

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存