用 Python 3 来检索中国铁路客户服务中心提供的各项数据。
- 各联网访问 API 的组件均依赖 requests。
- 如果你的 Python 版本低于 Python 3.5,则需安装标准库中新增的 typing。
- 可选装 IPython 来增强交互式终端的易用性。
provinces.py
依赖 mwclient 来读取维基百科上的条目。
-
hyfw.py
交互式查询车站的电报码、TMIS 代码、所属省级行政区等。- 请输入站名的拼音首字母,匹配方式为前方一致。
- 示例输入:
GLDS
- 示例输出:
{ZMHZ: 嘎拉德斯汰, TMIS: 13188, DBM: GLC, PYM: GLDST, SSJC: 蒙, LJDM: 00004}
- 示例输入:
- 数据来自货运运费查询页面。
- 请输入站名的拼音首字母,匹配方式为前方一致。
-
kyfw.py
解析客运车站的电报码、拼音码、拼音等。- 数据来自车票预订页面中的 station_name.js。
-
tmis.py
交互式查询车站的 TMIS 代码。- 请输入汉字站名,匹配方式为前方一致。
- 示例输入:
津沪
- 示例输出:
津沪所 10348
- 示例输入:
- 数据来自货运营业站服务信息查询页面,该接口的亮点在于可以查到线路所及不办货车站的代码。感谢维基人 N509FZ 指出此接口。
- 请输入汉字站名,匹配方式为前方一致。
-
dump.py
从以上三个接口分别读取数据,合并重复数据,并保存于本地的station_name.js
。- 发生合并冲突时,会弹出 Python Shell,以便用户准确解决。
- 输出结果已通过铁路信息查询网站呈现。
- 输出结果的格式与 12306 网站提供的
station_name.js
相同,即以@
|
作为分隔符。
-
provinces.py
读取中文维基百科各车站条目中的信息框,查询车站所属的省级行政区,以填补station_name.js
中的对应字段。 -
stations.py
启动一个 Shell,用于交互式查询上述station_name.js
(以及其他类似格式的文件)。- 启动后首先会进入 Python 解释器,退出该解释器后则会进入 SQLite 解释器。
- 由于 SQL 中不能用编号代指字段,因此表中各字段依次用 A 至 Z 的字母命名。
- 示例:中国铁路名字最短的车站是?
- 输入:
sorted(s, key=lambda i: len(i[1]))[0]
SELECT * FROM s ORDER BY LENGTH(b) ASC LIMIT 1;
- 输出:
('son', '宋', 'SOB', '57368', '黑')
- 输入:
- 思考题:请模仿港铁的站名拼词。
利国 布强格 万年 马三家 李旺 宋城路 东通化 百子湾 创业村 兴隆店
-
wifi12306.py
查询客运列车的运行时刻、交路、编组、动车组列车当日使用车底。- 请输入联网售票的客运列车车次。
-
tracking.py
查询货运车辆的类别型号、编入列车车次、当前位置、装载货物类型、发站到站等。亦可查询经由铁路运输的集装箱。- 请输入货运车辆的编号(七位纯数字)或集装箱的编号(四位大写字母,七位数字)。
-
tickets.py
启动 Python 解释器,查询两座车站之间的客运列车车次及确切的余票数量。需要登录 12306 账户。 -
trains.py
启动一个 Shell,用于交互式查询train_list.js
中记录的车次。- 示例:Z1 到 Z100 的一百个车次中,哪些车次目前闲置?
- 输入:
{'Z%d' % i for i in range(1, 101)}.difference(i[1] for i in t)
WITH range AS (SELECT 1 i UNION SELECT i + 1 FROM range WHERE i < 100) SELECT 'Z' || i FROM range EXCEPT SELECT b FROM t;
- 输出:
{'Z73', 'Z74', 'Z83', 'Z84'}
- 输入:
- 示例:哪十座车站的始发车次最多?
- 输入:
from collections import Counter distinct_trains = {i[0]: i[2] for i in t} Counter(distinct_trains.values()).most_common(10)
SELECT c, COUNT(*) AS n FROM (SELECT DISTINCT a, c FROM t) GROUP BY c ORDER BY n DESC LIMIT 10;
- 输出:
('广州南', 384) ('上海虹桥', 335) ('北京西', 242) ('北京南', 242) ('上海', 193) ('深圳北', 187) ('西安北', 180) ('北京', 175) ('成都东', 161) ('武汉', 132)
- 输入:
- 数据来自车次查询页面中的 train_list.js。
- 示例:Z1 到 Z100 的一百个车次中,哪些车次目前闲置?
-
otp.py
交互式查询某车次的正晚点信息。- 请输入车次与车站。
- 示例输入:
6419 张辛 顺义 庙城 怀柔 统军庄 密云北
- 示例输出:略
- 示例输入:
- 数据来自正晚点查询页面。
- 请输入车次与车站。
-
交路数据来自于新浪微博用户「CRH380AL动车组」编写的动车组交路查询软件。
- 在此对原作者坚持不懈的数据整理工作表示感谢。
- 运行以下各组件前,请先下载并启动上述软件。
- 由于上述软件系 Visual Basic 6.0 编写,因此交路查询相关的功能只能在 Windows 上运行。
-
截图功能依赖 Pillow。
- 建议使用默认 DPI 与 Windows 经典主题,以保证图片正确裁切;参见
mask.png
。 - 建议关闭 ClearType 使用点阵字体,以保证单色位图的清晰度。
- 建议使用默认 DPI 与 Windows 经典主题,以保证图片正确裁切;参见
-
文字的提取依赖早期版本 Windows 的特定内存结构,参见
internals.c
。- 注意,Python 3.5 及以上版本不再支持早期版本的 Windows。
- 因此,建议使用 Windows XP 虚拟机安装 Python 3.4 来运行下列组件。
-
批量查询功能依赖 12306 提供的车次数据 train_list.js。
- 因此,原软件中的少量车次因在 12306 上不存在而被遗漏,如 DJ7488 等。
-
shot.py
对单个车次进行查询,包括对动车组型号的提取及对整个窗口的截图。 -
cache.py
对 12306 上列出的所有车次进行批量查询。- 输出的截图已通过铁路信息查询网站呈现。
-
group.py
对批量查询的文本输出按照车型进行分组,并转存为 JSON 格式。- 输出结果已用于动车组交路查询浏览器扩展及动车组查询 Android 客户端。
-
web.py
基于 Flask 框架编写,响应浏览器的 HTTP 请求,动态返回截图。- 由于该方案难以应对并发查询,且依赖 Windows 服务器,目前已被抛弃,仅作为开发历史予以保留。