导读:又是一年高考季,虽然今年时间延后了,但高考以及填报志愿这些事还是跑不掉。

想想当年填报志愿时,你是否非常纠结分数线的问题,大量的分数线、录取线数据,很容易让我们感到困惑。

现在,我们可以利用Python,把想报考学校的历年分数线,以及一本、二本线的分数走势,通过图表展示出来,方便我们分析和比较!

一、Python爬取分数线的基本思路思路

确定爬取的目标站点(找网站)

分析页面结构(找数据)

制定爬取流程(定义爬虫规则)

Python编码

二、高校分数线查询

1、确定目标

首先,需要明确自己的目标。举个例子,像这个分数线查询,目标就是:

输入input: 省市区名称,高校名称,文理科数据data: 该学校/该科在该省区的历年录取最低分数线,省控线输出output: 可视化图表

然后再确定需要爬取的目标站点。通过搜索引擎查询,我们可以发现很多站点都提供分数线/高校情况的查询,我们需要根据自己的需求寻找合适自己的站点。像有些站点的数据不是很全,有些学校的信息查询不到,所以我们这里选择爬取的网站是 高考志愿填报服务平台(这里仅作举例,其他网站还有很多)。

2、分析网站页面数据

01.学校ID

以武汉理工大学为例子。通过该站点查询历年分数线,可以得到如下结果:

该页面的地址如下:

通过分析该URL可以发现,在该站点上查询某个学校的具体信息,需要获取到该

学校的ID,也就是URL中的那个数字(128)

但是这个数字是怎么得来的呢?我们接下来再深入研究一下。

我们先来到查询学校的页面,如下:

在输入框中输入武汉理工大学后,点击查询。然后你会发现URL变了,这个一目了然,是通过GET请求方式,向服务器发送需要查询的学校名称。

? 后是参数,& 分割多个参数

但是除了keyWord1这个参数有值,其他的参数都没有值,因为过滤条件我们一个都没有选择,所以参数为空。我们尝试着把其他不需要的参数去掉然后回车,发现也可以查询到结果。

这里还是没有学校的编号啊?这里要祭出程序员的大杀器了,开发者工具。以chrome浏览器为例(新版的edge浏览器也是基于chromium内核),在该页面下按

F12或者Ctrl+Shift+I

调出开发者工具,如下:

如果你的工具页面不是全屏,也不影响,通过如下图所示设置可以将开发者工具全屏显示:

点击竖形排列的三个小点

点击层叠的小按钮

Network

的tab下,你会看到,这个页面的显示,浏览器帮我们发了很多个http请求出去(上面的例子中一共发送了93个请求,在左下角显示)。下图中

3

标记的请求,则正是我们的主要的请求。

你会发现怎么查询的武汉理工大学,变成了乱码?这里涉及到编码的问题,我们暂且忽略它。

然而请求太多了,看不过来。你可以尝试把过滤选项换成XHR,如下:

有一个请求很长,我们尝试点击一下,看下它是做什么的。在右侧

General下的Request URL

中,这个请求是向**https://api.eol.cn/**发出的。并且中间也有个keyword,也有一串中文,根据前文中观察的地址,我们可以确定它就是我们查询学校ID的请求。我们把它复制出来,粘贴在浏览器中直接访问:

BINGO!!!

果然,我们获取到学校的ID了。我们可以把这个请求的多余参数去掉,精简一下。通过笔者实测,获取学校ID的最简URL是:

https://api.eol.cn/gkcx/api/?keyword=%s&uri=

apigkcx/api/school/hotlists

, %s代表你要查询的学校名称。

解决学校的ID的问题,你就成功一小半了。我们继续。

02.省控线

我们需要知道,每个省市都有一个省控线,例如一本线,二本线之类的。学校在该省区以几类本科招生,我们需要超过省控线多少分才有可能进该学校?这个问题则是本demo的初衷。废话不多说。我们来获取省控线。参考上面获取学校编号的思路,我们找到了查询省控线的URL,如下:

https://api.eol.cn/gkcx/api/?page=1&province_id=%d&size=20&uri=apidata/api/gk/score/proprovince&year=%d

这里有两个参数,一个是省的IDprovince_id, 一个是年分year。省ID通过笔者分析,如下:

03.年分

通过观察页面,发现只支持2014-2019年,应该是网站录入的数据并不能覆盖更早的年份。

04.学校线

跳回到最开始,通过武汉理工大学查询历年分数的页面,同样的通过分析请求,你会找到一个请求的响应如下:

请求的URL如下:

现在我们知道了,通过学校ID,拼接

request请求

,就可以获取到该学校的分数详情。

三、数据存盘

为什么要存储到本地数据库?

请求不易,请求过的下次就不用走网络,直接本地缓存取出。

防止请求过多被站点限制。

四、可视化

使用Python第三方库matplotlib即可,后续文章中会讲到关于Python可视化的部分。下面是效果图,查询结果以华中科技大学为例: