(伯乐在线转注:《12306验证码1次输对率8%,网友:找不到回家的路》)

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

  • 所谓源码:http://pan.baidu.com/s/1gdTu7cR
  • 驱动:http://pan.baidu.com/s/1pJGOx55

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

from:  youerning

http://python.jobbole.com/83564/

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

  1. 关于12306网站图形验证码的猜想

    以前一直以为12306的图形验证码是根据普通验证码识别规则,只不过是加上了变态的不清晰低像素图片而已. 然后F12查看了一下网络请求,它的验证码规则,远远不是我之前我想的那么简单的. 很久以前一直单纯 ...

  2. [转载]从12306谈起验证码的架构

    最近和众屌丝一样,在12306上面刷着春节回家的票.与她大战无数个回合之后,终于抢到了一张回家的高铁票,不断感慨最近人品还不错.当前,在使用12306的过程中,充满很多的心酸,念叨了铁道部的亲人很多次 ...

  3. 爬虫进阶之路---处理点触验证码(使用超级鹰API接口处理;以解决12306的图片验证码为例;)

    三大图形验证码之点触验证码 打码平台 超级鹰的使用 12306自动登录 整体代码文件 12306_selenium.py 12306_selenium.py文件代码: chaojiying.py文件代 ...

  4. 学习笔记——12306 自动通过验证码(2)

    在互联网发展的历程中,网站的验证码一直在不断的迭代更新,从最初的直接用字符作为验证码到后来的用字符生成图片,再到后来在验证码图片上加上各种各样的干扰,再到最后面的位置验证码等等,而自动验证从最初的获取 ...

  5. 12306登陆窗体验证码自动识别

    这个是12306网站更新前测试可用的,但是现在改变url之后不能获取验证码了,不过这只是时间问题,相信花点时间是可以找到新的url的,只是所有的url都要更改,比较麻烦...现在12306网站从动态验 ...

  6. 仿12306验证码 java_仿12306的图片验证码

    由于要做一个新项目,所以打算做一个简单的图片验证码. 先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个小图里面随机生成一个要用户验证的图片分类,如小狗.啤酒等. ...

  7. python验证码 识别代码不准_谈谈Python进行验证码识别的一些想法

    用python加"验证码"为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类 ...

  8. python 验证码图片 模拟登录_【python】带图片验证码的登录自动化实战

    近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...

  9. 【毕业设计】深度学习验证码识别算法研究与实现 - python 机器视觉

    文章目录 0 简介 1 数据收集 2 识别过程 3 网络构建 4 数据读取 5 模型训练 6 加入Dropout层 7 数据增强 8 迁移学习 9 结果 9 最后 0 简介

最新文章

  1. 3.7.1 读取输入
  2. sudo brew install mongodb报错
  3. OpenSSL生成自签名的sha256泛域名证书
  4. python【力扣LeetCode算法题库】46- 全排列
  5. ASP.NET MVC编程——视图
  6. C#对App.config文件或者web.config文件中节点的操作类
  7. 鸿蒙可胜安卓,【鸿蒙币谈】币圈投资中八大见顶信号,让你抓住最佳买卖机会!...
  8. 春节红包大战7年,BAT的变与不变
  9. 大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除
  10. 计算机组成原理综合题,2013计算机组成原理复习题.doc
  11. Spring 框架蕴含的设计思想
  12. NLP学习—12.Seq2Seq模型与Attention机制
  13. 一建机电实务教材电子版_一建案例学不透?新版一建机电案例一本通,6大模板案例高清讲解...
  14. C# AutoCAD图纸插入块(另一个dwg文件)
  15. 几种ARM编译器及IDE开发环境
  16. linux上挂载iso文件,如何在Linux上挂载ISO文件
  17. spark报错:java.io.IOException: Filesystem closed
  18. 数码相框_在LCD上显示英文字母、汉字的点阵显示(2)
  19. Ubuntu安装.md阅读工具-Typora
  20. Java内省用法_java内省机制及PropertyUtils使用方法

热门文章

  1. 算法题——Cantor表
  2. 哈希表(散列表)的介绍,代码实现
  3. mysql中数据类型总结_mysql数据类型总结
  4. redis之mq实现发布订阅模式
  5. sql 判断分钟是偶数数据_使用SQL交换座位(奇偶数的用法)
  6. python操作hdfs_python 操作hdfs
  7. matlab神经模糊推理系统
  8. linux clock命令,Linux中clock命令起什么作用呢?
  9. 博途v15做上位画面_1399元起!realme真我V15评测:当科技遇上国潮 越级还能这么玩...
  10. 解决MAVEN项目不扫描src下的mapper.xml文件