解析爬虫12306购票系统流程

做爬虫也将近有一年的时间,本人不是什么名牌大学毕业,但是对计算机的热爱无人能挡。大学学了Java语言,大四来到帝都实习找了一份Java偏数据的实习工作,工作的过程中第一次接触到了爬虫的工作,并且感觉爬虫挺有意思。从知道爬虫到某些网购平台,新闻网页等文本数据的抓取,再到登录系统做查询实时数据,再到解析验证码,以至于前两天完成12306购票系统的爬虫。完成购票系统爬虫之后自我感觉有点膨胀,但是这点小小的膨胀被我强大的内心所束缚,以至于低调的写了这篇博客,哈哈……。

这个博客写的内容是针对于当前12306版本写的,只要整理完全现在立马就能买票。2017.5.25日

在做爬虫的一年的时间里做过很多系统的注册、登录、查询等。以至于在做购票爬虫的时候不是特别困难。

事先声明,这次研究爬虫购票,纯属学习,绝对不会用于商业,如果有志同道合的盆友童鞋们欢迎一起研究哈。


据新闻说,2017春节购票时历史以来最为艰难的一年,票都去哪了?据媒体报道商业黄牛使用假身份证证件10分钟钞杀1000多张票的新闻,原来如此,越来越多的黄牛加入其中,让外出打工的人们,在外的游子们感觉到买票回家难,最后不得不拿高价买黄牛手中的票回家。其实我想说使用技术的眼光去看待问题,也是可以达到四两拨千斤的效果。

再次声明,本篇博客,纯属学习,绝对不会用于商业,如果有志同道合的盆友童鞋们欢迎一起研究。

下面开始分享一下我是以怎样一个思路去做的,首先使用抓包工具先抓下购票过程的每一个链接,通过对每一步请求每一个链接都认真仔细分析后,查询余票需要实时监控请问量比较大最好别登录账号,减少不必要的麻烦,一旦发现有余票,程序调用登录程序,登录成功在调用购票程序。所以我的博客决定按照查询,登录,订票的顺序来写。

  • 1.查询余票

首先访问12306查询余票首页https://kyfw.12306.cn/otn/leftTicket/init
然后访问js页面https://kyfw.12306.cn/otn/leftTicket/log?leftTicketDTO.train_date=2017-06-20&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT访问时request.requestbody 要带上leftTicketDTO.train_date(发车日期;20xx-0x-xx);leftTicketDTO.from_station(出发站代码);leftTicketDTO.to_station(目的站代码);purpose_codes(乘客类型,ADULT成人,STUDENT学生) 这些参数。

返回结果
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"messages":[],"validateMessages":{}}

返回结果json中 “status”:true, 代表请求成功。
下面请求(查询车票链接)https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-06-20&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT访问时request.response 要带上leftTicketDTO.train_date(发车日期;20xx-0x-xx);leftTicketDTO.from_station(出发站代码);leftTicketDTO.to_station(目的站代码);purpose_codes(乘客类型,ADULT成人,STUDENT学生) 这些参数。
返回结果:这里只是其中一趟火车的信息。

"hBu8r%2BRJBF8wdG5sTYoxcJrR7lRev0Kb5SQzQ9mw8PFJK%2BdTid5mcXTFbrMCgHamBIw%2BxUlWJlQ8%0AWwe6sp0W8299q%2BHS1pWT8CI5My77rJp5AYbDbBdYAwCaWDKH9zbPfXZSXFOYE3lxqbVej2SYKNKT%0And7e93T4NKjGU86uKPP%2B1e0kXZfah5N%2FbBxBSOHYbTOWAj%2FN7Z6nt3WxzAc%2FDHOxWOUPIjCEXagd%0AlBZwonkBTG0y4ELRMg%3D%3D|预订|330000K5980T|K599|BTC|GZQ|BXP|ZZF|05:14|14:04|08:50|Y|Pm%2Bh1NV7CkWcA%2FWq%2BY69ecqgnHzi70S6ccm9xPpyQvEZ7igwpAyvCcmVrcM%3D|20170619|3|C1|09|22|0|0||||无|||1||11|无||||10401030|1413",

hBu8r%2BRJBF8wdG5sTYoxcJrR7lRev0Kb5SQzQ9mw8PFJK%2BdTid5mcXTFbrMCgHamBIw%2BxUlWJlQ8%0AWwe6sp0W8299q%2BHS1pWT8CI5My77rJp5AYbDbBdYAwCaWDKH9zbPfXZSXFOYE3lxqbVej2SYKNKT%0And7e93T4NKjGU86uKPP%2B1e0kXZfah5N%2FbBxBSOHYbTOWAj%2FN7Z6nt3WxzAc%2FDHOxWOUPIjCEXagd%0AlBZwonkBTG0y4ELRMg%3D%3D
这串字符是火车的信息,在后面提交订单的时候就是提交这段字符。这段字符是随机生成的,过几秒就回失效。
解释一下:
330000K5980T 是列车编号
K599是车次
BTC是始发站包头
GZQ是终点站广州
BXP是北京
ZZF是郑州
05:14是发车时间
14:04到达时间
08:50是路程时间
Y是当前车次是否可购票Y是可以N是不可以
20170619 火车始发站时间
3是硬卧(1是硬座,2是软座,3是硬卧,4是软卧,O是高铁二等座,M是高铁一等座)
后面都是各种座位的票数信息

对于提到的列车站点代码,可以通过请求https://kyfw.12306.cn/otn/resources/js/framework/station_name.js链接,通过得到JS脚本中的station_names变量获取,对应的站点以@字符分隔。

  • 2.登录

请求登录页面:https://kyfw.12306.cn/otn/login/init

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值