【实战】 stata-教育部文件数据爬取(上)

2020-02-02  本文已影响0人  Hobbit的理查德

1.背景

春节假期,大家在家待着估计都要闲得发慌了。

前两天跟同事聊天,聊到她想获取教育部的政策文件,看看政策走向啥的。

奈何python和R还都没学好,只能先用学会的stata爬取网站数据搞一搞了。

2.需求

3.思路

  1. 获取每页的含文件链接的html,以教育部文件为例,共711页;

  2. 清洗并获得每个文件的链接,以教育部文件为例,共10662条链接;

每页链接.png
  1. 获取每个文件的html,以教育部文件为例,共10662个html;

  2. 清洗每个文件的html,得到文件信息,以教育部文件为例,包括文件id(自定义),标题信息索引生成日期,发文机构,发文字号,信息类别,内容概述,正文标题,正文内容,正文落款,正文日期,页面链接,上传日期,信息拥有司局,公文形式等。

    文件信息.png

参考来源1:https://www.jianshu.com/p/2f0e293866f1
参考来源2:https://www.jianshu.com/p/4d573d50459e

4.过程

①获取每页的含文件链接的html

page.jpg
*通过循环将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文件再stata中以变量v,多行(多个case)显示,并且每一行最多读取20000个字符,可以设置更大一些。
infix strL v 1-20000 using "page1.txt",clear
*将变量v显示更宽,便于查看
format v %1000s

步骤1结果

page1导入数据.png
*观察每页的源代码可以发现,将同时含有字符串a href=,target,html,li,并且不含有字符串index的case保留
keep if regexm(v,"a href=")&regexm(v,"target")&regexm(v,"html")&regexm(v,"li")&regexm(v,"index")==0

步骤2结果

page1文件链接.png
*通过命令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
*根据查看官网的链接信息获得每个文件信息的拥有司局
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
infix strL v 1-20000 using "all.txt",clear

步骤4结果

③获取每个文件的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-教育部中央文件数据爬取》

《【实战】stata-其他部门文件数据爬取》

上一篇下一篇

猜你喜欢

热点阅读