2015年高考转瞬即逝,转眼间我也快大四了,不由感慨。学业未成,仍需努力。
写这个脚本的原因
- 我们学校有一个高中的校友会,大家互相帮助,受益良多。每年的这个时候,校友会的同学都需要去一个个找看哪位师弟师妹录到我校了,然后就会主动去联系他们,让他们加入校友会这个大家庭。然而大家一个个问高中的师弟师妹不太科学,而高中的龙虎榜又需要开学才张贴,所以校友会的同学们的工作进展的不是很顺利。这个时候这个脚本的出来了。
- 脚本的大部分是星尘大师兄去年写的,但当初比较赶,写的比较乱,而且数据没有持久化。这样不利于校友会后续的同学们继续使用。而今年星尘大师兄毕业工作了,所以完善工作就落在我身上了。
原理
- 先说下大概思路吧。
www.5184.com/gk
里面提供了高考录取的查询接口,我们可以用Fiddler
抓包,看HTTP请求的相关参数有什么。 - 其实高中学子每个地区每个学校的考号段都是固定的,比如我们学校的就是前4位是1802,后6位也有分布规律。
- 综上,使用Python来遍历某个考号段,获取返回的数据,判断是否是所需数据,是的话保存,不是的话丢弃。
具体代码
1.首先看核心代码 HttpRequestTool.py
get_admit_result_by_number_and_birthday()
这个方法接受3个参数,number
为考号,10位的数字。birthday
为出生年月,用于5184的接口验证,相当于密码。try_time
是失败重新请求次数。这里有个注意的地方,构造请求头部的时候,一定要加上Referer
这个参数,否则5184将过滤掉这次请求。顺口吐槽下,5184的验证码其实是假的,请求的时候yzm
这个参数置空就可以了,真弱鸡啊。
这个方法会去请求5184接口,返回的数据如果是我们想要的(代码第40行进行判断 ),则按照一定格式写入到文件admit.txt
中。
2.多线程文件 ThreadPoolTool.py
在这里,大约需要进行180w次请求,如果单线程跑的话,速度太慢了。而且这还没计算上失败重连的次数,所以必须让多线程来跑。这个线程类ThreadTask
负责对每个考号进行暴力请求,循环定义好的出生年月范围进行请求。
3.入口文件 Main.py
入口方法main()
主要做的就是构造考号,然后把每个考号分配给一个线程去执行。
写在最后
到这里程序就分析完了。目前抓到了63个师弟师妹,校友会的同学就可以有方向去拉人了哈。你们快到碗里来。。。
程序不复杂。但可以借助程序,做一点小事,也是非常开心的哈。最后希望校友会越来越好,大家一起加油!
完。
##附录
源码地址在Github