查看原文
其他

Stata爬取新浪教育高考院校库

爬虫俱乐部 Stata and Python数据分析 2022-03-15
本文作者:孙雪丽



文字编辑:杨长青



技术总编:司海涛

好消息!!!爬虫俱乐部将于2019年7月5日至7月8日在武汉举行首期Python编程技术定制培训本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python爬虫技术,并明确未来更进一步的学习方向。

详细培训大纲及报名方式,请点击文末阅读原文呦~


不知不觉距离今年高考已不足两月,爬虫俱乐部想为正在努力拼搏的高三学子做些力所能及的事情。今天我们便来用Stata爬取新浪教育——高考院校库中的专业分数线(http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major),为即将面临专业、学校选择的高三学子提供分数线参考。

打开上述链接,页面如下:

红色方框中对应的是筛选条件,筛选条件下方即各个学校、专业录取数据。进一步点击筛选条件,发现网页的网址会发生细微的变化。比如,专业大类中点击“经济学”,网址变为:

http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=&local=1&provid=&batch=&syear=     

再如,文理分科中点击“理科”,考生所在地点击“河南”,录取批次中点击“本科一批”,网址变为:

http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=2&local=6&provid=&batch=11&syear=

……

不难发现,网址中以&符号分隔的各个参数对应上图中的筛选条件,改变筛选条件时只需改变网址中对应的参数即可。在此基础上我们便以经济学专业理科一批为例,爬取历年(不限年份)所有高校(不限院校所在地)在各地的录取分数线数据。

一、抓取单个省份单个页面的数据

以考生所在地为河南为例(网址中参数local取值为6),首先介绍单个页面的抓取。在网页空白处右击鼠标,选择“查看网页源代码”(或“查看源文件”),发现在源代码1441-1639行出现我们所需的目标数据,锁定目标数据后便可通过copy命令抓取该网页的源代码,并将其读入Stata,程序如下:

clearcap mkdir F:/经济学专业分数线cd F:/经济学专业分数线copy "http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=2&local=6&provid=&batch=11&syear=" temp.txt, replaceinfix strL v 1-100000 using temp.txt, clear //读入源代码replace v = subinstr(v," ","",.) //为便于处理,删除源代码中的空格

进一步分析网页源代码:

发现目标数据所在行均有一对单元格标签”<td>……</td>”,且”<td>”标签仅出现在目标数据行,通过在变量v中检索”<td>”可保留具有目标数据的行,并通过正则表达式替换函数ustrregexra()去除目标数据中的html标签,程序如下:

keep if index(v,"<td>")replace v = ustrregexra(v,"<.*?>","")

上述处理后Stata内存中的数据如下:

所有数据均处于变量v下,每9行对应一个学校一个专业的分数线信息,为了便于分析数据,应将这一列转化为多列,每一列代表一项信息,如v1代表学校名称,v2代表最高分……,如何实现呢?

转化为多列必然要生成多个变量,我们循环生成8个变量v1-v8,v1为变量v中第二行及以后的数据,v2为v中第三行及以后的数据……,程序如下:

forvalue i = 1/8 { gen v`i' = v[_n+`i'] //生成变量vi}

执行上述程序后,内存中的数据如下:

数据中,行号除以9余数为1的行即为目标数据行(如第1、10、19行),保留这些行,并为变量重命名即完成了单个页面数据的抓取,程序如下:

keep if mod(_n,9) == 1drop v8 //删除无关变量rename _all (major university high average province studenttype batch year)compress

二、单个省份所有页面的抓取

将网页下拉至最下方,可以看到河南省2008-2017年间理科一批经济学专业的录取数据有3276条,每页20条数据,共164页,点击下一页,网址变为

http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=2&local=6&provid=&batch=11&syear=&page=2

网址最后多了参数page,将page的取值改为1,依然可以切回第一个页面。依据这一思路,通过对page循环,可抓取河南省2008-2017年期间理科一批经济学专业的所有数据。循环中单个页面的处理与第一部分类似,单个省份抓取程序如下:

clearcap mkdir F:/经济学专业分数线/单个省份cd F:/经济学专业分数线/单个省份forvalue page = 1/164 { copy "http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=2&local=6&provid=&batch=11&syear=&page=`page'" temp.txt, replace infix strL v 1-100000 using temp.txt, clear replace v = subinstr(v," ","",.) keep if index(v,"<td>") replace v = ustrregexra(v,"<.*?>","") forvalue i = 1/8 { gen v`i' = v[_n+`i'] } keep if mod(_n,9) == 1 drop v8 rename _all (major university high average province studenttype batch year) compress save 河南省_`page', replace}*合并数据fs *.dtaforeach file in `r(files)' { append using `file' erase `file'}save 河南省, replace

三、抓取所有省份的数据

第二部分仅抓取了各高校在河南省的历年经济学专业录取数据,如何抓取所有省份的数据呢?点击筛选条件中考生所在地的各省份,不难发现网址中参数local的取值1-31分别对应北京到甘肃31个省市。抓取所有省份的数据仅需在第二部分基础上增加对省份代码(1-31)的循环。

此外,由于各省份数据量并不相同,将页码的循环改为1/500,并在循环中增加判断条件,当抓取的页面没有目标数据时跳出循环。所有省份抓取的完整程序如下:

clearcap mkdir F:/经济学专业分数线/所有省份cd F:/经济学专业分数线/所有省份forvalue province = 1/31 { forvalue page = 1/500 { copy "http://kaoshi.edu.sina.com.cn/college/scorelist?tab=major&majorid=02&wl=2&local=`province'&provid=&batch=11&syear=&page=`page'" temp.txt, replace infix strL v 1-100000 using temp.txt, clear replace v = subinstr(v," ","",.) keep if index(v,"<td>") if _N == 0 { //判断内存中是否抓取下来数据 continue, break //没有数据时跳出循环 } replace v = ustrregexra(v,"<.*?>","") forvalue i = 1/8 { gen v`i' = v[_n+`i'] } keep if mod(_n,9) == 1 drop v8 rename _all (major university high average province studenttype batch year) compress save `province'_`page', replace }}fs *.dtaforeach file in `r(files)' { append using `file' erase `file'}save 2008-2017大学经济学专业分数线, replace

抓取的最终数据如下(部分截取):

以上便是今天分享的一个超简单的爬虫案例,20多行代码便轻松抓取了历年各高校经济学专业在各地的分数线,数据量4万有余。且我们仅以经济学专业为例介绍了这一数据库的抓取思路,感兴趣的读者可以照此抓取其他专业类别的数据(仅需改变网址中参数major的取值),或在上述程序基础上增加一层对专业类别的循环抓取所有专业的录取数据。后续推文我们将运用抓取的这一数据来分析各高校经济学专业的平均分数线,一眼看出经济学专业哪家强,敬请期待!

后记:说起高考,顿时感慨万千,你是否还记得那个高三的你,在枯燥无聊的学习生活中发生了哪些有趣的事,又有哪些难忘的人……欢迎大家在下方留言与我们分享你和高考之间的故事,一起为正在努力奋斗的高三学子加油打气!

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

往期推文推荐

关于我们

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

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

投稿邮箱:statatraining@163.com

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


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

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