有一段时间没有使用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火车票查询与抢票相关推荐

  1. python实现火车票查询_python实现12306火车票查询器

    12306火车票购票软件大家都用过,怎么用Python写一个命令行的火车票查看器,要求在命令行敲一行命令来获得你想要的火车票信息,下面通过本文学习吧. Python火车票查询器 接口设置 先给这个小应 ...

  2. python作业火车票订购系统_Python实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  3. python作业火车票订购系统_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都具体给共享出来.(注重使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  4. python实现火车票查询_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  5. python查询12306余票_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  6. 12306火车票查询api调用文档

    在即将到来的双十二,在聚合数据平台上的12306火车票查询api将参与活动,首先我们将分享下12306火车票查询api代码文档及返回示例,可查询实时火车票余票,包括车次.车次始发站.车次终点站.出发时 ...

  7. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...

  8. Java Jsp+Servlet+mysql实现的火车票查询预定系统(管理员/普通用户 功能:火车票查询、订票付款退票改签、火车票信息管理、线路管理、站点管理等)

    博客目录 JSP火车票预定查询系统 实现功能截图 技术点总结 代码 写在最后 JSP火车票预定查询系统 本系统是一套模拟12306网站的火车票一站式操作系统,普通用户可以查询.添加.改签火车票等,管理 ...

  9. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇

    项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...

最新文章

  1. 【upc5020】 Knight
  2. [git]git相关
  3. loj10200. 「一本通 6.2 练习 3」Goldbach's Conjecture
  4. ArcGIS升级地理数据库
  5. 请不要再使用判断进行参数校验了
  6. 花了两天时间为我的引擎实现了性能分析的界面显示
  7. ElasticSearch预警服务-Watcher详解-Schedule配置
  8. rocketmq 同步双写
  9. FFMPEG安装与视频格式flv转换mp4
  10. iphone 如何运行android,黑科技,如何在iPhone手机上运行安卓系统!
  11. 小技巧 - 同步苹果手机和 Windows 的提醒事项
  12. Java虚拟机(JVM)的类加载机制LLI
  13. UVA - 10041 Vito's Family
  14. 光伏箱变测控装置的工作原理
  15. 2022年”泰迪杯“数据分析技能赛B题:银行客户忠诚度分析
  16. 以下未发布-Android的多线程以及异步消息处理机制,android移动开发基础案例教程源码
  17. 快手坐拥3亿用户,想成为平行世界里的Snapchat,然后呢
  18. 网络代理(Proxy)
  19. 在线教育直播平台有哪些分类?你知道吗?
  20. MySQL数据库驱动包在eclipse中的导入

热门文章

  1. 华硕X44H本本维护纪实
  2. springboot大学生兼职网站开发与设计毕业设计源码311734
  3. Windows Update Downloader:系统补丁离线打
  4. 培训班出来的人后来都怎么样了?(三)
  5. 仿腾讯手机管家火箭发射案例
  6. 内网渗透 | FRP代理工具详解
  7. Windows命令行连接远程数据库
  8. python爬取肯德基KFC全国门店2021-01-11
  9. 手机突然电量消耗很快_手机突然耗电量大是怎么回事?
  10. 微软股价创新高,突破300美元!我入职后,股票翻了10倍!