用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自带的交互界面

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

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

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

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

由上可以发现,该输入框的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了,我帮不了

怎么有的这些值?

先将地点日期输进去查询一下,然后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就够了,就先从简单的说起吧。

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

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

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

然后如果预订成功

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

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

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

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

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

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

Chrome的F12一下,点击Console

输入autoSearchTime=xxx

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

其实,用Python刷票也是为了,没抢到,把刷新页面定向抢票的进程挂起,我们就不用时时刻刻去刷了,至于源码,留下邮箱吧~~~

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

时间: 2024-10-14 01:15:49

用Python抢枪过年的火车票的相关文章

python django查询12306火车票

逢年过节,想坐个高铁票,都得上12306去买票,但用过的都会发现,它会把临近站点的也筛出来了.但有时我们压根就不会考虑买到临近站点的. 另一方面,在购票高峰期,有可能你要的出发站到目的站都没有票了,这时一般我们会往前面的站买票,或者往后面的站买票,这个你就得一次次查前后都有什么站,再一步步复制去搜索有什么票,因为它会把临近站的查出来,所以你提前站的车次有可能压根就不经过你要去的目的站.还得再查多几次. 基于此,自己就想着让程序来帮忙做这件事.花了些时间,用python django框架,写了一个

python爬虫学习之用Python抢火车票的简单小程序

利用Python制作自动抢火车票小程序,过年再也不要担心没票了! 前言 每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年! 我本来想自己写一个练练手的,但是转眼一想,Python 本身最大的优势是什么,不就是有很多牛逼的人已经造好轮子了吗?你只需要知道这些轮子并会使用就行了,这样会节省你大量的精力和时间,而且站在巨人的肩膀上,会看得更远.于是我在 github 上一搜索,果然有不少抢票程序,有的是 Python2

实用chrome插件

2015年最实用的9款chrome插件 随着14年chrome浏览器的市场超过IE浏览器,chrome凭借它强劲性能和出色的使用体验真正的登上了平民级的殿堂.今天小编就为大家推荐9款自己常用的chrome插件神器. 1.非常实用的chrome新标签页---Infinity新标签页 Infinity新标签页插件是一款可以把chrome默认新标签页换成一个美观实用的infinity新标签页,不仅有简洁美观的页面,还有快速拨号,邮件提醒,天气预报,笔记功能,待办事项,壁纸,历史记录管理等. 2.Chr

《Android源码设计模式解析与实战》读书笔记(二十二)

第二十二章.享元模式 享元模式是结构型设计模式之一,是对对象池的一种实现.就像它的名字一样,共享对象,避免重复的创建.我们常用的String 就是使用了共享模式,所以String类型的对象创建后就不可改变,如果当两个String对象所包含的内容相同时,JVM只创建一个String对象对应这两个不同的对象引用. 1.定义 采用一个共享来避免大量拥有相同内容对象的开销.使用享元模式可有效支持大量的细粒度对象. 2.使用场景 (1)系统中存在大量的相似对象. (2)细粒度的对象都具备较接近的外部状态,

程序猿,你也配吃10元的盒饭?

“你也配吃10元的盒饭?”作者:yxixhdfqwe 又是一个阳光灿烂的中午,看了一上午的报纸,茶水也顺带喝了不少,肚子早已经咕咕作响了,今天中午吃点什么了,貌似楼下的新开张的盒饭还不错,于是我来到楼下准备买上一盒.   菜色还不错,价格有6元,8元,10元,12元,20元的,像哥这样的精英管理人才,怎么着也的吃最高级的才配合身份,就在我准备购买时,一个响亮的声音响起,   "老板,给我一份10元的盒饭",   顺势撇了一眼,一个小伙子,眉开眼笑的靠近盒饭铺,今天是1号,看样子是发工资

初级测试工程师必须会的(总结)

功能测试的一些心得 一.前言 功能测试是测试工程师的基础功,很多人功能测试还做不好,就想去做性能测试.自动化测试.很多人对功能测试的理解就是点点点,如何自己不用心去悟,去研究,那么你的职业生涯也就停留在点点点上了.在这里,我把我对功能测试的理解写下来. 二.功能测试所需要掌握的技能 2.1  熟练使用SQL 1.常用的 sql 语句一定会写.比如说增删改查之类. 2.了解数据库的事务.会编写存储过程.熟练常用的系统函数. 3.了解并可以进行数据库的备份.迁移.还原.镜像等操作 4.对 sql 语

春运火车票今日开售, python让你抢票快人一步

转发是对小编的最大支持 本文转自网络 2017年时间飞逝,转眼间距离2018年春节还有不到两个月的时间,离家在外的人们也已将购买回家车票的事宜提上日程.近日,中国交通报发布<2018年春运大数据>,数据显示,2018年春运旅客人数预计突破30亿人次,较上年有所增长. ... 难以想象的数据, 预示着今年春运回程和返程车票 购买难度将进一步加大... 抢购车票怕是比李白跨越"蜀道"的难度还大哦~ 今天是2018年1月3日,已经可以购买春运第一天(2月1日)的火车票了.当你想查

使用Python和Splinter实现12306火车票查询与抢票

有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西.在了解了一些技术手段,阅读了一些大神的博文后,也尝试实现了一下,代码写得粗糙,纯当娱乐,本文在Windows系统下完成.需要提到的是,抢票过程中的验证码部分只能手动完成. 首先,我需要的工具和组件有: Chrome浏览器 浏览器驱动ChromeDriver Python 3.5 Web应用测试工具Splinter Chrome浏览器可自行下

python利用selenium+requests+beautifulsoup爬取12306火车票信息

在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我们打开谷歌浏览器开发者模式找到   https://kyfw.12306.cn/otn/resources/js/framework/station_name.js    这里包含了所有城市的信息和所有城市的缩写字母.想要获取火车票信息  https://kyfw.12306.cn/otn/left