大家好,我是辰哥~~~
前提:在學習本文采集小程式資料之前,相信大家都掌握了抓取資料包的技能,比如使用Mitmproxy進行抓取資料包。如果看到這裡的你還沒有掌握的話,可以參與辰哥之前的寫的一篇關於mitmproxy使用的文章(實戰|手把手教你如何使用抓包神器MitmProxy)。
本文目標:利用Mitmproxy抓取某程小程式景點資料,並實現翻頁(下一頁)迴圈爬取。
思路:
1、利用Mitmproxy抓取資料包,並進行分析
2、利用分析的結果,編寫Python程式碼進行提取資料,並進行實現下一頁採集
01、mitmproxy抓取資料包
1.啟動mitmproxy
先配置好手機的代理IP和啟動mitmproxy
在終端中啟動mitmweb
mitmweb
在瀏覽器中檢視資料包(輸入mitmweb會自動在瀏覽器中開啟網頁,如果沒有開啟的則手動輸入)
2.訪問小程式
開啟同程旅行小程式,點選全部景點
可以看到頁面中出現了景點列表:
3.瀏覽器中檢視資料包
上圖中紅框部分是景點列表的api介面,點選response檢視返回的資料。
02、Python解析資料包
1.分析介面
經過分析,發現該介面是沒有反爬(簽名驗證),因此通過這個介面可以直接爬取多頁資料,比如修改介面連結中的引數
引數:
page頁數
PageSize條數
CityId城市
keyword關鍵詞
...
因此通過修改page就可以獲取全部景點資料。
得知介面連結,在python中通過requests請求去獲取資料,這種方式我們都會。
import requests
### 獲取第1頁~第10頁資料
for p in range(1,11):
# 頁數
url = "https://wx.17u.cn/scenery/json/scenerylist.html?PosCityId=78&CityId=53&page="+str(p)+"&sorttype=0&PageSize=20&IsSurrounding=1&isSmallPro=1&isTcSmallPro=1&isEncode=0&Lon=113.87234497070312&Lat=22.90543556213379&issearchbytimenow=0&IsNeedCount=1&keyword=&IsPoi=0&status=2&CityArea=5&Grades=&IsSearchKeyWordScenery=1"
response = requests.get(url).json()
print(response)
今天我們用另一種方式去獲取資料,這種方式可以用於繞過介面簽名驗證的反爬,比如sign或者x-sign等簽名加密引數。
2.直接解析資料包
相信看了辰哥的這篇文章(實戰|手把手教你如何使用抓包神器MitmProxy)的讀者都知道,mitmproxy抓取的資料包,除了在瀏覽器可以檢視外,還可以編寫的python程式碼一邊抓取資料包,一邊進行解析。
先看一下python可以獲取資料包的那些資料(下圖僅寫成部分常用的)
在終端中呼叫上面的py程式碼,結果如下:
下面開始真正編寫python程式碼,將景點資料直接儲存在txt中。
在chenge.py檔案中,修改response函式部分(如上圖)
啟動程式:
mitmdump.exe -s chenge.py
api介面返回的資料前面包含了:
"state":"100","error":"查詢成功"
因此判斷響應的資料中包含這個內容說明是含有景點列表的
景點列表資料在json資料的sceneryinfo欄位中。我們將欄位(name、address、grade)的內容取出來儲存到txt檔案中,並命名為景點.txt
在小程式中向下滑動,載入更多資料,同時mitmproxy繼續抓包,對應的python程式將繼續儲存資料到txt中。
ps:這裡僅講述技術的使用,就沒有去將資料完整爬取下來,並且為了演示資料可以儲存,也暫時儲存到txt,讀者可以根據需要儲存到資料庫或者excel。
03、小結
本文目標:利用Mitmproxy抓取某程旅行小程式景點資料,並實現翻頁(下一頁)迴圈爬取。並且還講述瞭如何通過mitmproxy繞過介面簽名驗證的反爬,比如sign或者x-sign等簽名加密引數(雖然本文沒有加密引數,但是技術大家可以先掌握,在遇到的時可以使用)
不會的小夥伴,感覺動手練習!!!!最後說一聲:原創不易,求給個贊!