python判断⽕车票座位_Python抢票程序优化,可以选择车次
和座次
Python抢票程序优化,可以选择车次和座次
阅读⽂本⼤概需要 5 分钟。
pk 哥在元旦前写了⼀篇关于⾃动化抢票的程序
⽤Python抢⽕车票加邮件通知,同时建了⼀个⽕车票助⼒,本来只是写着玩玩,增加抢票的另⼀种途径⽽已。没想到短短⼏天,⾥加了将近 150 名⼩伙伴,这也预⽰春节的⽕车票真是⼀票难求啊。
Python抢票程序优化,可以选择车次和座次
pk 哥写这个程序的初衷是因为去年我的返程票是通过⼿动不停的刷新点击抢到的,我想着能不能通过程序⾃动化去刷新并点击抢票,所以就有了这个 Python 抢票程序。
毕竟这个程序是 Python 模拟⼿⼯去操作浏览器的,所以会因为各种⽹络或者其他因素导致程序终⽌,⾥反馈最多的就是增加车次选择功能和座次选择功能。本⽂主要讲解这两个优化点,⾥也有很多⼩⽩也在⽤这个程序,所以本⽂会对⼀些详细的参数配置进⾏说明。
⾃动抢票流程
⾸先,梳理下本次优化后的抢票流程。
⾃动启动浏览器,⾃动化输⼊程序⾥设置好的 12306 的登录账号和密码。
⾃⼰⼿动输⼊验证码,图形验证码设别功能太复杂,涉及到⼈⼯智能的图像识别,⾃⼰做的话成功率不⾼,所以我这⾥让⼤家⼿动输⼊,输⼊验证码后⼿动点击「登录」按钮。
登录成功后页⾯会⾃动校验,确认登录成功后会⾃动跳转到查票页⾯。根据⾃⼰程序代码⾥输⼊的出发地和⽬的地进⾏查票。
根据⾃⼰输⼊的车次进⾏查询右边「预定」按钮是否⾼亮可点,不可点的话会⼀直点击「查询」按钮不断的刷新页⾯直到出现有票点击「按钮」按钮。
提交订单页⾯,选择乘客,选择座位类型,如果没有⾃⼰想要的类型,⽐如,⼆等座,页⾯会重新回到⽕车票查询页⾯,重新查询,如此循环。
抢到你想要的票后,提交订单,发送邮件,完成!
登录页⾯
这部分我把浏览器窗⼝最⼤化了,之前没设置全屏,⼤家电脑显⽰屏⼤⼩不⼀样,可能出现有些元素被遮挡⽆法点击。
登录之后可能会出现⽹络可能出现的问题的提⽰,估计是服务器的问题,这时⼿动点⼀下左上⾓的返回,⼀般就可以恢复正常,如果点⼀次还是这个提⽰,那就点两次吧。
Python抢票程序优化,可以选择车次和座次
查询页⾯
查询⽕车票页⾯,这个页⾯峰值时间时也会出现超时的提⽰,估计是访问的⼈数过多导致服务器异常导致的,有时候很快就能查到票,具体什么时候我也没到规律。
Python抢票程序优化,可以选择车次和座次
这个我们也⽆法避免,程序会⾃动的帮我们刷新直到刷新出有票的页⾯,刷新频率:1 秒/次。
车次选择功能是⼤家⽐较关⼼的功能,之前是 order = 0 默认是全部车次,这次⼤家可以根据车次的位置输⼊相应的数字,⽐如要预定的车在第 5 ⾏,你把 order = 5 就⾏,关于这些参数配置,下⾯会专门给⼤家列出来。
提交订单页⾯
提交订单页⾯程序会做两件事,第⼀个是根据你输⼊的乘客姓名进⾏选择,第⼆件事是根据是输⼊的座次进⾏判断,你想要的座次有票的话就会选择并提交订单,你想要的座次没票的话就会返回到上⼀级页⾯,重复查询车票,检查座次,如此循环,直到订到你想要的票。
Python抢票程序优化,可以选择车次和座次
邮件通知
邮件通知功能之前单独有写过⼀篇⽂章,⼤家如果不确定邮件通知功能是否有效的话可以单独把这部分源码拿出来,运⾏看看是否能发送成功,源码在回复「邮件」获取,关于邮件通知的⽂章戳这⾥查看
Python抢票程序优化,可以选择车次和座次
30⾏Python代码实现⾃动收发邮件。
重要参数修改说明
重点来了,前⾯看不懂没关系,想直接拿源码运⾏的务必仔细看这⾥,拿到抢票源码后以下事项需要注意并配置。
装修步骤
Python 环境配置
本次程序我⽤的 Python 环境是 Python 3.6 的版本,其实 3.5 以上的应该都可以。官⽹上下载 Python3 的安装包,安装时记得勾选Add Python 3.x to PATH 这个选项,勾选这个选项的好处是安装完成后它会⾃动帮你配置环境变量,不⽤像安装 Python2.x 时需要⼿动去配置。接下来都是傻⽠式安装,安装完成后终端下输⼊ Python 显⽰版本的话表⽰安装成功。还不会的话建议上⽹查查,⽹上教程很多。
Python抢票程序优化,可以选择车次和座次
pip ⼯具
pip 是通⽤的 Python 库管理⼯具,使⽤ pip 很⽅便的安装、管理库。第⼀步完成后这个 pip ⼯具是⾃带的,你可以在终端下输⼊ pip list 命令查看你当前安装的所有 Python 库。
Python抢票程序优化,可以选择车次和座次
关于黄河的俗语安装导⼊相应的库
本程序主要⽤到的库是 splinter,主要⽤这个库来驱动浏览器进⾏操作页⾯的,⽤ pip 命令直接安装。
pip install splinter
Splinter 相关的教程中⽂⽂档地址如下,如有兴趣的话可以学习⼀下。
adthedocs.io/zh/latest/tutorial.html
安装完成后在 IDE 中⽤ import 导⼊这个库,如果还不能⽤的话记得在编辑器中安装引⼊⼀下,我⽤的是 Pycharm 编辑器,在设置中引⼊安装,见下图。
Python抢票程序优化,可以选择车次和座次
Python 发送邮件需要⽤到 Python ⾃带的两个模块,smtplib 和 email。直接 import 导⼊,⽆需下载。
所以,真正需要安装的只有 splinter 库,其他直接导⼊就可⽤,在编辑器中导⼊。
from splinter.browser import Browser
from time import sleep
import smtplib
from import MIMEText
from email.utils import formataddr
from email.header import Header
浏览器驱动下载并指定路径
这个问题⼤家也出现⽐较多,为什么要下载浏览器驱动呢?因为 splinter 库的底层原理是通过 WebDriver 去驱动浏览器做相应的操作的,所以使⽤对应的浏览器必须要下载对应的浏览器驱动。我⽤的是 chrome 浏览器,所以我下载的是 chromedriver,这⾥还有个
坑,chromedriver 和 chrome 浏览器有映射关系,你必须下载对应的版本。映射关系如下,⼤家先查看你的 chrome 浏览器版本,再下载对应的 chromedriver,chromedriver 下载地址点击「阅读原⽂」可查看。(左右滑动查看全部)
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64
(Chrome 和ChromeDriver 映射表)
chromedriver 下载解压完成后把他的路径复制下来,替换源码 33 ⾏中的路径。
网上很火的伤感图片Python抢票程序优化,可以选择车次和座次
邮件通知功能设置
上⾯安装了对应的库后,需要填写的信息如下:发件⼈和收件⼈邮箱、发件⼈的授权码。所以需要修
改的位置是 sendMail 函数中的 51 ⾏和 52 ⾏的发件⼈邮箱账号和收件⼈邮箱账号,61 ⾏的发件⼈邮箱的授权码。
Python抢票程序优化,可以选择车次和座次
授权码获取⽅法参考⽂章
Python抢票程序优化,可以选择车次和座次
30⾏Python代码实现⾃动收发邮件,我⽤的发邮件的邮箱是我的⼩号 QQ 邮箱,收件⼈邮箱是我的⼤号 QQ邮箱。我试了下,QQ 邮箱⾥发件⼈和收件⼈可以是⼀样的,也就是可以⾃⼰给⾃⼰发邮件,⼤家⾃⾏选择,建议先独⽴把发邮件的代码运⾏下,查看是否发送成功,⼀般运⾏失败就是因为授权码不对造成的,重新获取⼀次授权码好了。回复「邮件」获取发邮件功能的源码。
座次对应的数值
经过调试查看,不同的座次对应的 value 值不⼀样。
工商管理学Python抢票程序优化,可以选择车次和座次
多次调试之后,我把不同座次对应的 value 值整理成了表格。
Python抢票程序优化,可以选择车次和座次
代码修改位置在源码 112 ⾏和 113 两⾏,两⾏都要改动,改动成你想要的座次对应的 value 就⾏。
低值易耗品怎么摊销12306 ⽤户名和 12306 登录密码
这两项在 main 函数中修改成⾃⼰的就⾏,把源码 114 和 145 ⾏修改成⾃⼰的即可。
车次选择
车次⽤了 order 字段来表⽰,花英t ara
0 代表所有车次,1 表⽰第⼀⾏的车次,2 表⽰第⼆⾏的车次,以此类推。⼀般你输⼊出发点和⽬的地后,所有的车次位置是固定的,你输⼊你想订的车次的位置数字即可。源码修改位置也是在 main 函数⾥,第 146 ⾏。
乘客名格式
乘客名,⽐如 passengers = ['XXX', 'XXX'],⽀持多选,注意下学⽣票需注明,注明⽅式为:passengers = ['XXX(学⽣)', 'XXX'],不然会报错,源码修改位置也是在 main 函数⾥,第 149 ⾏。
乘车⽇期格式
乘车⽇期,格式为:'2019-01-28',源码修改位置也是在 main 函数⾥,第 151 ⾏。
出发地和⽬的地 cookie 获取
这个由于时间问题,没有优化,⽬前只能⼿动去查获取出发地和⽬的地,打开⾃⼰的 12306 查询⽕车票页⾯,输⼊出发地和⽬的地。将页⾯的调试模式打开,⽤快捷键 F12 或者⿏标右键「检查」打开调试模式,选择 Network,点击「查询」按钮,这样就能获取对应出发地和⽬的地的 cookie。源码修改位置也是在 main 函数⾥,第 153 ⾏和 155 ⾏。
Python抢票程序优化,可以选择车次和座次
总结下,以上需要修改的地⽅,chromedriver 路径:在初始化函数 init ⾥⾯、邮件通知功能收发邮箱账号和发件⼈授权码在 sendMail 函数中修改、修改对应座次 value 值在 check_ticket 函数中修改、其他信息包括:12306⽤户名、12306密码、车次选择、乘客名、乘车⽇期、出发⽇期、出发地和⽬的地 cookie 值,都在源码最下⽅的 main 函数中修改。
Python抢票程序优化,可以选择车次和座次
重要说明:本程序由于时间有限,配置项也挺多的,但是为了抢到票,我们只能多尝试⼀种⽅法了,本程序是模拟⼈⼯操作浏览器,还是会存在很多问题的,⽐如说由于⽹络关系导致页⾯长时间停留从⽽不到元素⽽程序停⽌,其他各种预想不到的问题也会出现,程序停⽌的话也只能重启下程序继续抢,后期⼤家需要的话我也会慢慢优化。欢迎⼤家在抢票⾥⼀起优化讨论,毕竟我也要⼯作,个⼈时间有限。⼤家也不要把它当做唯⼀的抢票⼯具,我们还是要把其他的抢票⼯具⼀起⽤起来,所以我建⽕车票助理的⽬的也是为了让⼤家有更多的途径抢到票,回家过年,⼤家相互点点助⼒,这样抢到额概率更⼤⼀下。