接下來,我們將實現(xiàn)微信朋友圈的爬取。
如果直接用 Charles 或 mitmproxy 來監(jiān)聽微信朋友圈的接口數(shù)據(jù),這是無法實現(xiàn)爬取的,因為數(shù)據(jù)都是被加密的。而 Appium 不同,Appium 作為一個自動化測試工具可以直接模擬 App 的操作并可以獲取當(dāng)前所見的內(nèi)容。所以只要 App 顯示了內(nèi)容,我們就可以用 Appium 抓取下來。
1. 本節(jié)目標(biāo)
本節(jié)我們以 Android 平臺為例,實現(xiàn)抓取微信朋友圈的動態(tài)信息。動態(tài)信息包括好友昵稱、正文、發(fā)布日期。其中發(fā)布日期還需要進行轉(zhuǎn)換,如日期顯示為 1 小時前,則時間轉(zhuǎn)換為今天,最后動態(tài)信息保存到 MongoDB。
2. 準(zhǔn)備工作
請確保 PC 已經(jīng)安裝好 Appium、Android 開發(fā)環(huán)境和 Python 版本的 Appium API。Android 手機安裝好微信 App、PyMongo 庫,安裝 MongoDB 并運行其服務(wù),安裝方法可以參考第 1 章。

對于初學(xué)者想更輕松的學(xué)好Python開發(fā),爬蟲技術(shù),Python數(shù)據(jù)分析,人工智能等技術(shù),給大家分享一套系統(tǒng)教學(xué)資源,加Python技術(shù)的學(xué)習(xí)裙;九三七六六七五零九,免費領(lǐng)取。學(xué)習(xí)過程中有疑問,群里有專業(yè)的老司機免費答疑解惑!
3. 初始化
首先新建一個 Moments 類,進行一些初始化配置,如下所示:

這里實現(xiàn)了一些初始化配置,如驅(qū)動的配置、延時等待配置、MongoDB 連接配置等。
4. 模擬登錄
接下來要做的就是登錄微信。點擊登錄按鈕,輸入用戶名、密碼,提交登錄即可。實現(xiàn)樣例如下所示:

這里依次實現(xiàn)了一些點擊和輸入操作,思路比較簡單。對于不同的平臺和版本來說,流程可能不太一致,這里僅作參考。
登錄完成之后,進入朋友圈的頁面。選中朋友圈所在的選項卡,點擊朋友圈按鈕,即可進入朋友圈,代碼實現(xiàn)如下所示:

抓取工作正式開始。
5. 抓取動態(tài)
我們知道朋友圈可以一直拖動、不斷刷新,所以這里需要模擬一個無限拖動的操作,如下所示:

我們利用 swipe() 方法,傳入起始和終止點實現(xiàn)拖動,加入無限循環(huán)實現(xiàn)無限拖動。
獲取當(dāng)前顯示的朋友圈的每條狀態(tài)對應(yīng)的區(qū)塊元素,遍歷每個區(qū)塊元素,再獲取內(nèi)部顯示的用戶名、正文和發(fā)布時間,代碼實現(xiàn)如下所示:

這里遍歷每條狀態(tài),再調(diào)用 find_element_by_id() 方法獲取昵稱、正文、發(fā)布日期對應(yīng)的元素,然后通過 get_attribute() 方法獲取內(nèi)容。這樣我們就成功獲取到朋友圈的每條動態(tài)信息。
針對日期的處理,我們調(diào)用了一個 Processor 類的 date() 處理方法,該方法實現(xiàn)如下所示:

這個方法使用了正則匹配的方法來提取時間中的具體數(shù)值,再利用時間轉(zhuǎn)換函數(shù)實現(xiàn)時間的轉(zhuǎn)換。例如時間是 5 分鐘前,這個方法先將 5 提取出來,用當(dāng)前時間戳減去 300 即可得到發(fā)布時間的時間戳,然后再轉(zhuǎn)化為標(biāo)準(zhǔn)時間即可。
最后調(diào)用 MongoDB 的 API 來實現(xiàn)爬取結(jié)果的存儲。為了去除重復(fù),這里調(diào)用了 update() 方法,實現(xiàn)如下所示:

首先根據(jù)昵稱和正文來查詢信息,如果信息不存在,則插入數(shù)據(jù),否則更新數(shù)據(jù)。這個操作的關(guān)鍵點是第三個參數(shù) True,此參數(shù)設(shè)置為 True,這可以實現(xiàn)存在即更新、不存在則插入的操作。
最后實現(xiàn)一個入口方法調(diào)用以上的幾個方法。調(diào)用此方法即可開始爬取,代碼實現(xiàn)如下所示:

這樣我們就完成了整個朋友圈的爬蟲。代碼運行之后,手機微信便會啟動,并且可以成功進入到朋友圈然后一直不斷執(zhí)行拖動過程??刂婆_輸出相應(yīng)的爬取結(jié)果,結(jié)果被成功保存到 MongoDB 數(shù)據(jù)庫中。
6. 結(jié)果查看
我們到 MongoDB 中查看爬取結(jié)果,如圖 11-46 所示。

可以看到朋友圈的數(shù)據(jù)就成功保存到了數(shù)據(jù)庫。
?結(jié)語
以上內(nèi)容是利用 Appium 爬取微信朋友圈的過程。利用 Appium,我們可以做到 App 的可見即可爬,也可以實現(xiàn)自動化驅(qū)動和數(shù)據(jù)爬取。但是實際運行之后,Appium 的解析比較煩瑣,而且容易發(fā)生重復(fù)和中斷。如果我們可以用前文所說的 mitmdump 來監(jiān)聽 App 數(shù)據(jù)實時處理,而 Appium 只負(fù)責(zé)自動化驅(qū)動,它們各負(fù)其責(zé),那么整個爬取效率和解析效率就會高很多。