使用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连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
Python实现栈的方法
May 26 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
python中cPickle类使用方法详解
Aug 27 Python
python 多线程串行和并行的实例
Feb 22 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 Python
自学python用什么系统好
Jun 23 Python
如何卸载python插件
Jul 08 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 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中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
react 生命周期实例分析
2020/05/18 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python smallseg分词用法实例分析
2015/05/28 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
Python中拆分字符串的操作方法
2019/07/23 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
Python 解析xml文件的示例
2020/09/29 Python
大四自我鉴定范文
2013/10/06 职场文书
运动会入场式解说词
2014/02/18 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers