1. 程式人生 > >Python介面獲取12306火車票資訊

Python介面獲取12306火車票資訊

現在稍微大型一點的網站都是走介面,分散式部署,三層架構等等的。

既然要做介面,首先就需要抓取介面伺服器已經入參;

Chrome瀏覽器的F12功能就凸顯出來了,我們先看看12306是如何來查詢火車票資訊的。開啟瀏覽器開發者工具,切換到network頁面,然後在12306選擇廣州-長沙,點選查詢;

 

Python介面獲取12306火車票資訊

可以看到station_name.js英文稍微溜一點的,都能猜測到這個是火車站站點名稱。好吧,我們複製全路徑,然後在瀏覽器中開啟,如下圖:

 

Python介面獲取12306火車票資訊

果然我們看到了帝都是排名第一的,並且每個站點以@分隔,站點詳細資訊以|切割;例如;

@bjb|北京北|VAP|beijingbei|bjb|0

小寫的英文是用來快速檢索的,有時候我們在框裡面輸入拼音就能自動化檢索到所有同名的火車站資訊。大寫的VAP是識別符號,用來標準每個站點的,因為全國存在很多拼音同名的城市(szb 可以是深圳北 也可以是蘇州北),鐵老大出瞭如此的招數。

得到了url,https協議,那麼採用urllib2的庫手動寫一個get方法;

 

Python介面獲取12306火車票資訊

然後根據get方法,伺服器返回的資料,我們還需要寫一個解析的方法;根據地名來解析對應的城市code編碼,如下;

 

Python介面獲取12306火車票資訊

城市編碼已經獲取出來,那麼接下來就是查詢車次,魚票等等的資料,我們重新整理一個12306網頁,抓取網路資訊看看有什麼資訊吧;

 

Python介面獲取12306火車票資訊

我們點選一下這個紅色的連結檢視請求資訊吧(紅色是入參);

 

Python介面獲取12306火車票資訊

切入到response頁面,檢視伺服器返回資料,原來是json格式的;

 

Python介面獲取12306火車票資訊

找到這個實際的介面地址(https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-05-05&leftTicketDTO.from_station=GZQ&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT),我們在瀏覽器中去開啟檢視,果然看到全部的車次了;

檢視資料,跟字典很像啊,而且還有列表,字典巢狀字典,列表巢狀字典,複雜嗎?那就寫一個解析函式來慢慢解析唄,一層層的剝開你的心。。。。。。

程式碼如下:

 

Python介面獲取12306火車票資訊

最後我們需要拼接引數地址,

 

Python介面獲取12306火車票資訊