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

引言

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

1.打开网页获取原始url

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

2.获取url并解析

接着,我们需要获取这个页面的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")

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 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们快赶紧试试吧!

END

如果你想学习编程给大家分享一份Python学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂。如果需要的话直接划到文末免费获得,让我们一起学习!

在这里插入图片描述

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
在这里插入图片描述

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

在这里插入图片描述

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
在这里插入图片描述

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

五、清华编程大佬出品《漫画看学Python》

用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。
在这里插入图片描述

配套600集视频:

在这里插入图片描述

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述
在这里插入图片描述

  • 23
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值