使用Python爬虫查询12306列车信息

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Z_Vixerunt/article/details/78398647

我们先随意设定出发地和目的地,这里选择了郑州-哈尔滨,然后打开开发者工具,再点击查询得到如下信息:
这里写图片描述

分别查看这两个结果,可以从第二个里面发现如下信息:
这里写图片描述

因为我们查询到的列车车次是六班,而这里的数据虽然是加密过的,但显示也是6组,所以我们可以断定这6组数据就是我们要爬取的列车信息。
在Headers标签内复制URL和User-Agent进行请求(由于12306的安全证书限制,所以这里需要忽略安全证书)。
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-10-31&leftTicketDTO.from_station=ZZF&leftTicketDTO.to_station=HBB&purpose_codes=ADULT
请求到的数据是json格式,简单分析后就可以很轻易的通过转化成字典得到我们需要的数据:
这里写图片描述

由于得到的result数据是由“|”隔开的,所以需要对字符串进行切割,然后判断不同信息所在的索引。这里由于数据比较多就不上传寻找的过程了,直接给结果,比如我们要查找硬座的信息,它的索引是29,如果要查询其他类型的座位只需要改动索引或者再加一些判断输出所有信息也可以(关于有座的车次,12306有的显示“有”,有的显示是具体数字,所以做了如下处理。):
这里写图片描述

至此我们就得到了2017年10月31号郑州-哈尔滨硬座有座位的车次信息了:
这里写图片描述

那如果要得到任意时间任意城市间的列车信息呢?我们继续分析Headers里面的信息
这里写图片描述

在这里我们可以发现前三个值分别是日期、出发地的城市名代号、目的地的城市名代号,由此可以自己构造URL,由于这里面的出发地和目的地不是用中文表示的,所以还需要做一些转化:http://www.pm-road.com/index.php/2014/09/01/86/
我在这里找到了对应关系,数据比较混乱需要自己提取一下,我处理完之后以字典的格式保存成了TXT文本以便查询:
这里写图片描述

然后以如下两个函数查询对应的城市码,考虑到两次查询城市码都要读取文件再做成字典比较耗时间,所以写成了两个函数,trainCode()在代码执行开始就运行完返回一个字典:
这里写图片描述

接下来就是构造URL啦,从键盘输入日期和出发地、目的地:
这里写图片描述

至此整个代码就完成啦!至于破解验证码…自动抢票..我就不会啦!可以去问大佬..从我的代码风格和渣渣手法应该能看出来我才学Python没多少天..萌新
运行一下:(别忘了这里只显示硬座的信息)
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页