为了方面和节约时间,本次使用的python编译器和解释器分别为pycharm,python3.6.1RC

逢年过节
有一个神奇的网站
你一定不陌生
“12306”
是不是总抢不到票啊
是不是观察着余票最新动态
告诉你一个新技能
贼666
12306自动抢票
前方高能,请系好好全带~~

首先在买票前我们需要先确认是否有票,那么进行正常的查票,打开12306查票网站输入出发地和目的地进行搜索。

那么一般在看到这个页面的时候我们能想到的获取车次及相关信息的方式是什么呢?对于零基础的同学而言第一时间就会想到在源代码里面找,但这里事实上源代码里面根本没有相关内容,因为该请求是采用的js中ajax异步请求的方式动态加载的,并不包含在源代码里面,所以我们只能够通过抓包的方式来查看浏览器与服务器的数据交互情况,我用的是谷歌浏览器所以打开开发者工具的快捷键是
F12(crtl+alt+i),此时只要是浏览器和服务器发生数据交互都会在下面列表框显示出来,我们再次点击查询按钮。


然后我们点击查询按钮以后浏览器向服务器发起了两次请求,那么我们来通过返回值分析下那个请求才是真正获取到车次相关数据的请求,以便我们用Python来模拟浏览器操作。

第一次请求:


很明显第一次请求返回的值没有我们需要的车次信息。

第二次请求:

第二次请求里面看到了很多数据,虽然我们暂时还没看到车次信息,但是我们发现它有个特性,就是有个列表的值里面有6个元素,而刚好我们搜索出来的从西安到达州的车辆也是6条数据,所以这两者肯定有一定关系,那么我们先用Python来获取到这些数据再进行下一步分析。

# -*- coding: utf-8 -*-
import urllib2
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def getList():req = urllib2.Request('https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-07-10&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT')req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')html = urllib2.urlopen(req).read()return html
print getList()

首先定义一个函数来获取车次列表信息。
从抓包数据中获取到该请求的。
url:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-07-10&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT

为了防止被12306检测到屏蔽我们的请求那么我们可以简单的增加个头信息来模拟浏览器的请求。
url:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-07-10&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT
为了防止被12306检测到屏蔽我们的请求那么我们可以简单的增加个头信息来模拟浏览器的请求。

req.add_header(‘User-Agent’,’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36’)

其中的
ssl._create_default_https_context =ssl._create_unverified_context
是因为12306采用的是https协议,而ssl证书是它自己做的并没有得到浏览器的认可,所以Python默认是不会请求不受信任的证书的网站的,我们可以通过这行代码来关闭掉证书的验证。
那么我们先来看看能不能正常获取到我们想要的信息。

事实证明我们的操作没有问题,接下来先拿到包含有6条数据的这个列表再说。
返回的数据是json格式,但是Python标准数据类型中没有json这个类型,所以对于Python而言它就是个字符串,如果要非常方便的操作这个json我们就可以借助Python中的json这个包来把json这个字符串变成dict类型,然后通过dict的键值对操作方法把列表取出来并进行返回。

# -*- coding: utf-8 -*-
import urllib2
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
def getList():
req = urllib2.Request('https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-07-10&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
html = urllib2.urlopen(req).read()
dict = json.loads(html)
result = dict['data']['result']
return result

最终返回的是一个list数据,我们先把这个数据for出来再看看每一条数据都有些什么东西。

for i in getList():
print i
for出来之后我们先来看看第一条数据是什么样的:
|预定|76000G131805|G1318|ICW|IZQ|ICW|CWQ|07:54|18:54|11:00|N|UHESFcaIDeX22Z0zWfqttDuZXJFuWPdIa148i6TNk5spIqfp|20170710|3|W2|01|16|0|0|||||||||||无|无|无||O0M090|OM9
其实我们稍微留一下就会发现里面有包含G1318,07:54,18:54,无这样的车次信息的,只不过看起来比较乱,但是他们都有一个特点,每个数据都是由|这个符号分开的,所以我们可以通过用|分割看看能发现什么呢?
for i in getList():
for n in i.split('|'):
print n
break

可以看到所有的值都打印出来了,我们再在前面加上一个序号就能清楚到看到每个序号所对应的值到底是什么了,比如有辆火车硬座还剩3张票,软卧还剩8张票,那我们就查看哪个序号对应的值是3哪个序号对应的值是8就搞清楚了哪个序号是代表什么座次或者其他参数了。

c = 0
for i in getList():
for n in i.split('|'):
print '[%s] %s' %(c,n)
c += 1
c = 0
break
#索引3=车次
#索引8=出发时间
#索引9=到达时间

到了这里不知道同学们有没有发现一个问题,就是我用的这个函数只能够获取到从长沙到成都的数据,而别人不一定是买这个方向的火车,所以我们还得搞清楚请求的url当中的出发站和到达站的值是怎么来的?
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-07-10&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT
先找到出发站和到达站的参数分别是:

  • leftTicketDTO.from_station=CDW
  • leftTicketDTO.to_station=CSQ

然而通过查找和分析我并没有发现这两个参数有规律,那么也就是说这两个值是在之前的请求里面就已经获取到了的,通过检查网页源代码没有找到,那么又只能通过抓包的方式来找。
在抓包过程中找到了一个包的返回值是附带有各城市的代号的,url如下:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018

那么我们把这里面的城市数据复制出来单独新建一个cons.py的文件保存起来。

然后我们通过把参数做成通过输入出发城市和到达城市就可以直接在这个数据里面匹配到相应的城市代号,代码如下:

station = {}
for i in cons.station_names.split('@'):
if i:
tmp = i.split('|')
station[tmp[1]] = tmp[2]
\#print station
train_date = raw_input('请输入出发时间')
from_station = station[raw_input('请输入出发城市')]
to_station = station[raw_input('请输入到达城市')]

到这里就已经能够通过输入“时间,城市”获取相应的车次信息了

那么我们再进行一些简单的判断,就能实现检查相应的时间,地点,车次是否有余票了。同时再结合登录,购票等流程,通过自动判断是否有票,如果无票就继续刷新,直到有票之后自动登录下单后通过短信或者电话等方式全自动联系购票人手机就可以了。

利用Python抢票,攻破12306的最后一道防线相关推荐

  1. python抢票脚本好用吗_春运到了,带你用python来抢票回家!

    不知不觉,一年一度的春运抢票大幕已经拉开,想快速抢到回家的车票吗?作为程序员,这些技术手段,你一定要知道. 为了让大家更快捷更便利的抢火车票,各种各样的抢票软件应需而生,这类软件大部分都是付费抢票的机 ...

  2. 面向回家编程!GitHub标星两万的Python抢票教程”,我们先帮你跑了一遍

    来源:大数据文摘 本文约3400字,建议阅读8分钟 本文为你介绍Python抢票教程,带你回家! 盼望着,盼望着, 春节的脚步近了, 然而,每年到这个时候, 最难的, 莫过于一张回家的火车票. 据悉, ...

  3. 亲测,手把手教你用Python抢票

    亲测,手把手教你用Python抢票 原创 2015-12-10 大数据文摘 大数据文摘 关于转载授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言"机构名 ...

  4. python抢票_50 个加速包都抢不到车票,还不如这个 Python 抢票神器!

    又到了一年一度的抢票大战,本来就辛苦劳累了一年,想着可以早点订到票跟家里人团聚.所以有挺多的人,宁愿多花些钱去找黄牛买票.但今年各种抢票软件的横行,还有官方出的加速包,导致连黄牛都不敢保证能买到票.你 ...

  5. python抢票代码_GitHub标星超12K,抢票神器大更新,支持候补

    掐指一算,距离国庆黄金周还有半个月的时间!你出行的车票都抢到了吗? 图片来自 pexels 根据国务院办公厅发布的关于 2019 年部分节假日安排的通知,国庆放假安排是:10 月 1 日至 7 日. ...

  6. python编写抢座位软件_程序员硬核Python抢票教程”,帮你抢回家车票

    盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. 据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%,达到4.4亿人次,2020年铁路春运自1月10日开始 ...

  7. python自助电影售票机_手把手教你用python抢票回家过年(代码简单)

    首先看看如何快速查看剩余火车票? 当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就 ...

  8. 秀动app抢票脚本_程序员硬核quot;Python抢票教程”,帮你抢回家车票

    盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. 据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%,达到4.4亿人次,2020年铁路春运自1月10日开始 ...

  9. python抢票脚本github_GitHub标星超12K,抢票神器大更新,支持候补!

    原标题:GitHub标星超12K,抢票神器大更新,支持候补! " 掐指一算,距离国庆黄金周还有半个月的时间!你出行的车票都抢到了吗? 图片来自 pexels 根据国务院办公厅发布的关于 20 ...

最新文章

  1. 计算机程序设计员_第二届北京大工匠计算机程序设计员、网络与信息安全管理员挑战赛:一场互联网“战场”的巅峰对决...
  2. 局域网内其他电脑通过SSH访问NAT模式下的虚拟机
  3. spring2.5+struts2+hibernate+mysql
  4. 远程链接错误:这可能是由于credssp加密oracle修正
  5. centos7网卡编辑_CentOS7修改网卡为eth0
  6. 开源框架Struts:FormBean滴那些事儿
  7. ExtJS 在grid中想要取消checkbox选中的方法
  8. 802.1x客户端 linux,Gentoo Linux--校园网(802.1x)拨号认证客户端解决方案
  9. rust自我解脱_如何从婚姻的痛苦中自我解脱?
  10. 牛客网 多校3 I三角形(皮克定理)
  11. 新浪邮箱模拟登录java
  12. 怎样把PDF格式转换成可编辑的PPT幻灯片?
  13. linux改mac地址目录,Linux下如何修改网卡MAC地址
  14. 对旅游行业APP前五名(个人观点)优缺点的简析
  15. template波浪线
  16. SAR成像处理算法_CS算法_程序设计(Matlab)
  17. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别
  18. Alexa详细排名数据完成
  19. HTML5如何实现img标签中的图片根据屏幕大小显示相应部分的内容,并保证核心内容可见
  20. 《电路基础》反相运算放大器

热门文章

  1. 徐州计算机考试成绩查询,徐州高考成绩查询系统入口
  2. python 实现 Pixiv 爬虫:下载画师的所有插画
  3. 【198天】黑马程序员27天视频学习笔记【Day13-14复习脑图】
  4. OpenCV实战之人脸美颜美型(三)——人脸关键点检测
  5. 关于centos中firewalld端口相关配置
  6. 自动化测试(一)基本介绍——测试框架的分类 单元测试工具 E2E测试工具
  7. cocos保存图片到手机相册
  8. dubbo+zipkin调用链监控
  9. php常用函数(第一版)
  10. vue 项目发布显示日志