100行Python代码实现自动抢火车票(附源码)


Posted in Python onJanuary 11, 2018

前言

又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool。下面话不多说了,来一起看看详细的介绍吧。

先准备好:

  • 12306网站用户名和密码
  • chrome浏览器及下载chromedriver
  • 下载Python代码,来自网络整理 [点击下载 |  本地下载 ]

代码用的Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互。

Splinter官网:http://splinter.readthedocs.io/en/latest/。

Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL。然后你所开发的模拟的任何行为,都会自动完成,你只需要坐在电脑面前,像看电影一样看着屏幕上各种动作自动完成然后收集结果即可。

了解原理:

找到相应URL,找到控件模拟登录、查询、订票操作。关键是找到控件名称,难点是起始地不是直接输入的页面值,需要在cookie中查出。

12306查询URL: https://kyfw.12306.cn/otn/leftTicket/init

12306登录URL: https://kyfw.12306.cn/otn/login/init

我的12306URL: https://kyfw.12306.cn/otn/index/initMy12306

购票确认URL: https://kyfw.12306.cn/otn/confirmPassenger/initDc

Python代码打开URL,找到控件填充值:

def login(self):
  self.driver.visit(self.login_url)
  # 填充用户名
  self.driver.fill("loginUserDTO.user_name", self.username)
  # 填充密码
  self.driver.fill("userDTO.password", self.passwd)
  print u"等待验证码,自行输入..."

100行Python代码实现自动抢火车票(附源码)

找到用户名密码控件名

100行Python代码实现自动抢火车票(附源码)

找到起始地控件名

确定起始地的值,方法Chrome浏览器中的“检查”功能(按F12),Network ---> Cookies中找到:

100行Python代码实现自动抢火车票(附源码)

cookie中起始地的值

拷贝起始地的cookie值,我把几个常用的城市拷出来,放到了字典中:

cities= {'成都':'%u6210%u90FD%2CCDW',
'重庆':'%u91CD%u5E86%2CCQW',
'北京':'%u5317%u4EAC%2CBJP',
'广州':'%u5E7F%u5DDE%2CGZQ',
'杭州':'%u676D%u5DDE%2CHZH',
'宜昌':'%u5B9C%u660C%2CYCN',
'郑州':'%u90D1%u5DDE%2CZZF',
'深圳':'%u6DF1%u5733%2CSZQ',
'西安':'%u897F%u5B89%2CXAY',
'大连':'%u5927%u8FDE%2CDLT',
'武汉':'%u6B66%u6C49%2CWHN',
'上海':'%u4E0A%u6D77%2CSHH',
'南京':'%u5357%u4EAC%2CNJH',
'合肥':'%u5408%u80A5%2CHFH'}

查询车票代码:

print u"购票页面开始..."
   # 加载查询信息
   self.driver.cookies.add({"_jc_save_fromStation": self.starts})
   self.driver.cookies.add({"_jc_save_toStation": self.ends})
   self.driver.cookies.add({"_jc_save_fromDate": self.dtime})
   self.driver.find_by_text(u"查询").click()

其实,你只需要运行代码:

python tickets.py 上海 广州 2018-02-05

当然,还需要手动点一下的还是万恶的12306验证码,抢到票后确认支付就行啦。

100行Python代码实现自动抢火车票(附源码)抢票进行中

100行Python代码实现自动抢火车票(附源码)

抢票成功!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python进阶教程之文本文件的读取和写入
Aug 29 Python
跟老齐学Python之关于类的初步认识
Oct 11 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python3多线程操作简单示例
May 22 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
Python使用字典的嵌套功能详解
Feb 27 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
python 安装impala包步骤
Mar 28 Python
Python可视化学习之matplotlib内置单颜色
Feb 24 Python
python实现外卖信息管理系统
Jan 11 #Python
Python实现学生成绩管理系统
Apr 05 #Python
名片管理系统python版
Jan 11 #Python
Python学生成绩管理系统简洁版
Apr 05 #Python
Python实现学校管理系统
Jan 11 #Python
Python实现GUI学生信息管理系统
Apr 05 #Python
使用python 爬虫抓站的一些技巧总结
Jan 10 #Python
You might like
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
对python生成业务报表的实例详解
2019/02/03 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
python扫描线填充算法详解
2020/02/19 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
Overload和Override的区别
2012/09/02 面试题
教职工代表大会主持词
2014/04/01 职场文书
药剂专业求职信
2014/06/20 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
python实现股票历史数据可视化分析案例
2021/06/10 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
i7 6700处理器相当于i5几代
2022/04/19 数码科技
索尼ICF-36收音机评测
2022/04/30 无线电
关于mysql中string和number的转换问题
2022/06/14 MySQL