设为首页 收藏本站
查看: 849|回复: 0

[经验分享] 用Python抢枪过年的火车票

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-4 09:25:37 | 显示全部楼层 |阅读模式
前言:大家跟我一起念,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自带的交互界面

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




然后牛刀小试一下吧,用百度搜索一些东西。比如splinter
在上面我们已经打开百度的网址了

然后我们输入一些像搜索的内容吧
QQ截图20151204092244.png

由上可以发现,该输入框的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
10
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了,我帮不了
QQ截图20151204092527.png


怎么有的这些值?
先将地点日期输进去查询一下,然后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就够了,就先从简单的说起吧。

QQ截图20151204092257.png


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

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


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



然后第一种方法基本讲解完毕。
上面的步骤摞在一起其实不过100行。
然后应该有第三种方法,就是利用默认的自动查询,默认是5秒刷新一次,但是大家都知道,春运期间5秒的区间太长了,怎么办呢?
Chrome的F12一下,点击Console
QQ截图20151204092330.png


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


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


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


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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-147069-1-1.html 上篇帖子: tiny4412 串口驱动分析九 下篇帖子: HTTP 火车票
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表