Python接口抓取12306火車票信息
最近在講解接口測試,然後就拿12306網站來開刀,現在稍微大型一點的網站都是走接口,分佈式部署,三層架構等等的。
既然要做接口,首先就需要抓取接口服務器已經入參;
Chrome瀏覽器的F12功能就凸顯出來了,我們先看看12306是如何來查詢火車票信息的。打開瀏覽器開發者工具,切換到network頁面,然後在12306選擇廣州-長沙,點擊查詢;
可以看到station_name.js英文稍微溜一點的,都能猜測到這個是火車站站點名稱。好吧,我們複製全路徑,然後在瀏覽器中打開,如下圖:
果然我們看到了帝都是排名第一的,並且每個站點以@分隔,站點詳細信息以|切割;例如;
@bjb|北京北|VAP|beijingbei|bjb|0
小寫的英文是用來快速檢索的,有時候我們在框裡面輸入拼音就能自動化檢索到所有同名的火車站信息。大寫的VAP是標識符,用來標準每個站點的,因為全國存在很多拼音同名的城市(szb 可以是深圳北 也可以是蘇州北),鐵老大出瞭如此的招數。
得到了url,https協議,那麼採用urllib2的庫手動寫一個get方法;
然後根據get方法,服務器返回的數據,我們還需要寫一個解析的方法;根據地名來解析對應的城市code編碼,如下;
城市編碼已經獲取出來,那麼接下來就是查詢車次,魚票等等的數據,我們刷新一個12306網頁,抓取網絡信息看看有什麼信息吧;
我們點擊一下這個紅色的鏈接查看請求信息吧(紅色是入參);
切入到response頁面,查看服務器返回數據,原來是json格式的;
找到這個實際的接口地址(https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-05-05&leftTicketDTO.from_station=GZQ&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT),我們在瀏覽器中去打開查看,果然看到全部的車次了;
查看數據,跟字典很像啊,而且還有列表,字典嵌套字典,列表嵌套字典,複雜嗎?那就寫一個解析函數來慢慢解析唄,一層層的剝開你的心。。。。。。
代碼如下:
最後我們需要拼接參數地址,