【实战】 stata-教育部文件数据爬取(上)
2020-02-02 本文已影响0人
Hobbit的理查德
1.背景
春节假期,大家在家待着估计都要闲得发慌了。
前两天跟同事聊天,聊到她想获取教育部的政策文件,看看政策走向啥的。
奈何python和R还都没学好,只能先用学会的stata爬取网站数据搞一搞了。
2.需求
- 教育部官网的政策文件(http://www.moe.gov.cn/was5/web/search?channelid=239993)分为:
- 教育部文件;
- 中央文件;
- 其他部门文件;
- 将文件以及相关文件信息爬取并整理;
3.思路
-
获取每页的含文件链接的html,以教育部文件为例,共711页;
-
清洗并获得每个文件的链接,以教育部文件为例,共10662条链接;
-
获取每个文件的html,以教育部文件为例,共10662个html;
-
清洗每个文件的html,得到文件信息,以教育部文件为例,包括文件id(自定义),标题,信息索引,生成日期,发文机构,发文字号,信息类别,内容概述,正文标题,正文内容,正文落款,正文日期,页面链接,上传日期,信息拥有司局,公文形式等。
文件信息.png
参考来源1:https://www.jianshu.com/p/2f0e293866f1
参考来源2:https://www.jianshu.com/p/4d573d50459e
4.过程
①获取每页的含文件链接的html
page.jpg- 由上可以看出,每页的链接为
http://www.moe.gov.cn/was5/web/search?channelid=239993&searchword=&page=*页面数字*&lx=
,因此可以通过循环获得这711页的源代码
*通过循环将711页的html存至711个txt文件中,保存至1个文件夹中
cd C:\study\实战\stata\jyb\jyb1
forvalues i = 1(1)711 {
copy "http://www.moe.gov.cn/was5/web/search?channelid=239993&searchword=&page=`i'&lx=.html" "page`i'.txt",replace
}
结果
每页的html中都含有该页所有文件的链接,接下来要做的就是把这些链接提取出来,同时获得每个文件的其他信息。
page内容.png
②清洗并获得每个文件的链接
-
思路:先尝试某一页,即某个txt的清洗,然后,再将所有txt合并后统一清洗。
-
以page1.txt为例
-
步骤1:
*导入txt文件,让txt文件再stata中以变量v,多行(多个case)显示,并且每一行最多读取20000个字符,可以设置更大一些。
infix strL v 1-20000 using "page1.txt",clear
*将变量v显示更宽,便于查看
format v %1000s
步骤1结果
page1导入数据.png- 步骤2:
*观察每页的源代码可以发现,将同时含有字符串a href=,target,html,li,并且不含有字符串index的case保留
keep if regexm(v,"a href=")®exm(v,"target")®exm(v,"html")®exm(v,"li")®exm(v,"index")==0
步骤2结果
page1文件链接.png- 步骤3:
*通过命令split拆分变量,得到页面链接,标题,上传日期三个字段
split v,p("a href=")
split v2,p(`"""')
split v25,p(">")
split v252,p("</")
split v254,p("</")
*保留页面链接,标题,上传日期三个字段
keep v22 v2521 v2541
label var v22 "页面链接"
label var v2521 "标题"
label var v2541 "上传日期"
*给这三个字段重命名
rename v22 purl
rename v2521 title
rename v2541 time
步骤3结果
page1_data.png- 步骤4:
*根据查看官网的链接信息获得每个文件信息的拥有司局
gen siju=""
label var siju "信息拥有司局"
replace siju="办公厅" if regexm(purl,"A01")
replace siju="政策法规司" if regexm(purl,"A02")
replace siju="发展规划司" if regexm(purl,"A03")
replace siju="综合改革司" if regexm(purl,"A27")
replace siju="人事司" if regexm(purl,"A04")
replace siju="财务司" if regexm(purl,"A05")
replace siju="教材局" if regexm(purl,"A26")
replace siju="基础教育司" if regexm(purl,"A06")
replace siju="职业教育与成人教育司" if regexm(purl,"A07")
replace siju="高等教育司" if regexm(purl,"A08")
replace siju="教育督导局" if regexm(purl,"A11")
replace siju="民族教育司" if regexm(purl,"A09")
replace siju="教师工作司" if regexm(purl,"A10")
replace siju="体育卫生与艺术教育司" if regexm(purl,"A17")
replace siju="思想政治工作司" if regexm(purl,"A12")
replace siju="社会科学司" if regexm(purl,"A13")
replace siju="科学技术司" if regexm(purl,"A16")
replace siju="高校学生司" if regexm(purl,"A15")
replace siju="学位管理与研究生教育司" if regexm(purl,"A22")
replace siju="语言文字应用管理司" if regexm(purl,"A18")
replace siju="语言文字信息管理司" if regexm(purl,"A19")
replace siju="国际合作与交流司" if regexm(purl,"A20")
replace siju="巡视工作办公室" if regexm(purl,"A28")
replace siju="机关党委" if regexm(purl,"A21")
replace siju="离退休干部局" if regexm(purl,"A24")
replace siju="中国联合国教科文组织全国委员会秘书处" if regexm(purl,"A23")
replace siju="纪检组、监察局" if regexm(purl,"A25")
*新增变量id,用于标识每个文件
gen id=_n
*保存为数据jyb_file_all
save C:\study\实战\stata\jyb\jyb_file_all,replace
- 上述是以page1.txt为例,由于html具有结构性,因此,可以把711个txt合并后,批量进行处理;
- 首先,txt合并:在txt文件所在文件夹,新生成一个txt文件,内容为:
type *.txt >all.txt
,再将该文件的后缀由.txt改为.bat;双击该.bat文件,则可以将该文件夹下所有txt进行合并,生成all.txt文件; - 其次,修改上述步骤1:将调用文件,改为all.txt;步骤2-步骤4和上述相同。
- 首先,txt合并:在txt文件所在文件夹,新生成一个txt文件,内容为:
infix strL v 1-20000 using "all.txt",clear
步骤4结果
-
数据描述
数据描述.png
-
显示前30条数据情况
前30条.png
③获取每个文件的html
*注意:紧接上述步骤,同时运行下面所有语句
*将文件数量_N,即数据jyb_file_all中的个案总数,保存至暂元N中
local N=_N
*通过循环,将变量purl中的每个链接存至相应的暂元url`i'中
forvalue i=1(1)`N'{
local url`i'=purl[`i']
}
*通过循环,获取每个暂元url`i'中的html,即网页源代码,每个文件网页保存至一个txt文件中,即共10662个txt
forvalue j=1(1)`N'{
copy "`url`j''" "C:\study\实战\stata\jyb\jyb2\file`j'.txt",replace
}
结果
10662个txt.png预告:
《【实战】stata-教育部文件数据爬取(下)》
《【实战】stata-教育部中央文件数据爬取》
《【实战】stata-其他部门文件数据爬取》