python爬取考研网的信息
- 2019 年 10 月 6 日
- 筆記
今天我们使用python来爬取考研网站的信息。
目标网站:
https://yz.chsi.com.cn/zsml/queryAction.do
使用的库:
requests,bs4,pandas
这些库统一可以使用pip进行统一安装
pip install requests pip install bs4 pip install pandas
安装完之后我们便可以进行信息的爬取了
首先,我们去考研网上查看一下网站的头部信息:

使用开发者模式,在请求里面找到请求头部的信息。
我们需要把user-agent提取出来:
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKi" "t/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
首先我们需要获取三个字段的接口数据,分别是:省份,学科,专业编号
http://yz.chsi.com.cn/zsml/pages/getSs.jsp

http://yz.chsi.com.cn/zsml/pages/getMl.jsp

http://yz.chsi.com.cn/zsml/pages/getZy.jsp

下面我们来获取一个学校的网址:
url = "http://yz.chsi.com.cn/zsml/queryAction.do" data = { "ssdm": self.province, "yjxkdm": self.category, } response = requests.post(url, data=data, headers=self.head) html = response.text reg = re.compile(r'(<tr>.*? </tr>)', re.S) content = re.findall(reg, html) schools_url = re.findall('<a href="(.*?)" target="_blank">.*?</a>', str(content))
我们使用正则表达式获取tr标签里面的内容
对于获取的内容,我们统一只获取a标签中的超链接,这就是对应的学校的网址
(.*?万能匹配表达式,匹配目标元素0次或者多次,懒惰模式)
下面我们要干的事情是获取一个学校的所有数据
拿到学校的url之后,我们可以再次通过正则表达式获取学校网站上所有的有用的内容。
response = requests.get(url, headers=self.head) html = response.text colleges_url = re.findall('<td class="ch-table-center"><a href="(.*?)" ' 'target="_blank">查看</a>', html)
下面我们通过已经获取的school_url和colleges_url去获取所有学校的数据
url = "http://yz.chsi.com.cn" schools_url = self.get_school_url() amount = len(schools_url) i = 0 for school_url in schools_url: i += 1 url_ = url + school_url # 找到一个学校对应所有满足学院网址 colleges_url = self.get_college_data(url_) print("已完成第" + str(i) + "/" + str(amount) + "学院爬取") time.sleep(1) for college_url in colleges_url: _url = url + college_url get_final_data(_url)
最后利用pandas将获取的数据转化成csv格式存储:
data = DataFrame(self.data) data.to_csv("查询招生信息.csv", encoding="utf_8_sig")
这样我们就可以获取所有的学校的考研专业的数据啦!


对于北京的一些大学,就有近900条信息
对于自己想看哪个学校,只需要给定相应的省份编号和专业代码就可以查询。
现在我们可以优化一下代码,我们将之前的代码都封装在方法里面。
import requests from bs4 import BeautifulSoup from pandas.core.frame import DataFrame import re import time class Graduate: def __init__(self, province, category): self.head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKi" "t/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" } self.data = [] self.province = province self.category = category def get_list_fun(self, url, name): """获取提交表单代码""" response = requests.get(url, headers=self.head) province = response.json() with open("{}.txt".format(name), "w") as f: for x in province: f.write(str(x)) f.write("n") def get_list(self): self.get_list_fun("http://yz.chsi.com.cn/zsml/pages/getSs.jsp", "province") self.get_list_fun('http://yz.chsi.com.cn/zsml/pages/getMl.jsp', "category") self.get_list_fun('http://yz.chsi.com.cn/zsml/pages/getZy.jsp', 'major') def get_school_url(self): url = "http://yz.chsi.com.cn/zsml/queryAction.do" data = { "ssdm": self.province, "yjxkdm": self.category, } response = requests.post(url, data=data, headers=self.head) html = response.text reg = re.compile(r'(<tr>.*? </tr>)', re.S) content = re.findall(reg, html) schools_url = re.findall('<a href="(.*?)" target="_blank">.*?</a>', str(content)) return schools_url def get_college_data(self, url): """返回一个学校所有学院数据""" response = requests.get(url, headers=self.head) html = response.text colleges_url = re.findall('<td class="ch-table-center"><a href="(.*?)" ' 'target="_blank">查看</a>', html) return colleges_url def get_final_data(self, url): """输出一个学校一个学院一个专业的数据""" temp = [] response = requests.get(url, headers=self.head) html = response.text soup = BeautifulSoup(html, features='lxml') summary = soup.find_all('td', {"class": "zsml-summary"}) for x in summary: temp.append(x.get_text()) self.data.append(temp) def get_schools_data(self): """获取所有学校的数据""" url = "http://yz.chsi.com.cn" schools_url = self.get_school_url() amount = len(schools_url) i = 0 for school_url in schools_url: i += 1 url_ = url + school_url # 找到一个学校对应所有满足学院网址 colleges_url = self.get_college_data(url_) print("已完成第" + str(i) + "/" + str(amount) + "学院爬取") time.sleep(1) for college_url in colleges_url: _url = url + college_url self.get_final_data(_url) def get_data_frame(self): """将列表形数据转化为数据框格式""" data = DataFrame(self.data) data.to_csv("查询招生信息.csv", encoding="utf_8_sig") if __name__ == '__main__': # province = input("请输入查询学校省份编号:") # category = input("请输入查询专业代码:") province = "11" category = "0812" spyder = Graduate(province, category) spyder.get_schools_data() spyder.get_data_frame()
所有代码都放在GitHub,代码地址:
https://github.com/johnturingwu/helloworld/blob/master/kaoyan.py
点击阅读原文可直达。