python爬蟲入門之快遞查詢


現在快遞遍布生活的角角落落,一個快遞其實是信息的集合體,里面包含大量的物流信息,那能不能自己實現一個快遞查詢的小功能?答案是能的!現在也有別人整理好的快遞查詢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等等課程!還有整理的一些電子書,會不定時發放給大家!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM