是程序员就用 Python 查 12306 的票!| 技术头条

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 远方的家

责编 | 胡巍巍

当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的App?

下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行一敲就能获得你想要的火车票信息!如果你刚掌握了Python基础,这将是个不错的小练习。


640?wx_fmt=png

前言


操作系统:Windows

Python版本:3.5.2

640?wx_fmt=png

效果图


640?wx_fmt=png

安装Requests库


若你的环境中没有requests模块,直接使用pip安装。

 
  

pip install requests

Requests库使用介绍详见:

  • https://blog.csdn.net/i_chaoren/article/details/63266154


640?wx_fmt=png

代码实现思路


首先我们打开12306的票价查询页面:

https://kyfw.12306.cn/otn/leftTicket/init

以chrome为例,按下F12打开浏览器开发者编辑模式。随便输入起点终点,和开始日期,点击查询。

然后你就会看到开发者模式的network选项里会显示出来浏览器页面加载的文件,就像下图这样:

640?wx_fmt=png

看不出什么?那我们再重新点击查询按钮好几次,你会发现浏览器跟着你的点击发起了好几次查询请求,就像下图这样,我这里用红框帮你标出来了:

640?wx_fmt=png

在这些查询请求里,我们找一个点进去,看看它到底请求了点什么东西。

640?wx_fmt=png

可以看到在点击查询按钮的时候,浏览器发起了一个名为

https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date=2019-03-10&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=HHC&purpose_codes=ADULT的请求。

我们来仔细看看这个URL里面,train_date,from_station以及to_station是不是分别代表着火车出发日、始发站、终点站?

我们直接把这个URL贴到浏览器里看看:

640?wx_fmt=png

是不是发现了什么?

对了,这其实里面就包含了我们需要的火车票信息数据!!!

那我们是不是只要在代码里把我们自己需要查询的火车出发日期,始发站,终点站填进这个URL,然后把返回的这些数据过滤一下显示出来就行了?

但是且慢,细心的同学会发现,from_station 和 to_station里面的都不是正常的中文地名,而是代号,我们不能直接把中文地名填进URL,而是需要把中文地名转换成代号,那这个代号又是哪里来的呢?

我们再看这个URL请求12306响应了的东西:

640?wx_fmt=png

可以在“map”里看到,城市火车站代号和城市火车站是有一一对应的关系的,那这些一一对应的关系又是藏在哪里的呢?

我们点击开发者模式的Sources选项,经过耐心查找,我们发现了一个东西,见下图:

640?wx_fmt=png

看名字是不是觉得发现了什么?

我们把这个路径写成URL贴进浏览器试试:

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9098

640?wx_fmt=png

就这样成功发现了全国的火车站的名字及代号对应表!!!


640?wx_fmt=png

总结


由于12306的接口经常变化,本文提供的代码可能会很快过期,如果遇到接口问题,需要根据最新的接口对代码进行适当修改才可以完成这个应用。

好了,那现在代码的实现思路就有了。

我来给你梳理一下:

  1. 填入你需要的出行日期、始发站、终点站。

  2. 将获取到的中文始发站终点站,通过全国的火车站的名字及代号对应表转换成代号,再拼接成查询URL,去查询数据。

  3. 过滤并显示查询结果。

作者简介:上海小胖,四大咨询的Tech Lead,MongoDB Professional获得者。「Python专栏」专注Python领域的各种技术:爬虫、DevOps、人工智能、Web开发等。还有「大航海计划」,各种内推活动。

本文系作者投稿,版权归作者所有。

免责声明:文章广告为微信自动匹配,与本平台无关,如遇假冒伪劣请联系微信进行举报。

【End】

640?wx_fmt=jpeg

 热 文 推 荐 

下过富士康工厂、做过华为外包,这位程序员是如何花 6 年逆袭成为技术大佬的?

苹果高通 5G 开战!

我是技术男,也曾创业过,也拿过风投......

身为程序员的父母,你年薪多少才能让“码二代” 不输在起跑线上

搜狗员工吐槽“统计加班时长裁人”,CEO 王小川破口大骂:“赶快滚”

漫话:如何给女朋友解释什么是系统可用性? | 技术头条

EOS现状: 72%应用涉赌被列为高危, 说好的诗和远方, 你竟沦落成了这样?

ICPC 2019国际大学生程序设计竞赛,中国高校未能夺冠

刺激!我31岁敲代码10年,明天退休!

 
  

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢

猜你喜欢

转载自blog.csdn.net/csdnnews/article/details/89078203