是程式設計師就用Python查12306的票

上海小小胖發表於2019-03-09

12306火車票

0.環境

作業系統:Windows Python版本:3.5.2

1.前言

當你想查詢一下火車票資訊的時候,你還在上 12306 官網嗎?或是開啟你手機裡的 APP? 下面讓我們來用 Python 寫一個命令列版的火車票檢視器, 只要在命令列一敲就能獲得你想要的火車票資訊!如果你剛掌握了 Python 基礎,這將是個不錯的小練習。 效果圖:

python查詢12306火車票

2.安裝Requests庫

若你的環境中沒有requests模組,直接使用pip安裝。

pip install requests

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

3.程式碼實現思路

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

然後你就會看到開發者模式的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 是不是分別代表著火車出發日期,始發站,終點站?

我們直接把這個url貼到瀏覽器裡看看:

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

對了,這其實裡面就包含了我們需要的火車票資訊資料!!!

那我們是不是隻要在程式碼裡把我們自己需要查詢的火車出發日期,始發站,終點站填進這個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專欄二維碼

相關文章