阳光高考是中国高考信息网,覆盖了中国所有院校以及所有专业信息。本文目的是爬取阳光高考的专业信息,包括专业名称,专业代码,专业简介,男女比例,在校生规模,就业方向,平均薪资等。并将结果输出为CSV文件。
老规则,首先查看该网站的robots.txt。
网站禁止爬取/zzbm/tjr/目录下的内容,我们要爬取的信息不在该目录下,可以爬取。
我们要爬取的页面是
https://gaokao.chsi.com.cn/zyk/zybk/detail/73381059
这个页面包含我们需要的所有信息,在页面打开F12控制台,刷新页面,可以我们需要的所有信息都通过一个接口传输。
接口采用GET请求,URL是https://gaokao.chsi.com.cn/zyk/zybk/specialityDetail/73381059。放入Postman测试,不需要任何参数、Cookie和请求头即可获取。获取的数据为Json格式,可以利用Json解析使用。通过Json解析后,我们获取其中的’专业代码’, ‘专业名称’, ‘专业大类’,‘学科大类’,‘专业介绍’,“学生规模”,“女生占比”,“就业方向”,“平均薪资”。
这仅仅是一个专业的数据,而我们需要获取所有专业,就需要回到上一级页面:
https://gaokao.chsi.com.cn/zyk/zybk/
在这个页面中,专业是按照树形分布的,十二大学科门类包括不同专业类,不同专业类又包括不同专业,而数据传输也是按照按照树形传输。首先可以获取到所有学科门类,然后请求某一学科门类,即可获取其中的所有专业类,请求其中一个专业类,即可获取且其中的所有专业及专业代码,包括specId,也就可以获取到目标页面的url。
通过上面的分析,我们已经知道了所有专业的获取方式,接下来开始编写爬虫方法。
def getBClass():
url = "https://gaokao.chsi.com.cn/zyk/zybk/mlCategory/1050"
response = requests.get(url,headers=mHeaders).text
return response
def getLClass(key,name):
url = "https://gaokao.chsi.com.cn/zyk/zybk/xkCategory/" + key
response = requests.get(url,headers=mHeaders).text
return response
def getMajor(key,name):
url = "https://gaokao.chsi.com.cn/zyk/zybk/specialityesByCategory/" + key
response = requests.get(url,headers=mHeaders).text
return response
def getMajorDescribe(key,name):
url = "https://gaokao.chsi.com.cn/zyk/zybk/specialityDetail/" + key
response = requests.get(url,headers=mHeaders).text
return response
BClass = json.loads(getBClass())["msg"]
Res = []
for bc in BClass:
LClass = json.loads(getLClass(bc["key"],bc["name"]))["msg"]
for lc in LClass:
Major = json.loads(getMajor(lc["key"],bc["name"]))["msg"]
for mj in Major:
mDescribe = json.loads(getMajorDescribe(mj["specId"],mj["zymc"]))["msg"]
zydm = mDescribe["zydm"] #专业代码
zymc = mDescribe["zymc"] #专业名称
zydl = mDescribe["ml"] #专业大类
xkdl = mDescribe["xk"] #学科大类
xsgm = mDescribe["xsgm"] #在校学生规模
gp = mDescribe["girlPercent"] #女生占比
zyjs = mDescribe["zyjs"] #专业介绍
jy = "、".join(mDescribe["jyfx"]) #就业方向
xz = mDescribe["xcspList"]
xz_num = []
for i in xz:
xz_num.append(int(i["salary"]))
if len(xz_num) != 0:
pjxz = sum(xz_num)/len(xz_num) #平均薪资
else:
pjxz = 0
res = [zydm,zymc,zydl,xkdl,zyjs,xsgm,gp,jy,pjxz]
Res.append(res)
import pandas as pd
df = pd.DataFrame(Res, columns=['专业代码', '专业名称', '专业大类','学科大类','专业介绍',"学生规模","女生占比","就业方向","平均薪资"])
df.to_csv("专业.csv",index=False)
这次爬虫最终获取到703个专业的所有信息。当然,阳光高考官网有更为详细的信息,此次爬取仅仅作为数据分析用,以下是几个分析结果。(数据来自阳光高考,数据中存在很多空值,分析结果仅供参考)