用Python抢枪过年的火车票

简介:

前言:大家跟我一起念,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自带的交互界面

 

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


然后牛刀小试一下吧,用百度搜索一些东西。比如splinter

在上面我们已经打开百度的网址了

 

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

wKioL1ZfvQDT-UqpAAB42MSWUfo592.png 

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

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

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

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


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

 

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

 

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

那么把点击栏find出来吧

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

所以把这个按钮提取出来

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

 

1
2
怎么点击呢?简单如下
button.click()

 

这有什么用?

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

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

 

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

 

怎么退出呢?

1
b.quit()


 

好吧,上面就是参照官方文档写的一个简单的入门教程了,下面我们进入正题吧~~~

个人是觉得授人以鱼不如授人以渔的,所以我尽量讲解所有的内容,而非发个代码,让大家copy一下,然后不求甚解。

值得注意的是,我不会去说什么怎么破解验证码以及有什么漏洞可以利用什么的,抢过票的都知道,快一点是一点,而我要做的是就能将机器能做的交给机器做,比如点击,查询,选择等,所以希望必中的还是绕过此文吧。笔者水平也就这么一点点。

 

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

 

 

开始当然是导入啦。。

1
2
3
4
5
6
7
8
9
10
from  splinter.browser  import  Browser
  
=  Browser(driver_name = "chrome" )
  
  
url  =  “https: / / kyfw. 12306.cn / otn / leftTicket / init”
  
=  Browser(driver_name = "chrome" )
  
b.visit(url)

 

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

 

1
2
3
4
5
b.find_by_text(u "登录" ).click()
  
  b.fill( "loginUserDTO.user_name" , "xxxx" )
  
b.fill( "userDTO.password" , "xxxx" )


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

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

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

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

wKioL1ZfvYLQ6MkGAAEsWAESOls486.png 

 

怎么有的这些值?

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

 

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

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


 

1
2
3
4
5
6
7
8
9
10
11
12
然后我们需要添加出发地,这个得自己去查了,是简单的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

1
b.cookies. all ()
1
2
3
4
5
6
7
{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一下,开始查询吧

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

 

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

 

到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。

值得说明的是,上面的步骤都能手工完成。

 

 

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

 

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

 

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

 

wKioL1ZfveHSfWCjAADq2GKCOMQ635.png 

 

从我自己坐的火车线路来看,一共六趟,我只想做高铁,那么我一直点高铁的那一趟预订是不是就够了,当然是!!

一共六个预订,我的预订在第二个,索引值自然在1了啦。(python的不会问我为什么的吧!!!)

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

 

然后如果预订成功

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

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

wKioL1ZfvfGTYc4pAAD49OWsYig532.png 

 

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

然后第一种方法基本讲解完毕。

上面的步骤摞在一起其实不过100行。

然后应该有第三种方法,就是利用默认的自动查询,默认是5秒刷新一次,但是大家都知道,春运期间5秒的区间太长了,怎么办呢?

ChromeF12一下,点击Console

wKioL1Zfvi_je3LwAAAsBXlJ44s184.png 

 

输入autoSearchTime=xxx

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


 

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

所谓源码:http://pan.baidu.com/s/1gdTu7cR


驱动:http://pan.baidu.com/s/1pJGOx55


最后希望,大家都能买到火车票回家过年~~~



本文转自 youerning 51CTO博客,原文链接:http://blog.51cto.com/youerning/1719159


相关文章
|
4月前
|
JSON 开发工具 数据格式
基于Python开发的火车票分析助手(源码+可执行程序+程序配置说明书+程序使用说明书)
基于Python开发的火车票分析助手(源码+可执行程序+程序配置说明书+程序使用说明书)
|
9月前
|
数据采集 机器学习/深度学习 NoSQL
Python 抢火车票神器,支持候补抢票
Python 抢火车票神器,支持候补抢票
|
9月前
|
数据采集 机器学习/深度学习 NoSQL
火车票被秒光,别慌!快用Python来抢票!
火车票被秒光,别慌!快用Python来抢票!
|
12月前
|
Python
python火车票动车高铁票分析助手源码
python火车票动车高铁票分析助手源码
174 0
|
Web App开发 数据可视化 程序员
智能化时代你还在手动刷新浏览器抢火车票?那你就真的Out了!假期快来了,冰河提前放大招,教你如何使用Python脚本自动抢火车票
如果我们手动登陆12306网站,登录时需要输入用户名与密码,然后需要输入蛋疼的验证码,然后选择起、始站,时间,车次类型,点击查询,再选择车次,乘客,提交订单。如果按照这样的手动操作下来,票早已经没有了!!
142 0
|
9天前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
14 1
|
5天前
|
测试技术 调度 索引
python编程中常见的问题
【4月更文挑战第23天】
17 2
|
5天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
|
5天前
|
机器学习/深度学习 数据挖掘 算法框架/工具
Python:编程的艺术与魅力
Python:编程的艺术与魅力
17 3