一、前言:
小紅書的爬蟲主要是從搜索入手,爬取某個關鍵詞下的所有筆記,通過調研發現有有兩個渠道,第一個是 App,第二個小程式,先說小程式端,通過抓包發現,每篇文章對應著一個 auth-sign ,這個引數應該有小程式內部生成,無法獲取到,有種思路就是可以通過按鍵精靈或者 Mitmproxy 獲取到每篇筆記的 auth-sign ,然后就可以通過介面去爬,這中間還需要一個自動化控制手機工具;再來說 App 端,需要有好幾個加密引數 sign\token\shield,之前git上面還有大神維護著一個服務器可以破解簽名,現在已經失效了,App 逆向暫時還沒學(已提上日程),所以還是用手機端的自動化測驗工具來爬,主要軟體有Appium和Airtest,Appium 坑比較大,不僅安裝麻煩而且除錯時極不方便,再者獲取不到小紅書筆記的詳情頁的頁面結構,本文主要講下使用 Airtest + Mitmproxy 進行手機端的爬蟲,這兩者加起來,可以解決90%的 App 爬蟲吧,除了淘寶...但可以用Pypeteer,
二 、Airtest
Airtest 是一個跨平臺的、 **基于影像識別 **的UI自動化測驗框架,適用于游戲和App,支持平臺有Windows、Android 和 IOS,主要撰寫語言為 python,官網 -> 點我, 官方檔案 -> [點我] ,基本使用可以看下青南大佬的blog -> [點我]
Airtest與Appium相比最大的優點是可以實時的看到頁面的動態,而且支持影像識別進行點擊等操作
三、使用Airtest自動化控制App
前期的使用可以在Airtest自帶的IDE中除錯,畢竟邊操作邊看到界面是非常方便地,等成熟之后搬到pycharm中執行再考慮作定時任務等
四、Airtest基本[Api]使用:
- 獲取元素:
ls = poco(name="com.xingin.xhs:id/aj8") 通過name獲取ls = poco(text=item.get_text()) 通過textpoco("android.widget.LinearLayout").offspring("com.xingin.xhs:id/ak6") 通過目錄樹
- 點擊元素:
x.click() - 獲取文本:
x.get_text() - 滑動螢屏:
swipe([0.5, 0.8], [0.5, 0.7]) 從一個點到另一個點 - 是否存在:
x.exist() - 安卓ADB操作:
from airtest.core.android.adb import ADB
adb = ADB(serialno='OF9SBMY59D69756L')
?
# 原始 adb shell 命令為 adb shell input keyevent 26
adb.start_shell('input keyevent 26') # 喚醒螢屏
?
# 啟動app app包名
adb.start_shell('am start -n com.xingin.xhs/.activity.SplashActivity')
# 獲取app包名
aapt dump badging C:\Users\xx\Desktop\xiaohongshu.apk
# launchable-activity: name='com.xingin.xhs.activity.SplashActivity'
其他 API
踩的一些坑
- 官方的問題示例 能解決大部分問題 [點我]
- Airtest與pycharm中執行腳本互斥 不能同時開
- 點擊時可能會有兩種BUG出現,第一是點擊無反應,只能作容錯處理;第二是點擊內容在螢屏之外,這時需要上滑螢屏,然后再做點擊
五、Mitmproxy
mitmproxy是一個支持HTTP和HTTPS的抓包程式,類似Fiddler、Charles的功能,只不過它通過控制臺的形式操作;使用 mitmproxy 最主要是使用它的一個組件 mitmdump ,它可以通過python腳本處理回應內容,類似于Fiddler的界面抓包,但是我們可以更加方便地拿到回應資料
- 安裝 -> 點我
- 使用:
mitmdump -s mitm.py # 手機連接電腦ip:8080
# 攔截某個鏈接
if flow.request.url.startswith(detail_url):
text = flow.response.text # 獲取鏈接的回應
- 需注意每個鏈接都會經過這個方法
六、小紅書
主要邏輯:
- 進入App:
- 喚醒螢屏
adb.start_shell('input keyevent 26') - 解鎖
- 啟動APP
adb.start_shell('am start -n com.xingin.xhs/.activity.SplashActivity')
- 喚醒螢屏
- 啟動mitmproxy
mitmdump -s mitm.py - 模擬操作:
- 獲取當前界面串列頁的所有商品,點擊進入,mitm會捕獲目標鏈接,在mitm.py處理資料
- 點擊回傳有三種方法:
- 通過頁面回傳按鈕,實測按鈕會點擊無反應;
- 通過Airtest的touch影像識別方法,需將圖片放入同一路徑下;
- 點擊手機回傳鍵,推薦!
adb.start_shell('input keyevent 4')
- 通過頁面回傳按鈕,實測按鈕會點擊無反應;
- 獲取當前界面串列頁的所有商品,點擊進入,mitm會捕獲目標鏈接,在mitm.py處理資料
- 入庫
- 退出程式,鎖屏
- 補充:代碼不多,主要是模擬人操作,然后加上容錯判斷,比如
if poco(name="com.xingin.xhs:id/aon").exists() poco.wait_for_any(poco(name="com.xingin.xhs:id/al0"))
TiToData:專業的短視頻、直播資料介面服務平臺,網址: TiToData
覆寫主流平臺:抖音,快手,小紅書,TikTok,YouTube
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/234193.html
標籤:其他
上一篇:ElasticSearch 介紹、Docker安裝以及基本檢索
下一篇:抖音爬蟲教程,一文講透原理
