使用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使用pil生成缩略图的方法
Mar 26 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
Python代码实现KNN算法
Dec 20 Python
Python实现全排列的打印
Aug 18 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
python+pygame实现坦克大战
Sep 10 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
django跳转页面传参的实现
Sep 17 Python
python的scipy.stats模块中正态分布常用函数总结
Feb 19 Python
Python中三种花式打印的示例详解
Mar 19 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
php 动态多文件上传
2009/01/18 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
深入分析PHP引用(&)
2014/09/04 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
javascript工具库代码
2012/03/29 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
js单例模式详解实例
2013/11/21 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python之文字转图片方法
2018/05/10 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python 通过文件夹导入包的操作
2020/06/01 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
经典的班主任推荐信
2013/10/28 职场文书
学校门卫管理制度
2014/01/30 职场文书
投标诚信承诺书
2014/05/26 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
2015年检验科工作总结
2015/04/27 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS