使用Python和Splinter实现12306火车票查询与抢票
有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西。在了解了一些技术手段,阅读了一些大神的博文后,也尝试实现了一下,代码写得粗糙,纯当娱乐,本文在Windows系统下完成。需要提到的是,抢票过程中的验证码部分只能手动完成。
首先,我需要的工具和组件有:
- Chrome浏览器
- 浏览器驱动ChromeDriver
- Python 3.5
- Web应用测试工具Splinter
Chrome浏览器可自行下载,其浏览器驱动ChromeDriver可在以下链接找到:http://chromedriver.storage.googleapis.com/index.html?path=2.20/
在官网下载Python,选择Windows x86 executable installer,安装过程中会一同安装IDLE、pip等等,可勾选选项添加Python为环境变量(在Windows cmd下运行Python,需要设置环境变量)。安装完成后,执行:pip install splinter安装Splinter即可。
基本的配置已完成,测试一下,cmd下运行Python,分别键入以下指令:
>>> from splinter.browser import Browser
>>> b = Browser(driver_name="chrome")
>>> b.visit("http://www.qq.com")
可以创建一个基本文件,写入以上三句语句:
在执行后续操作时,需要用到Google Chrome开发者工具,按“F12”或“shift+ctrl+i”呼出。找到Elements选项卡,这里记录了当前页面每个元素的信息,如以下的搜索栏和“百度一下”按键,可选择想要查看的网页要素或位置,Elements会跳转到相应的实现代码。
搜索栏的name = “wd”,”百度一下“按键的id = “su”,在得到这一信息后,可以执行以下三步操作:
1. 输入:b.fill("wd", "splinter")
即可在搜索栏搜索splinter。
2. 输入:button = b.find_by_value(u"百度一下")
寻找该按键
3. 输入:button.click()
点击该按键
更多操作,可参考splinter的官方文档。。。
下面开始进入12306的网址进行操作:
类似于在百度页面的操作,在用户名和密码栏目中输入个人信息:
b.find_by_text(u"登录").click()
b.fill("loginUserDTO.user_name",username) # username部分输入自己的账号
b.fill("userDTO.password",passwd) # passwd部分输入账号密码
之所以说是半自动抢票,是因为在抢票之前需要手动搜集一些信息,比如手动选择一次出发地点、日期和到达地点等信息,然后F12打开开发者工具,点击Resources,找到cookies选项,可以看到下图所示的内容:
通过cookies可以看到手动选择的出发地点_jc_save_fromStation
及其值value,还有出发日期_jc_save_fromData
及目的地_jc_save_toStation
等内容。其中每个地名会对应一个独占的value,因此如果你是要刷从北京去上海的车票,需要手动先查查北京和上海分别对应的value值,并记录下来,后面有用。
接下来,执行以下指令,添加cookies信息:
b.cookies.add({"_jc_save_fromDate":"2016-01-18"}) # 此处添加出发日期
b.cookies.add({"_jc_save_fromStation":"此处添加各地名所对应的value值"}) # 此处添加出发地
b.cookies.add({u'_jc_save_toStation':'此处添加各地名所对应的value值'}) # 此处添加目的地
之后,再次刷新页面时,可以发现浏览器会自动填写之前手动填写的内容,在执行刷票时,这无疑节省了很多时间:
后续的操作也不多了,reload页面,然后寻找页面内的”查询“按钮并点击,再寻找可点击的”预订“按钮,这里有一个问题是可能出现多个班次,因此如果要操作代码去点击某个班次的”预订“按钮,也不困难,使用以下指令即可:
b.find_by_text(u"查询").click()
b.find_by_text(u"预订")[1].click() # 下标1表示买的是可选班次的第二班车
最后执行几句指令自动选取购票人,然后再手动选取验证码图片,即可完成抢票(验证码还是一道不可逾越的鸿沟)。
以上是整个流程,在完整代码中,只需再加入一些基本的循环和判断,所有这些加起来不到100行。整个过程手动输入验证码是不可避免的,除非拥有验证码的数据库,然后在这基础上做一些图像识别的算法,但这会是一个工作量较大的任务。
参考链接:http://www.jb51.net/article/75992.htm
使用Python和Splinter实现12306火车票查询与抢票相关推荐
- python实现火车票查询_python实现12306火车票查询器
12306火车票购票软件大家都用过,怎么用Python写一个命令行的火车票查看器,要求在命令行敲一行命令来获得你想要的火车票信息,下面通过本文学习吧. Python火车票查询器 接口设置 先给这个小应 ...
- python作业火车票订购系统_Python实现12306火车票查询系统
最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...
- python作业火车票订购系统_Python脚本实现12306火车票查询系统
最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都具体给共享出来.(注重使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...
- python实现火车票查询_Python脚本实现12306火车票查询系统
最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...
- python查询12306余票_Python脚本实现12306火车票查询系统
最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...
- 12306火车票查询api调用文档
在即将到来的双十二,在聚合数据平台上的12306火车票查询api将参与活动,首先我们将分享下12306火车票查询api代码文档及返回示例,可查询实时火车票余票,包括车次.车次始发站.车次终点站.出发时 ...
- python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇
项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...
- Java Jsp+Servlet+mysql实现的火车票查询预定系统(管理员/普通用户 功能:火车票查询、订票付款退票改签、火车票信息管理、线路管理、站点管理等)
博客目录 JSP火车票预定查询系统 实现功能截图 技术点总结 代码 写在最后 JSP火车票预定查询系统 本系统是一套模拟12306网站的火车票一站式操作系统,普通用户可以查询.添加.改签火车票等,管理 ...
- 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇
项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...
最新文章
- 【upc5020】	Knight
- [git]git相关
- loj10200. 「一本通 6.2 练习 3」Goldbach's Conjecture
- ArcGIS升级地理数据库
- 请不要再使用判断进行参数校验了
- 花了两天时间为我的引擎实现了性能分析的界面显示
- ElasticSearch预警服务-Watcher详解-Schedule配置
- rocketmq 同步双写
- FFMPEG安装与视频格式flv转换mp4
- iphone 如何运行android,黑科技,如何在iPhone手机上运行安卓系统!
- 小技巧 - 同步苹果手机和 Windows 的提醒事项
- Java虚拟机(JVM)的类加载机制LLI
- UVA - 10041 Vito's Family
- 光伏箱变测控装置的工作原理
- 2022年”泰迪杯“数据分析技能赛B题:银行客户忠诚度分析
- 以下未发布-Android的多线程以及异步消息处理机制,android移动开发基础案例教程源码
- 快手坐拥3亿用户,想成为平行世界里的Snapchat,然后呢
- 网络代理(Proxy)
- 在线教育直播平台有哪些分类?你知道吗?
- MySQL数据库驱动包在eclipse中的导入