現在快遞遍布生活的角角落落,一個快遞其實是信息的集合體,里面包含大量的物流信息,那能不能自己實現一個快遞查詢的小功能?答案是能的!現在也有別人整理好的快遞查詢api,比如說快遞100,可以通過它提供的API查詢各個快遞品牌的物流信息,但它的免費版本一天只能查詢100次,還需要填電子信息申請!比較麻煩!
要想擺脫這種次數的限制,那只能不用別人整理好的api。自己去各個快遞品牌公司官網上分析他們數據怎么請求的,怎么獲得到的,然后用爬蟲獲取。這里就以中通快遞為例(因為這個數據請求分析起來比較簡單,適合入門),教大家爬蟲入門。
1.數據請求分析
打開中通快遞官網,查詢一個快遞單號后它會顯示這個快遞當前的物流信息。但是僅在這個頁面,看不到它的數據到底是通過什么鏈接,做了什么操作請求過來的?這就要用到瀏覽器的開發者工具。
按F12將瀏覽器自帶的開發者工具顯示出來,選擇NetWork,然后選擇XHR這個標簽(這個標簽將會記錄ajax中的請求)。接下來再點擊左邊的查詢按鈕,會發現開發者工具XHR里面多了好多文件,這些文件就是瀏覽器通過ajax向服務器發送的請求,里面包含瀏覽器的請求頭,請求連接,請求數據,服務器的響應連接,響應數據等。
先從這些請求名字來看,其中有個叫WayBill_GetDetail的,按名字的理解來說,它應該是得到詳細的什么東東。那猜測它就是獲得詳細數據的請求,點開它來分析一下。
可以看到這個請求的請求頭headers中包含請求連接Request URL,也就是說瀏覽器是向這個鏈接發送請求的,請求方式為POST。請求的時候帶參數了么?接着往下看。
在最下面可以看到Form data 就是提交的參數billCode,參數的值就是輸入的快遞單號。當瀏覽器向鏈接發送請求的時候,會帶上這個billCode參數,那么來試一下這個請求到底獲得是什么數據。
在瀏覽器輸入剛剛那個Request URL鏈接,后面加?跟上參數billCode,會發現請求回來的是一個json字符串,里面包含這個快遞單號的所有物流信息。接下來只需對這個json解析就好。
2.代碼實現
經過簡單的url分析,拿到了真實的數據請求鏈接和鏈接參數,這樣就可以自己根據這個鏈接編碼實現數據請求。
在請求的時候為了避免被反爬蟲,需要在請求的時候加上請求頭header,里面的內容看着是不是有些熟悉?沒錯,它就是WayBill_GetDetail請求的請求頭,直接可以從瀏覽器獲取到,然后用requests.get方法請求數據。
1 def search(billCode): 2
3 url = "https://hdgateway.zto.com/WayBill_GetDetail?
4 billCode="+billCode
5
6 header = { 7 "Access-Control-Request-Headers":"x-clientcode,x-token", 8 "Access-Control-Request-Method":"POST", 9 "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
10 } 11
12 req = requests.get(url, headers = header) 13 return req.json()
這樣就拿到這個快遞的所有物流信息,接下來對這個json進行分析。從網上隨便找一個json解析工具,對這一串解析可得到如圖的有序數據,快遞物流信息都在logisticsRecord這個標簽中,每一天的物流信息組成logisticsRecord標簽中的一項,遍歷logisticsRecord,就可以得到每天的物流信息。而每一天的物流信息又包括時間,地點描述等。
簡單分析json后,開始編碼:
1 def parse_json(data): 2 logisticsRecord = data["result"]["logisticsRecord"] 3 for day in logisticsRecord: 4 for item in day: 5 date = item["scanDate"] 6 description = item["stateDescription"] 7 print(date) 8 print(description)
這里只顯示scanDate掃描時間和stateDescription狀態描述(即快遞到哪兒)主函數main:
1 if __name__ == '__main__': 2 while True: 3 print("歡迎大家來到中通郵件查詢系統") 4 print("請輸入查詢單號:") 5 num = input() 6 data = search(num) 7 parse_json(data) 8
9 n = input("還要接着查詢嘛?(y/n):") 10 if n == "n": 11 break
12 print("謝謝大家使用")
結果演示:
這里只實現了快遞查詢的關鍵代碼,即請求數據和解析json,界面有點丑陋,也不人性化。小伙伴們可以用pyqt寫一個簡單的界面,這樣使用起來更加方便。
歡迎大家關注 公眾號:ly戲說編程 免費解答學習中的問題,這里有python數據分析,爬蟲,機器學習,java基礎,java項目,html教程,css,js等等課程!還有整理的一些電子書,會不定時發放給大家!