查看原文
其他

Python爬取研招网专业目录信息

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:王玉洁,中南财经政法大学金融学院

本文编辑:周一鸣

技术总编:王玉婷


Stata and Python 数据分析

     由李春涛教授团队成员司海涛薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!爬虫俱乐部特此为大家准备了100本,即日起购买爬虫俱乐部课程,可赠送本书一本,先到先得!


购书链接:

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
言     

大家好呀,又见面了!各位即将要考研或者正在考研的小伙伴们快看过来!大家是不是经常为查找和收集关于考研院校的相关信息而烦恼呢,信息又多又繁杂,小编之前也为查找考研院校的信息而摸不着头脑,但是自从学了Python之后,利用Python爬取考研的相关信息简直是so easy~~ 今天小编就带领大家爬取研招网的院校信息,一起来看看吧!

1.url

首先,我们找到并打开研招网的专业目录网页(https://yz.chsi.com.cn/zsml/queryAction.do),然后查找自己感兴趣的专业和学科,这里以经济学门类下面的应用经济学学科为例,在对应的框选择门类类别和学科类别,点击查询得到以下页面:






2.url


接着,我们需要获取这个页面的url并且对url进行解析,原始的url可以通过上图红色框框的内容获得,再将解析之后的内容与原始url进行拼接,得到具体解析程序如下:

import pandas as pdimport requests as rqsfrom lxml import etree # 用xpth解析数据需要导入
params = { "ssdm": "", # 省份代码 "dwmc": "", # 学校名称 "mldm": "zyxw", # 学术学位 或 专业学位 的拼音缩写 "mlmc": "", # "yjxkdm": "0202", # 专业领域代码 "zymc": "应用经济学", # 学科名称 "xxfs": 1, # 1 全日制, 2 非全日制 "pageno": 1}
url = """https://yz.chsi.com.cn/zsml/queryAction.do?ssdm={ssdm}&dwmc={dwmc}&mldm={mldm}&mlmc={mlmc}&yjxkdm={yjxkdm}&zymc={zymc}&xxfs={xxfs}&pageno={pageno}"""headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26"}# 储存数据的列表table = []def getSearchData(params: dict): return rqs.get(url.format(**params), headers=headers).content.decode("utf-8")


3.


接下来,我们定义函数来获取这一页的所有学校信息,以及其链接的下一页面的url。将光标放到任意学校名称上,右键点击检查之后复制学校的xpath并获取对应学校的文本信息以及进一步访问对应学校详细信息的网址,同样利用xpath定位是否有研究生院,是否是自主划线院校,以及是否是博士点,具体程序如下:

def getAPageData(data): data_xpath = etree.HTML(data) school_names = data_xpath.xpath("""//*[@id="form3"]/a/text()""") # 学校名 mid_urls = data_xpath.xpath("""//*[@id="form3"]/a/@href""") # 中间网址,进一步访问每一个学校此专业的搜索结果 graduate_school_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[1]""") # 是否研究生院 autonomous_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[2]""") # 是否是自主划线院校 PhD_point_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[3]""") # 是否是博士点 return [school_names, mid_urls, graduate_school_opt, autonomous_opt, PhD_point_opt]

4.


然后根据自己的兴趣点击进入学校的专业界面,这里以北京交通大学为例,如下图所示:


我们需要利用xpath定位并获取这个页面中考试范围下查看的链接,这样才能进入到详细信息的界面,具体程序如下:

def getASchoolData(url, schoolInfo: dict): data_xpath = etree.HTML(rqs.get("https://yz.chsi.com.cn"+url, headers=headers).content.decode("utf-8")) result = data_xpath.xpath("""//table/tbody/tr/td[8]/a/@href""") # 查看详细信息连接 for i in result: getARecored(i, schoolInfo)


5.


最后点击查看进入到院校详细信息的页面,如下图:


利用xpath定位我们需要的所有元素并获取除了研究生院、自主划线和博士点外(这些信息来自于第一张图中传递过来的信息)的所有对应元素的文本信息,具体程序如下:

def getARecored(url, schoolInfo: dict): data_xpath = etree.HTML(rqs.get("https://yz.chsi.com.cn"+url, headers=headers).content.decode("utf-8")) table.append({ "学校": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[1]/td[@class='zsml-summary'][1]/text()")[0], "研究生院": schoolInfo["gso"], "自主划线": schoolInfo["ao"], "博士点": schoolInfo["phd"], "考试方式": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[1]/td[@class='zsml-summary'][2]/text()")[0], "院系所": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[2]/td[@class='zsml-summary'][1]/text()")[0], "专业": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[2]/td[@class='zsml-summary'][2]/text()")[0], "研究方向": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[3]/td[@class='zsml-summary'][2]/text()")[0], "拟招人数": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[4]/td[@class='zsml-summary'][2]/text()")[0], "政治": data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[1]/text()")[0], "政治详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[1]/span[@class='sub-msg']/text()")[0], "英语": data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[2]/text()")[0], "英语详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[2]/span[@class='sub-msg']/text()")[0], "业务课一":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[3]/text()")[0], "业务课一详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[3]/span[@class='sub-msg']/text()")[0], "业务课二":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[4]/text()")[0], "业务课二详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[4]/span[@class='sub-msg']/text()")[0] })


最后就是将上面的过程套入到循环中,遍历每一页,进入到每个学校的页面,再进入详细页面进行数据爬取并将爬取到的数据存储到csv文件中。以上就是整个爬虫的思路,所有的程序如下:

import pandas as pdimport requests as rqsfrom lxml import etree  # 用xpth解析数据需要导入
params = { "ssdm": "", # 省份代码 "dwmc": "", # 学校名称 "mldm": "zyxw", # 学术学位 或 专业学位 的拼音缩写 "mlmc": "", # "yjxkdm": "0202", # 专业领域代码 "zymc": "应用经济学", # 学科名称 "xxfs": 1, # 1 全日制, 2 非全日制 "pageno": 1}
url = """https://yz.chsi.com.cn/zsml/queryAction.do?ssdm={ssdm}&dwmc={dwmc}&mldm={mldm}&mlmc={mlmc}&yjxkdm={yjxkdm}&zymc={zymc}&xxfs={xxfs}&pageno={pageno}"""
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26"}# 储存数据的列表table = []
def getSearchData(params: dict): return rqs.get(url.format(**params), headers=headers).content.decode("utf-8")
def getARecored(url, schoolInfo: dict): data_xpath = etree.HTML(rqs.get("https://yz.chsi.com.cn"+url, headers=headers).content.decode("utf-8")) table.append({ "学校": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[1]/td[@class='zsml-summary'][1]/text()")[0], "研究生院": schoolInfo["gso"], "自主划线": schoolInfo["ao"], "博士点": schoolInfo["phd"], "考试方式": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[1]/td[@class='zsml-summary'][2]/text()")[0], "院系所": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[2]/td[@class='zsml-summary'][1]/text()")[0], "专业": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[2]/td[@class='zsml-summary'][2]/text()")[0], "研究方向": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[3]/td[@class='zsml-summary'][2]/text()")[0], "拟招人数": data_xpath.xpath("//table[@class='zsml-condition']/tbody/tr[4]/td[@class='zsml-summary'][2]/text()")[0], "政治": data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[1]/text()")[0], "政治详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[1]/span[@class='sub-msg']/text()")[0], "英语": data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[2]/text()")[0], "英语详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[2]/span[@class='sub-msg']/text()")[0], "业务课一":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[3]/text()")[0], "业务课一详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[3]/span[@class='sub-msg']/text()")[0], "业务课二":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[4]/text()")[0], "业务课二详情":data_xpath.xpath("//table/tbody[@class='zsml-res-items'][1]/tr/td[4]/span[@class='sub-msg']/text()")[0] })
def getASchoolData(url, schoolInfo: dict): data_xpath = etree.HTML(rqs.get("https://yz.chsi.com.cn"+url, headers=headers).content.decode("utf-8")) result = data_xpath.xpath("""//table/tbody/tr/td[8]/a/@href""") # 查看详细信息连接 for i in result: getARecored(i, schoolInfo)     def getAPageData(data): data_xpath = etree.HTML(data) school_names = data_xpath.xpath("""//*[@id="form3"]/a/text()""") # 学校名 mid_urls = data_xpath.xpath("""//*[@id="form3"]/a/@href""") # 中间网址,进一步访问每一个学校此专业的搜索结果 graduate_school_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[1]""") # 是否研究生院 autonomous_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[2]""") # 是否是自主划线院校 PhD_point_opt = data_xpath.xpath("""//table[@class='ch-table']/tbody/tr/td[3]""") # 是否是博士点 return [school_names, mid_urls, graduate_school_opt, autonomous_opt, PhD_point_opt]
def anlysisLoop(data): data_xpath = etree.HTML(data) max_page_num = data_xpath.xpath("""/html/body//div[4]/ul/li/a/text()""")[-1] # 最大页数 for k in range(1, int(max_page_num) + 1): global params params["pageno"] = k apage = getAPageData(rqs.get(url.format(**params), headers=headers).content.decode("utf-8")) for s in range(len(apage[1])): schoolInfo = {} for i in range(2, 5): if len(apage[i][s].xpath("./i")) != 0: schoolInfo[["gso", "ao", "phd"][i-2]] = 1 else: schoolInfo[["gso", "ao", "phd"][i-2]] = 0 getASchoolData(apage[1][s], schoolInfo)
data = getSearchData(params) anlysisLoop(data) df = pd.DataFrame(table) df.to_csv("output.csv", encoding="gbk", index=False) # 存储到 csv 文件

运行结果如下:


这样是不是既简单又省时省力呢,需要查找信息的考研er们快赶紧试试吧!

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!




往期推文推荐        论文检索与翻译神器——songbl      一文搞清楚Python函数的参数       Stata爬豆瓣和烂番茄——国内外的观影口味果然大不同       邮箱附件太多?Python帮你批量下载!      正则表达式之多次匹配

        爬虫君为你的数据自由操碎了心!cnborder重磅推出!

      基于Python的假设检验实现      Stata与MySQL交互--基础操作           Jupyter Notebook中的魔术命令     《Stata正则表达式》由中国金融出版社出版发行          匿名函数lambda到底怎么用?

Stata绘图系列—NBER Working paper仿图

       Camelot:从PDF中提取表格数据      Stata之计算财务指标——融资约束

      列表生成式|让你的代码更简洁

Stata绘图系列——玩转绘图通用选项之坐标轴

       玩转地图的好帮手--pyecharts

      爬虫俱乐部又又又输送了一位研究助理!!!     【数据分析】一文教你玩转DataFrame      震惊,爬虫俱乐部竟是这样运营答疑群的?!     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


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

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