是程序員就用Python查12306的票

12306火車票

0.環境

操做系統:Windows Python版本:3.5.2python

1.前言

當你想查詢一下火車票信息的時候,你還在上 12306 官網嗎?或是打開你手機裏的 APP? 下面讓咱們來用 Python 寫一個命令行版的火車票查看器, 只要在命令行一敲就能得到你想要的火車票信息!若是你剛掌握了 Python 基礎,這將是個不錯的小練習。 效果圖: chrome

python查詢12306火車票

2.安裝Requests庫

若你的環境中沒有requests模塊,直接使用pip安裝。瀏覽器

pip install requestsurl

注:Requests庫使用介紹詳見 https://blog.csdn.net/i_chaoren/article/details/63266154操作系統

3.代碼實現思路

首先咱們打開12306的票價查詢頁面: https://kyfw.12306.cn/otn/leftTicket/init 以chrome爲例,按下F12打開瀏覽器開發者編輯模式。隨便輸入起點終點,和開始日期,點擊查詢。.net

而後你就會看到開發者模式的network選項裏會顯示出來瀏覽器頁面加載的文件,就像下圖這樣: 命令行

python查詢12306火車票
看不出什麼?那咱們再從新點擊查詢按鈕好幾回,你會發現瀏覽器跟着你的點擊發起了好幾回查詢請求,就像下圖這樣,我這裏用紅框幫你標出來了:
python查詢12306火車票
在這些查詢請求裏,咱們找一個點進去,看看它到底請求了點什麼東西。
python查詢12306火車票
能夠看到在點擊查詢按鈕的時候,瀏覽器發起了一個名爲 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 是否是分別表明着火車出發日期,始發站,終點站?3d

咱們直接把這個url貼到瀏覽器裏看看: code

python查詢12306火車票
是否是發現了什麼?

對了,這其實裏面就包含了咱們須要的火車票信息數據!!!cdn

那咱們是否是隻要在代碼裏把咱們本身須要查詢的火車出發日期,始發站,終點站填進這個url,而後把返回的這些數據過濾一下顯示出來就好了?

可是且慢,細心的同窗會發現,from_station 和 to_station 裏面的都不是正常的中文地名,而是代號,咱們不能直接把中文地名填進url,而是須要把中文地名轉換成代號,那這個代號又是哪裏來的呢?

咱們再看這個url請求12306響應了的東西:

python查詢12306火車票

能夠在「map」裏看到,城市火車站代號和城市火車站是有一一對應的關係的,那這些一一對應的關係又是藏在哪裏的呢? 咱們點擊開發者模式的Sources選項,通過耐心查找,咱們發現了一個東西,見下圖:

python查詢12306火車票

看名字是否是以爲發現了什麼? 咱們把這個路徑寫成url貼進瀏覽器試試: https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9098

python查詢12306火車票

就這樣成功發現了全國的火車站的名字及代號對應表!!!

4.總結

因爲 12306 的接口常常變化,本文提供的代碼可能會很快過時,若是遇到接口問題,須要根據最新的接口對代碼進行適當修改才能夠完成這個應用。

好了,那如今代碼的實現思路就有了。 我來給你梳理一下:

  • 填入你須要的出行日期、始發站、終點站。
  • 將獲取到的中文始發站終點站,經過全國的火車站的名字及代號對應錶轉換成代號,再拼接成查詢url,去查詢數據。
  • 過濾並顯示查詢結果。

關注公衆號「Python專欄」,後臺回覆「12306」獲取完整代碼~

Python專欄二維碼
相關文章
相關標籤/搜索