python爬取考研网的信息

今天我们使用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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181203G0P99H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券