Python爬取研招网专业目录信息
本文作者:王玉洁,中南财经政法大学金融学院
本文编辑:周一鸣
技术总编:王玉婷
Stata and Python 数据分析
由李春涛教授和团队成员司海涛、薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!爬虫俱乐部特此为大家准备了100本,即日起购买爬虫俱乐部课程,可赠送本书一本,先到先得!
购书链接:
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
接着,我们需要获取这个页面的url并且对url进行解析,原始的url可以通过上图红色框框的内容获得,再将解析之后的内容与原始url进行拼接,得到具体解析程序如下:
import pandas as pd
import requests as rqs
from 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")
接下来,我们定义函数来获取这一页的所有学校信息,以及其链接的下一页面的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)
最后点击查看进入到院校详细信息的页面,如下图:
利用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 pd
import requests as rqs
from 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们快赶紧试试吧!
最后,我们为大家揭秘雪球网(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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。