一个月前开始准备雅思考试,计划等题刷得差不多了之后,挑一场时间合适离家近的考试报名。前几天去了趟外地忘了报名的事儿,结果今天打开报名网站一看才发现已经过了八月份前三场的报名deadline,只剩29号一场。更头疼的是29号的所有考场都写着名额暂满,没有考位了。
果断百度一下,有人说每天早上六点早起开刷,怕一直刷下去键盘上花键+R两个键受不了。亲自动手不行就把这个任务outsource出去吧,结果淘宝了一下代刷考位报价几百块外加上交用户名密码,为了考个试把用户名密码身份证住址全泄漏出去,成本恐怕太高。如此只好撸撸袖子,亲自动手丰衣足食~
首先去雅思报名的网站上看了一眼。登陆http://ielts.etest.edu.cn/,点左侧的考位查询,打开Chrome的开发者工具箱,随便查了一下下个月北京的考位,在Network里抓到了JSON的URL:
http://ielts.etest.edu.cn/myHome/
心乐之,于是在JS Console里调戏了半天,但总在JS刷新过后遇到瓶颈。果断换Python,世界清爽,代码如下:
#coding=utf-8
#编码字符集
Month=\’2015-08\’
# 11: Beijing
# 44: Guangdong
Province=\’11\’
UID=\’12345678\’
#配置月份、城市和账号的UID,依照JSON URL的格式。
#月份可以查询一个月的比如 2015-08 或两个月的如 2015-08%2C2015-09
#城市代码 11是北京,44是广东
sessiondict={}
sessiondict[\’BIGipServerhw_ielts_internal_pool\’]=\'<…>\’
sessiondict[\’JSESSIONID\’]=\'<…>\’
sessiondict[\’_ga\’]=\'<…>\’
# Configure your cookie here
#因为JSON的调用需要浏览器预先登陆验证,所以这里需要配置好Cookie伪装成用户浏览器中的点击。具体的Cookie键值登录后在开发者工具里找
sessiondict[\’domain_name_edu\’]=\’ielts.etest.edu.cn\’
sessiondict[\’domain_name_net\’]=\’ielts.etest.net.cn\’
sessiondict[\’domain_port_http\’]=\’80\’
sessiondict[\’domain_port_https\’]=\’443\’
sessiondict[\’locale\’]=\’zh_CN\’
#无需配置的Cookie键
import requests
#依赖包
def getHtml(url):
user_agent = ( \’Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko/20100101 Firefox/22.0\’ )
global sessiondict
session = requests.session()
session.headers[\’User-Agent\’] = user_agent
session.headers[\”Connection\”] =\”close\”
session.cookies.update(sessiondict)
r=session.get(url)
return r.content
#function getHtml 抓取JSON
def main():
global Month
global UID
global Province
html = getHtml(\”http://ielts.etest.edu.cn/myHome/%s/queryTestSeats?queryMonths=%s&queryProvinces=%s&neeaAppId=&productId=IELTSPBT\”%(UID,Month,Province))
html=html.replace(\’null\’,\’None\’)
a=eval(html)
for each in a:
for i in a[each]:
if i[\’optStatusEn\’]==\”No Seat\”:
print \’\\033[1;37;41m \’,i[\’optStatusEn\’],\’ \\033[0m-\’,i[\’adminDate\’],\’-\’,i[\’centerNameEn\’]
else:
print \’\\033[1;37;42m\’,i[\’optStatusEn\’],\’\\033[0m-\’,i[\’adminDate\’],\’-\’,i[\’centerNameEn\’]
# function main 主函数,把结果打印在屏幕上,\\033[… 用到Console里的颜色和字体属性
main()
#程序入口,到此代码完毕
按需修改开头标志的参数之后,在终端运行python main.py即可,程序会自动返回查询的考位状态。至此还需按照自己的需求添加循环和提醒功能。循环非常简单,提醒的机制包括Sina App Engine的短信提醒、连接Weibo API发微博之类,一旦发现有考场从 No Seat 变成 Book Seat 就及时发出提醒,赶快去交钱报名。
BTW,简书吃掉Python的缩进,从这里复制的代码还需自己理清下逻辑打打Tab。
源代码已送上GitHub,在这里也可找到:
https://github.com/DuPupu/Get-IELTS-Seat-CN
最后祝大家早日抢到考位,烤鸭愉快~
下一篇:Pyhton迭代器