一、 环境配置
- python3
- selenium模块,并配置使用环境
- google浏览器或者其他浏览器
安装selenium模块
pip install selenium
到淘宝镜像下chrome版本对应的chromedriver
windows环境
将chromedriver与selenium、requests等放在一起即可
或者将chromedriver放在某个路径,并配置环境变量
mac、linux环境
sudo mv /路径/chromedriver /usr/bin
如果配置好环境后运行依然报错,可以尝试以下代码1
2
3
4
5
6options = webdriver.ChromeOptions()
options.add_argument('--disable-extensions')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument("window-size=1024,768")
browser = webdriver.Chrome(options=options)
二、 实现思路及代码
1. 查询票数
https://kyfw.12306.cn/otn/leftTicket/init 直接在这个界面查询票数
- 输入地点时间
我看了网上的一些12306抢票代码,基本上都是用添加cookies的方式,来实现输入出发地、目的地、出发日,所有我也用这样方法。
出发地和目的地的编码可以在浏览器里看到,我偷懒了,先查到直接复制。
%u6F62%u5DDD%2CKCN 潢川
%u90D1%u5DDE%2CZZF 郑州 模拟点击“查询”
直接找个这个标签,然后通过click()函数实现不断刷新
把模拟点击代码放在循环里,通过time.sleep(second)可以设置程序暂停时间。必须要暂停,刷新太快可能被封ip或封账号。
下面是主要代码
1 | def refresh_order(): |
2. 登录
我这里用selenium模拟浏览器,可以直接扫码登录,或者用密码账号登录。登录时间设置为2分钟,2分钟一过会自动切换窗口开始抢票。
关于自动登录
网上很多人打码平台打码,还有人自己训练模型实现自动识别。我没有时间,所以选择一种比较的方式。(主要是穷学生一个,深度学习又不会)
3. 提交订单
有余票时就开始买了,主要代码如下
1 | def submit_order(): # 完成提交订单一系列功能 |
这个函数我并没有测试过,累了,以后再测试,有错会再修改。
4. 邮件提醒
有余票或者购票成功通过发邮件提醒一下
1 | def send_mail(notestr): # 邮箱通知 |
5. 短信提醒
到twilio注册一个账号,网上有教程,不再累述。免费的
1 | def send_message(noteStr): # 短信通知 |
三、总结与分析
一些问题
- 没有实现自动登录
- 没有实现出发地和目的地编码的自动获取
- 提交订单没有测试
- 每次查询票数时,用显示等待更好,这样减少查找不到报错的几率
- 一次只能抢一天的票
- 我设置的查询硬座和无座,其他的没有考虑内
- 还有很多功能没有实现
总的来说,这个脚本够我自己用,量身定做的。因为我现在没有那么多时间,以后会不断完善代码。一些想法
如果只想查询有没有余票,完全不用登陆,直接请求类似于这种的链接https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date=2019-02-21&leftTicketDTO.from_station=KCN&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT,会获得所有车票信息,用“|”分割。然后通过短信提醒自己,再用手机或者电脑购票。
完整源码下载
放在github上的源码