对于有爬虫基础的同学,随着学习的深入都会逐渐感觉到分析网页的重要性,12306的购票脚本对于分析网页有非常大的练习作用。
在接下来的文章,我们尝试来写一个比较完善的程序。
分析网页
12306的查票是不需要登录的,打开开发者调试工具,在这里我们刷新一下,有一个很重要的包需要抓到,然后填好出发地和目的地等信息,点击查票,余票信息就会显示。
12306抓包分析起来还是相对容易,请求数量不多。
点击图中位置,可以很快速的找到这一条查询的请求。
可以看到图中很多的乱码,是不是看着很晕,没关系,我们拖动滑动条往后看。
相信看到后面的“有”、“无”基本上就可以肯定这一条请求返回的就是余票信息。
再反过来看请求的URL,可以看到这一条请求是get请求,get请求显著的特点就是参数都是明文。我们来分析一下URL,关于参数我这里我之前的文章里面写过了,这里再写一次,已经看了的朋友可以直接跳过这一段。
https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-04-20&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT
URL里面的参数是通过“?”开始,以key = value的形式传参,多个参数使用“&”连接。拆开来看:
leftTicketDTO.train_date=2018-04-20
leftTicketDTO.from_station=BJP
leftTicketDTO.to_station=SHH
purpose_codes=ADULT
通过字面意思基本就能明白这些参数是什么,从图里方框处能快速的得到参数信息。
四个参数分别是日期,出发地,目的地,成人或学生票。
起始站和终点站都使用了简写码,那么我们该如何获得这个简写码呢?
记得之前说过要先刷新一下,有个很重要的包吗?
网站把所有的简写码都告诉我们了。
网站基本上分析完毕了,那么写代码有思路了吗?
---------------------思考时间----------------------
编写代码
1.获取车站的简写码
前面已经知道了获取简写码信息的URL,为了查询起来比较方便,这里需要构造成字典的形式。
2.构造查询余票的URL
在requests传参可以通过关键字参数params来传入。
观察数据可以看到,数据是通过“|”来隔开的,所以我们也通过“|”来分割。
由于数据比较多,我这里就以硬座为例。
硬座对应的索引值是29,其他的索引值:
#索引值
# 3车次
# 8出发时间
# 9到达时间
# 10历时
# 23软卧
# 26无座
# 28硬卧
# 29硬座
# 30二等座
# 31一等座
小结
1.还是老规矩,提供思路,不提供源码,有什么问题可以留言交流。
2.本程序的运行思路是,由用户输入出发时间,出发地,目的地,通过之前获取的字典来查询到对应的简写码,构造查询余票的URL,获取余票信息,判断是否有票,输出结果
3.下一篇文章,我们来说说12306登录和如何接入打码平台,完成自动登录。
领取专属 10元无门槛券
私享最新 技术干货