• UID12
  • 登录2016-06-14
  • 粉丝112
  • 关注50
  • 发帖1415
  • 主页
  • 金币8548枚
社区居民
最爱沙发
忠实会员
喜欢达人
原创写手
极分享 发布于2015-12-07 11:30
7/13566

用程序员的姿势抢过年的火车票

楼层直达

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

 

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

 

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

 

 

 

 

 

 

from splinter.browser import Browser

  

= Browser(driver_name="chrome")

  

b.visit("http://www.baidu.com")  ###注意不要去掉http://

 

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

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

 

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

wKioL1ZfvQDT-UqpAAB42MSWUfo592.png 

由上可以发现,该输入框的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

  

= Browser(driver_name="chrome")

  

  

url = “https://kyfw.12306.cn/otn/leftTicket/init”

  

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

wKioL1ZfvYLQ6MkGAAEsWAESOls486.png 

 

怎么有的这些值?先将地点日期输进去查询一下,然后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'})

 

然后在看看现在的cookies值

 

b.cookies.all()

 

{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一下,开始查询吧

 

b.reload()

b.find_by_text(u"查询").click()

是不是发现,地点日期都填上了,很酷有木有

 

到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。

值得说明的是,上面的步骤都能手工完成。

 

下面我们需要用组合BeautifulSoup来判断预订可不可以点,当然你也可以选择单点某一趟

 

反正我只想买高铁的,既然这样,下面两种方法,一是单点一趟,而是轮循着点很多趟,不放过任何机会。

 

先说第一个方法吧,这个比较简单,不需要用到其他库,单用splinter就够了,就先从简单的说起吧。

wKioL1ZfveHSfWCjAADq2GKCOMQ635.png 

 

从我自己坐的火车线路来看,一共六趟,我只想做高铁,那么我一直点高铁的那一趟预订是不是就够了,当然是!!一共六个预订,我的预订在第二个,索引值自然在1了啦。(会python的不会问我为什么的吧!!!)

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

 

然后如果预订成功 应该跳转到选择乘客的位置,我们就需要按需选择乘客了

wKioL1ZfvfGTYc4pAAD49OWsYig532.png 

 

 

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

然后第一种方法基本讲解完毕。上面的步骤摞在一起其实不过100行。

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

wKioL1Zfvi_je3LwAAAsBXlJ44s184.png 

 

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

 

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

 

源码:http://pan.baidu.com/s/1gdTu7cR

 

驱动:http://pan.baidu.com/s/1pJGOx55

 

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

 

本文出自 :又耳的笔记本

出处:http://youerning.blog.51cto.com/10513771/1719159


0人打赏
  • UID1267
  • 登录2016-12-07
  • 粉丝0
  • 关注1
  • 发帖4
  • 主页
  • 金币26枚
社区居民
夏洛特 发布于2015-12-07 15:04
沙发F
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2015-12-07 15:12
板凳F
不错 不错
  • UID929
  • 登录2016-04-25
  • 粉丝1
  • 关注0
  • 发帖46
  • 主页
  • 金币165枚
社区居民
viniluo 发布于2015-12-07 21:25
地板F
感谢大神
  • UID2031
  • 登录2016-01-04
  • 粉丝0
  • 关注0
  • 发帖5
  • 主页
  • 金币19枚
社区居民
MiracleKill 发布于2015-12-28 16:57
4楼F
  • UID2335
  • 登录2015-12-31
  • 粉丝0
  • 关注0
  • 发帖13
  • 主页
  • 金币1枚
发布于2015-12-31 11:49
5楼F
太好了          啊
  • UID3764
  • 登录2016-05-09
  • 粉丝0
  • 关注0
  • 发帖3
  • 主页
  • 金币8枚
单恋爱好者 发布于2016-01-12 15:39
6楼F
  • UID1690
  • 登录2017-02-15
  • 粉丝1
  • 关注6
  • 发帖101
  • 主页
  • 金币185枚
社区居民
原创写手
lalalala 发布于2016-01-25 16:54
7楼F
不错哟。。。。
。。(●—●)。。我是萌萌哒的签名挡。。(●—●)。。游戏源码分享(●—●)(●—●)
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 79397/378   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 45296/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 44990/0   Python爬虫:常用浏览器的useragent

  • 41473/260   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 38683/145   省时省力的Android组件群来了,非常棒的原型参考

  • 30061/142   2016抢红包软件及源码

  • 29293/2   超全!整理常用的iOS第三方资源

  • 29289/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 24354/160   Android版类似UC浏览器:非常赞,产品级的源码

  • 22868/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22566/25   Android工程师面试题大全

  • 22492/27   2016程序员跳槽全攻略

  • 21953/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20910/20   码魂:程序员的牛B漫画

  • 19063/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 19051/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 19018/10   2016年最全的Android面试考题+答案 精编版

  • 18920/42   一个绚丽的loading动效分析与实现!

  • 18765/3   吐槽那些程序员的搞笑牛逼注释

  • 17640/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17633/1   iOS 动画总结

  • 17510/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 17470/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 17148/23   个人收集的Android 各类功能源代码

  • 16688/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16618/21   Android福利第三波【Android电子书】

  • 16438/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16418/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 16404/10   女程序员的梦,众网友的神回复

  • 16363/0   iOS中文版资源库,非常全

  • 16341/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16094/11   年会上现场review代码是怎么样的体验!

  • 16042/23   珍藏多年的素材,灵感搜寻网站

  • 15524/18   65条最常用正则表达式,你要的都在这里了

  • 14853/15   基于Android支付宝支付设计和开发方案

  • 14258/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14189/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13970/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13719/0   GitHub iOS 库和框架Top100 

  • 13671/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 13566/7   用程序员的姿势抢过年的火车票

  • 13522/7   一张图搞定iOS学习路线,非常全面

  • 13149/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13107/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12998/18   一张图搞定Android学习路线,非常全面

  • 12810/29   【持续更新中】Android福利贴(一):资料源码

  • 12745/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12490/4   46 个非常有用的 PHP 代码片段

  • 12013/3   即时通信第三方库

  • 11452/8   流媒体视频直播方案

  • 11382/18   八个最优秀的Android Studio插件

  • 11256/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11046/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 11031/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10952/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10226/6   开箱即用!Android四款系统架构工具

  • 10016/10   十大技巧快速提升Android应用开发性能

  • 9973/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9919/1   Android性能优化视频,文档以及工具

  • 9808/0   基于node-webkit跨平台应用案例集之(一)

  • 返回顶部