今天我们使用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'(.*? )',re.S)
content = re.findall(reg,html)
schools_url = re.findall('
.*?
',str(content))
我们使用正则表达式获取tr标签里面的内容
对于获取的内容,我们统一只获取a标签中的超链接,这就是对应的学校的网址
(.*?万能匹配表达式,匹配目标元素0次或者多次,懒惰模式)
下面我们要干的事情是获取一个学校的所有数据
拿到学校的url之后,我们可以再次通过正则表达式获取学校网站上所有的有用的内容。
response = requests.get(url,headers=self.head)
html = response.text
colleges_url = re.findall('
'target="_blank">查看',html)
下面我们通过已经获取的school_url和colleges_url去获取所有学校的数据
最后利用pandas将获取的数据转化成csv格式存储:
data = DataFrame(self.data)
data.to_csv("查询招生信息.csv",encoding="utf_8_sig")
这样我们就可以获取所有的学校的考研专业的数据啦!
对于北京的一些大学,就有近900条信息
对于自己想看哪个学校,只需要给定相应的省份编号和专业代码就可以查询。
现在我们可以优化一下代码,我们将之前的代码都封装在方法里面。
importrequests
frombs4importBeautifulSoup
frompandas.core.frameimportDataFrame
importre
importtime
classGraduate:
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
defget_list_fun(self,url,name):
"""获取提交表单代码"""
response = requests.get(url,headers=self.head)
province = response.json()
withopen("{}.txt".format(name),"w")asf:
forxinprovince:
f.write(str(x))
f.write("\n")
defget_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')
defget_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'(.*? )',re.S)
content = re.findall(reg,html)
schools_url = re.findall('.*?',str(content))
returnschools_url
defget_college_data(self,url):
"""返回一个学校所有学院数据"""
response = requests.get(url,headers=self.head)
html = response.text
colleges_url = re.findall('
'target="_blank">查看',html)
returncolleges_url
defget_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"})
forxinsummary:
temp.append(x.get_text())
self.data.append(temp)
defget_schools_data(self):
"""获取所有学校的数据"""
url ="http://yz.chsi.com.cn"
schools_url =self.get_school_url()
amount =len(schools_url)
i =
forschool_urlinschools_url:
i +=1
url_ = url + school_url
# 找到一个学校对应所有满足学院网址
colleges_url =self.get_college_data(url_)
print("已完成第"+str(i) +"/"+str(amount) +"学院爬取")
time.sleep(1)
forcollege_urlincolleges_url:
_url = url + college_url
self.get_final_data(_url)
defget_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
领取专属 10元无门槛券
私享最新 技术干货