用Python抢过年的火车票附源码


Posted in Python onDecember 07, 2015

前言:大家跟我一起念,Python大法好,跟着本宝宝用Python抢火车票

首先我们需要splinter

安装:

pip install splinter -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

然后还需要一个浏览器的驱动,当然用chrome啦

下载地址:

http://chromedriver.storage.googleapis.com/index.html?path=2.20/

根据下载的自己的电脑系统选择下载包,我的windows就用win32了

解压后直接放到C:\Windows\System32目录下,你当然也可以给这个驱动程序弄个环境变量。

注意:我下的驱动版本是2.19的,根据自己需要下载相应版本,我的2.20版本有报错

首先简单的测试一下吧,推荐ipython代替python自带的交互界面

from splinter.browser import Browser
b = Browser(driver_name="chrome")
b.visit("http://www.baidu.com") ###注意不要去掉http://

然后牛刀小试一下吧,用百度搜索一些东西。比如splinter
在上面我们已经打开百度的网址了

 然后我们输入一些像搜索的内容吧

用Python抢过年的火车票附源码

由上可以发现,该输入框的name=wd,通过fill似乎只能通过name填充

官方说明: Fill the field identified by ``name`` with the content specified by ``value``.

那就在输入框搜索splinter,当然也可以输入中文,但是最好指定Unicode编码,如u”我”

b.fill("wd","splinter")

有意思的事,你会发现你都不需要点击“百度一下”就到搜索页面了

但是,如果多次搜索,我们还是需要点击“百度一下”的

下面就不在带着大家找这些元素的id,value什么的了,通过chrome的F12找自己需要的吧

那么把点击栏find出来吧

我们发现,百度搜索栏的value=”百度一下”,id=”su”

所以把这个按钮提取出来

button = b.find_by_value(u"百度一下")
或者
button = b.find_by_id(u"su")

怎么点击呢?简单如下

button.click()

这有什么用?

我们找找页面里有没有我想找的东西吧,比如找找有没有这个地址“splinter.cobrateam.info”

b.is_text_present("splinter.cobrateam.info")

如果该页面存在,则返回True,反之亦然

怎么退出呢?

b.quit()

好吧,上面就是参照官方文档写的一个简单的入门教程了,下面我们进入正题吧~~~
个人是觉得授人以鱼不如授人以渔的,所以我尽量讲解所有的内容,而非发个代码,让大家copy一下,然后不求甚解。
值得注意的是,我不会去说什么怎么破解验证码以及有什么漏洞可以利用什么的,抢过票的都知道,快一点是一点,而我要做的是就能将机器能做的交给机器做,比如点击,查询,选择等,所以希望必中的还是绕过此文吧。笔者水平也就这么一点点。

首先我们用ipython讲解一下思路

开始当然是导入啦。。

from splinter.browser import Browser
b = Browser(driver_name="chrome")
url = “https://kyfw.12306.cn/otn/leftTicket/init”
b = Browser(driver_name="chrome")
b.visit(url)

第一步手动登陆,能通过下面的代码填充表单,但是我跳不过验证码,暂时没有精力去研究那东西,多多见谅,所以还是等手动选择验证码的。

b.find_by_text(u"登录").click()
 b.fill("loginUserDTO.user_name","xxxx")
b.fill("userDTO.password","xxxx")

第二部选择出发地点日期等

通过cookies选择出发地点,日期及目的地

首先瞧瞧我们的cookies当然是没有的出发日期什么的

至于你的出发地点及目的地对于的cookies值是什么,就得靠自己去copy了,我帮不了

 用Python抢过年的火车票附源码

怎么有的这些值?

先将地点日期输进去查询一下,然后chrome按F12  找到这一部分即可

打开浏览器跳到这个页面当然是没有我们需要的信息的,比如下面这样

b.cookies.all()
{u'BIGipServerotn': u'1977155850.38945.0000',
 u'JSESSIONID': u'0A01D97598F459F751C4AE8518DBFB300DA7001B67',
 u'__NRF': u'95D48FC2E0E15920BFB61C7A330FF2AE',
 u'current_captcha_type': u'Z'}

然后我们需要添加出发地,这个得自己去查了,是简单的url加密

b.cookies.add({"_jc_save_fromStation":"%u4E0A%u6D77%2CSHH"})

添加出发日期

b.cookies.add({"_jc_save_fromDate":"2016-01-20"})

添加目的地

b.cookies.add({u'_jc_save_toStation':'%u6C38%u5DDE%2CAOQ'})

注:如果是修改的话,还是调用add方法,如果传入的字典key值已存在则替换

比如,将目的地改为其他地方xxxx,如下即可

b.cookies.add({u'_jc_save_toStation':'xxxxxx'})

然后在看看现在的cookies值

b.cookies.all()
{u'BIGipServerotn': u'1977155850.38945.0000',
 u'JSESSIONID': u'0A01D97598F459F751C4AE8518DBFB300DA7001B67',
 u'__NRF': u'95D48FC2E0E15920BFB61C7A330FF2AE',
 u'_jc_save_fromDate': u'2016-01-20',
 u'_jc_save_fromStation': u'%u4E0A%u6D77%2CSHH',
 u'_jc_save_toStation': u'%u6C38%u5DDE%2CAOQ',
 u'current_captcha_type': u'Z'}

既然cookies已经准备完毕,reload一下,开始查询吧

b.reload()
b.find_by_text(u"查询").click()

是不是发现,地点日期都填上了,很酷有木有

到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。
值得说明的是,上面的步骤都能手工完成。

下面我们需要用组合BeautifulSoup来判断预订可不可以点,当然你也可以选择单点某一趟

反正我只想买高铁的,既然这样,下面两种方法,一是单点一趟,而是轮循着点很多趟,不放过任何机会。

先说第一个方法吧,这个比较简单,不需要用到其他库,单用splinter就够了,就先从简单的说起吧。

 用Python抢过年的火车票附源码

从我自己坐的火车线路来看,一共六趟,我只想做高铁,那么我一直点高铁的那一趟预订是不是就够了,当然是!!
一共六个预订,我的预订在第二个,索引值自然在1了啦。(会python的不会问我为什么的吧!!!)

b.find_by_text(u"预订")[1].click()

然后如果预订成功

应该跳转到选择乘客的位置,

我们就需要按需选择乘客了

用Python抢过年的火车票附源码

b.find_by_text(u"你的姓名")[1].click()

然后第一种方法基本讲解完毕。
上面的步骤摞在一起其实不过100行。
然后应该有第三种方法,就是利用默认的自动查询,默认是5秒刷新一次,但是大家都知道,春运期间5秒的区间太长了,怎么办呢?

Chrome的F12一下,点击Console

用Python抢过年的火车票附源码

输入autoSearchTime=xxx

默认是毫秒为单位也就是说,默认5000ms,但是不要修改太小,会被侦测到然后报网络繁忙!!!我改成1000ms似乎只能刷十到十五次就报网络繁忙了。

其实,用Python刷票也是为了,没抢到,把刷新页面定向抢票的进程挂起,我们就不用时时刻刻去刷了,至于源码,留驱动都在下面的链接了~~代码还有很多不足,以及写的不够优雅,大家可以参考一下,根据实际情况随便修改~留下的邮箱应该都发完了,一个个发真的发不过来~~

需要源码的朋友可以点击下载了:http://pan.baidu.com/s/1gdTu7cR

Python 相关文章推荐
python2.7到3.x迁移指南
Feb 01 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Python实现决策树C4.5算法的示例
May 30 Python
python读取LMDB中图像的方法
Jul 02 Python
Python基于百度云文字识别API
Dec 13 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
使用python实现回文数的四种方法小结
Nov 24 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
Django多个app urls配置代码实例
Nov 26 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 Python
Python随手笔记之标准类型内建函数
Dec 02 #Python
python抓取网页中图片并保存到本地
Dec 01 #Python
利用Python学习RabbitMQ消息队列
Nov 30 #Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 #Python
python基础知识小结之集合
Nov 25 #Python
python 多线程实现检测服务器在线情况
Nov 25 #Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 #Python
You might like
PHP分页显示制作详细讲解
2006/12/05 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
php实现异步数据调用的方法
2015/12/24 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
Python人脸识别初探
2017/12/21 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
jupyter 添加不同内核的操作
2021/02/06 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
实习会计求职自荐信范文
2014/03/10 职场文书
人代会标语
2014/06/30 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS