12306的变态验证码算得了什么?我有Python神器!

前言:大家跟我一起念,Python 大Fa好,跟着本宝宝用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:WindowsSystem32目录下,你当然也可以给这个驱动程序弄个环境变量。

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

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

1

2

3

4

5

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”我”

1

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

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

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

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

那么把点击栏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

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)

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

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了,我帮不了

怎么有的这些值?

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

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

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就够了,就先从简单的说起吧。

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

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

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

然后如果预订成功

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

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

1

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

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

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

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

Chrome的F12一下,点击Console

输入autoSearchTime=xxx

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

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

QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

时间: 2024-10-05 04:24:57

12306的变态验证码算得了什么?我有Python神器!的相关文章

12306的动态验证码变成静态

本以为这次12306的动态验证码很厉害,什么刷票软件都不行了,看了以后发现并不是很复杂,估计不出两日刷票软件又会卷土重来,开来要一个验证码很难遏制这些刷票软了. 这次换的动态验证码采用的是GIF格式在客户端输出,至于要拿到这个gif文件然后把动态图的各张图片拼凑起来就能得到完整的静态验证码,接下来就是识别静态验证码的事情了. 比如这张动态验证码 他的静态效果就是 下面是随手写的代码,有点混乱 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2

从12306网站新验证码看Web验证码设计与破解

2015年3月16日,铁路官方购票网站12306又出新招,在登录界面推出了全新的验证方式,用户在填写好登录名和密码之后,还要准确的选取图片验证码才能登陆成功.据悉,12306验证码改版后,目前所有抢票工具都已经无法登录. 多么惨绝人寰的消息,小编相信各大互联网公司都在潜心钻研新的抢票助手,来破解全新的验证码模式. 下面小编带大家看看各种验证码的设计原理及其破解方法. 首先是纯文本式验证码,是比较原始的一种. 这种验证码并不符合验证码的定义,因为只有自动生成的问题才能用做验证码,这种文字验证码都是

获取12306之类的验证码图片

就目前来看12306的图片的URL是变动的,也就是说你拿到URL后打开这个URL可以发现这个图片他不是变动的,这个图片有种简单的方法保存就是直接请求页面xpath解析出URL,将页面图片存储到指定地址即可. 还有一种截图,这种稍微好一些,因为有些网站的验证码的URL是不变的,返回的图片信息在发生变化,而且会携带set-cookie 由于我的电脑浏览器的显示的问题,实际显示出的图片会比实际尺寸要大,所以在裁剪的时候我需要手动的调整位置跟图片大小才能获得图片验证码的正确图片 from seleniu

【出售源码+定制】挑战变态验证码

此游戏可以定制,也出售源码. 新加入vip的会员,可以在入群当天(仅限当天)找涛舅舅免费索取一套!

12306 图形验证码分析

验证码是一个非常有意思的问题,它的目的是区分输入者是人还是机器,这个问题本质上是一个图灵测试(推荐电影<模仿游戏>),验证码即是一种简单高效的验证方法,由CMU的教授于2000年左右创造,后来此牛人又将零星的验证码收集起来,转化为巨大的生产力,成功将上千万篇纸质文章数字化,目前Google还用其识别门牌号,路牌等(一个神人创造了验证码,又让验证码做出了巨大贡献).12306昨天改用了图形验证码,而事实上,图形验证码已经不是新鲜事了,早在几个月钱,Google就换成了图形验证(谷歌让验证码更简单

12306 验证码代码分析

验证码是一个很有趣的问题,其目的是谁是一个人或机器输入来区分,这个问题的实质是一个图灵测试(推荐电影<模仿游戏>),验证码是一种简单而有效的验证方法,由CMU在教授2000在有关创建.后来这头牛谁又将收集零星验证码,转化成巨大的生产力.上千万篇纸质文章数字化,眼下,Google还用其识别门牌号.路牌等(一个神人创造了验证码.又让验证码做出了巨大贡献).更有甚者.想将验证码作为广告宣传栏(考虑到题库的建立成本和题量的有限性.我认为不可行).12306昨天改用了图形验证码,而其实,图形验证码已经不

12306 外包给阿里巴巴、IBM 等大企业做是否可行?

知乎上看到的,转载过来,雅俗共赏 12306首秀被骂的狗血喷头后铁道部找来IBM.阿里巴巴等大企业要解决方案,给出的条件是资金管够但是问题得解决.几大企业最后都拒绝了(其中阿里巴巴最后负责了排队系统的建设).12306开始自己尝试解决问题.他们发现市面上可以买到的成套解决方案都不足以应付春运购票负载,所以只能自己改进已有的数据库(注:其实是改用VMware SQLFire/GemFire,这里我之前理解错误).以前12306用的是小型机,发现性能严重不足,遂改用x86系统+linux平台(原平台

车牌识别及验证码识别的一般思路

http://www.pin5i.com/showtopic-22246.html 描述一下思路及算法. 全文分两部分,第一部分讲车牌识别及普通验证码这一类识别的普通方法,第二部分讲对类似QQ验证码,Gmail验证码这一类变态验证码的识别方法和思路. 一.车牌/验证码识别的普通方法 车牌.验证码识别的普通方法为: (1)      将图片灰度化与二值化 (2)      去噪,然后切割成一个一个的字符 (3)      提取每一个字符的特征,生成特征矢量或特征矩阵 (4)      分类与学习.

【Dev Club 分享】腾讯验证码的十二年

源:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578147&idx=3&sn=94a8f8f8b4a23b2429ba18bd50c4e048&chksm=84b3b1a4b3c438b28476200037170798276cf7762a115dad9e4b49afeed3151955afe7cf82c4&scene=4#wechat_redirect 内容简介:验证码的诞生就是用来对抗自动机