估计很多人在填报高考自愿的时候都会难以选择学校,有自己心仪的专业,但是在网上搜了半天也不能确定填哪一所学校。如果填了录取分数线低的,那将会浪费很多分数,表示有点遗憾。如果没有录取上,那就更遗憾了… 在我们想根据专业来选择学校的时候,往往会有很多学校无法被自己根据专业搜索到,但又很适合自己,全国那么多学校,大好的机会就只能完美错过了。所以,该怎么把全国所有带有该专业的学校和往年的录取分数线一起找出来,并进行录取分数对比呢?
数据来源: 高考数据库
操作环境: win10, python3.6, jupyter notebook,谷歌浏览器(都不是必选项)
获取内容: 学校、往年的理科录取情况(最高分,平均分,最低分,最低位次, 录取批次)
实现思路:
- 获取高考数据库的数据接口
- 查询数据
技术实现讲解
1、查找高考数据库的数据接口
1.1、获取某校的高考录取情况
(1)直接搜索学校,在《XX大学高考分数线_招生信息_中国教育在线》中查看录取分数线,找到专业分数线,(也可以在官网中搜索学校),右击检查。
(2)粘贴刚才复制的链接到浏览器中看看是否存在我们需要的数据
1.2、分析其他的数据接口
我们需要的数据都在其中,但这只是一个学校的,我们要怎么查看其他学校的呢?不妨多对比一下其他学校的数据接口吧
通过对比,发现每个学校链接的id值都不同,如“贵州财经大学”的school_id=520,只需要分别传值给这个链接,就可以获取该系统所有学校的路径了,除了没有填写录取分数线的学校。除此之外,上面还有时间,从网页中可以发现它也对应了每个学校的时间,就可以根据它来查询年度。
2、查询数据
2.1、请求数据
熟悉了网页数据的结构后,就可以请求数据开始提取了,导入requests库请求数据,网页使用的是post方法请求,一定要注意请求的方法。导入time库间断请求时间,并制作请求头模拟浏览器请求数据,告诉服务器这是一个浏览器来请求数据。
import requests,time #导入库
#制作请求头
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
major = input("请查询输入专业:")
times = input("请输入查询年份(2014~2018):")
for i in range(32,968,1):#id 从32到967
url = f'https://api.eol.cn/gkcx/api/?access_token=&local_province_id=52&local_type_id=1&page=1&school_id={i}&signsafe=&size=20&uri=apidata/api/gk/score/special&year='+str(times)
time.sleep(0.1)
res = requests.post(url=url,headers=headers)
你可能会好奇为什么id是从32~968呢?因为并不是每个id都有数据,如id为“1”的结果为:
{
"code":"0000","message":"成功","data":{
"numFound":0,"item":[]},"md5":"F03C3B1E12B97478ED80E3868E2EEA94"}
通过id值测验,发现没有内容的id接口都会返回这个值
"md5":"F03C3B1E12B97478ED80E3868E2EEA94"
我们就可以通过它来过滤掉没有数据的接口,并确定id的总长度。
import requests,time
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
for i in range(1,1000):#预设学校id有999个,[ 1,1000)
url = f'https://api.eol.cn/gkcx/api/?access_token=&local_province_id=52&loc