python爬取考研网的信息

今天我们使用python来爬取考研网站的信息。


目标网站:

https://yz.chsi.com.cn/zsml/queryAction.do


使用的库:

requests,bs4,pandas


这些库统一可以使用pip进行统一安装

pip install requests

pip install bs4

pip install pandas


安装完之后我们便可以进行信息的爬取了

首先,我们去考研网上查看一下网站的头部信息:

640?wx_fmt=png


使用开发者模式,在请求里面找到请求头部的信息。

我们需要把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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png



下面我们来获取一个学校的网址:

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")


这样我们就可以获取所有的学校的考研专业的数据啦!

640?wx_fmt=png

640?wx_fmt=png

对于北京的一些大学,就有近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

点击阅读原文可直达。


喜欢的可以点个赞。



640?wx_fmt=gif

“扫一扫,获取更多信息”


文章来源: blog.csdn.net,作者:敲代码的灰太狼,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/tongtongjing1765/article/details/100581918

(完)