使用Python神器对付12306变态验证码


Posted in Python onJanuary 05, 2016

临近春节,三水点靠木小编带领大家用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自带的交互界面

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

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

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

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

使用Python神器对付12306变态验证码

由上可以发现,该输入框的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神器对付12306变态验证码

怎么有的这些值?

先将地点日期输进去查询一下,然后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'})

以上内容给大家介绍了使用Python神器对付12306变态验证码,希望本文分享能够帮助到大家。

Python 相关文章推荐
python自带的http模块详解
Nov 06 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
Python实现多线程的两种方式分析
Aug 29 Python
python将一组数分成每3个一组的实例
Nov 14 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
Django和Flask框架优缺点对比
Oct 24 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python中HTMLParser模块知识点总结
Jan 25 Python
python实现学生通讯录管理系统
Feb 25 Python
Python文件的操作示例的详细讲解
Apr 08 Python
Python聊天室实例程序分享
Jan 05 #Python
详解Python Socket网络编程
Jan 05 #Python
菜鸟使用python实现正则检测密码合法性
Jan 05 #Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 #Python
Python实现控制台进度条功能
Jan 04 #Python
python实现网站的模拟登录
Jan 04 #Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 #Python
You might like
缅甸的咖啡简史
2021/03/04 咖啡文化
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
jquery随意添加移除html的实现代码
2011/06/21 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
Python中tell()方法的使用详解
2015/05/24 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python re模块findall()函数实例解析
2018/01/19 Python
Django数据库表反向生成实例解析
2018/02/06 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
如何让python的运行速度得到提升
2020/07/08 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
成绩单家长评语大全
2014/04/16 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
中秋节晚会开场白
2015/05/29 职场文书
银行资信证明
2015/06/17 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis