以【某程旅行】為例,講述小程式爬蟲技術

Python研究者發表於2021-07-18

大家好,我是辰哥~~~

前提:在學習本文采集小程式資料之前,相信大家都掌握了抓取資料包的技能,比如使用Mitmproxy進行抓取資料包。如果看到這裡的你還沒有掌握的話,可以參與辰哥之前的寫的一篇關於mitmproxy使用的文章(實戰|手把手教你如何使用抓包神器MitmProxy)。

本文目標:利用Mitmproxy抓取某程小程式景點資料,並實現翻頁(下一頁)迴圈爬取。

思路:

1、利用Mitmproxy抓取資料包,並進行分析

2、利用分析的結果,編寫Python程式碼進行提取資料,並進行實現下一頁採集

01、mitmproxy抓取資料包

1.啟動mitmproxy

先配置好手機的代理IP和啟動mitmproxy

在終端中啟動mitmweb

mitmweb

在瀏覽器中檢視資料包(輸入mitmweb會自動在瀏覽器中開啟網頁,如果沒有開啟的則手動輸入)

http://127.0.0.1:8081/#/flows

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等簽名加密引數(雖然本文沒有加密引數,但是技術大家可以先掌握,在遇到的時可以使用)

不會的小夥伴,感覺動手練習!!!!最後說一聲:原創不易,求給個贊!

相關文章