前言
阳光高考是中国高考信息网,覆盖了中国所有院校以及所有专业信息。本文目的是爬取阳光高考的专业信息,包括专业名称,专业代码,专业简介,男女比例,在校生规模,就业方向,平均薪资等。并将结果输出为CSV文件。
Robots.txt
老规则,首先查看该网站的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)
- 将爬好的数据转为DataFrame并写入csv文件中
import pandas as pd
df = pd.DataFrame(Res, columns=['专业代码', '专业名称', '专业大类','学科大类','专业介绍',"学生规模","女生占比","就业方向","平均薪资"])
df.to_csv("专业.csv",index=False)
数据分析
这次爬虫最终获取到703个专业的所有信息。当然,阳光高考官网有更为详细的信息,此次爬取仅仅作为数据分析用,以下是几个分析结果。(数据来自阳光高考,数据中存在很多空值,分析结果仅供参考)
- 所有数据
- 所有专业中薪资排行最高的专业分别为:国民经济管理、电信工程及管理、飞行技术。
- 所有专业中女生占比最高的专业分别为:女性学、学前教育、阿尔巴尼语,服装设计与工艺教育。
- 所有专业中学生规模最多的专业分别为:汉语言文学、机械设计制造及其自动化、电气工程及其自动化。
- 薪资水平直方图,由直方图可见,大部分专业的薪资水平集中在7000左右少数有高或低的,近似呈正态分布。
结语
- 现在是2023年6月8日,是全国高考的第二天,再此祝愿所有考生金榜题名。本文对专业的分析非常客观,各位还是要凭着个人的兴趣去选择专业,只有适合自己的专业才是最好的专业!