微信公眾號現已成為主流的一對多媒體行為活動,也是現在網際網路內容生產不可忽視的一股力量。
在此基礎上,微信公眾號爬蟲變得很有價值,對內容生產型公眾號進行數據挖掘可以得到很多有意思、有價值的信息。就我所知,可用於微信公眾號爬蟲的方式主要有以下幾種:web微信,手機客戶端抓包,搜狗微信入口,appium自動化測試,Xposed框架等。
其中,web微信只能被動接受公眾號消息,不能主動去查閱微信公眾號歷史消息。由此,可以通過itchat,wxpy等web微信庫來編寫一個機器人,實時接收微信推送,適用於需要實時更新微信推送消息的場景需求。但此方法有個弊端,首先要保證手機上自己的微信不經常斷網掉線,才能使機器人長時間在線。再者,用這些第三方庫長時間登陸或頻繁的登陸web微信,或被封號,要是微信小號很多,可以嘗試這個方法。
手機客戶端抓包,利用fiddler或charles等抓包工具,算是一個比較主流(我自己感覺的orz),效率較高的方法,可以快速的抓取微信公眾號信息和歷史消息,此方法也有弊端:cookies失效快,半天差不多的時間吧,有針對性的去抓取某幾個公眾號的歷史消息也是可以的。要想通過模擬登陸微信自動獲得cookies,好像挺難的,小弟愚鈍,無法實現,貌似微信登陸是tcp協議?
搜狗微信入口與其他相比顯得友好的多。應該是微信搜尋引擎和搜狗有合作吧,所以搜狗能有微信搜索的入口。搜狗微信有兩個類型,一是通過關鍵詞搜索文章,二是通過關鍵詞搜索公眾號,並且搜索到的微信號只能獲得其最近十條消息推送(即意味著無法通過此方法爬取指定公眾號歷史消息)。這個方法還是有一些應用場景的,比如像獲取關於某個關鍵詞的大量文章,比如做一個定時任務,或間隔一定時間去爬取某個微信公眾號最新十條推送來獲取其最新推送,這一點上,比web微信要好得多,搜狗微信的更新也是實時的,直接和mp.weixin.qq.com相關聯。
appium自動化和Xposed框架我了解不多。appium類似於selenium,在移動端做自動化測試的,模擬點擊即可。Xposed框架就有很多可以搞的了,Xposed可以在不修改apk的情況下做到一些額外的功能,爬蟲自然是可以的,除此之外可做到以自動搶紅包,自動回復機器人,修改微信步數等等騷操作。
寫爬蟲也有一段時間了,個人感覺實現爬蟲除了反反爬,爬蟲效率外,還有一個很難實現的地方就是爬蟲的穩定性,健壯性,需要考慮到很多異常情況,以及合理有效的異常處理,在這一點上,我覺得我還需要向各大爬蟲大佬學習。(感覺自己瞎扯了好多,還沒有開始我的正文(orz),感覺嫌我囉嗦的大佬請別生氣。)
利用搜狗微信寫一個爬蟲接口,代碼很簡陋,只有兩百行不到的代碼。(這裡我還得吐槽一下,python寫多了,總有一種自己很叼,編程很簡單的錯覺,幾行代碼就能實現很厲害的功能,這時候需要去寫寫CPP冷靜一下,讓自己知道什麼是真正的編程。)
以下記錄下我寫這個爬蟲接口腳本的過程:
1. 頁面請求分析(以公眾號搜索為例):
可以看到第一個http請求包就是我們想要的結果,查看其query string,如下:
看起來挺簡單的不是,我們得到以下幾個信息:
請求url為 http://weixin.sogou.com/weixin
請求類型為 Get
請求參數如上圖
發現將請求參數tyepe 改成 2,就是獲取關鍵字搜索文章的結果
比較簡單
2. 模擬頁面請求:
我們直接用 url, 請求參數params, 還有谷歌瀏覽器的 user-agent 請求,發現可以成功的獲取到我們想要頁面的源碼,接下來我們獲取搜索結果下的第一個公眾號即可(這意味著需要準確的給定公眾號名稱,太過模糊有可能獲取到與其類似的公眾號結果)。
3. 分析頁面:
先確定爬取思路,第一步獲取微信公眾號連結,再通過該微信公眾號連結獲取其最近十條推送的相關信息,包括標題,日期,作者,內容摘要,內容連結(事實上,我們發現有了微信推送連結之後就能很輕鬆的獲取其推送主體內容,但不包括點讚數和閱讀數,這幾個數據只能在微信手機端才能查看,如果有機會的話,下次記錄下自己手機微信抓包爬蟲的過程)。
於是第一步我們獲取公眾號連結:
這裡我們直接使用正則表達式提取即可(這麼簡單的就不用xpath,bs4了,依賴標準庫和第三方庫還是有所不同的。)
(抱歉被水印擋住了orz,換一張。)
第二步根據微信公眾號連結獲取最近十條推送信息:
(我只寫了一篇orz,以後多加油。)
ctlr U 查看網頁源碼,發現原始信息都放在一個js變量裡面。
好辦,繼續正則提取,將json格式的字符串轉換成python裡面的字典,有兩種辦法,第一種是用 json.loads 方法, 第二種是用內置的 eval方法,這兩種方法有些區別,比如說單引號和雙引號, json格式中使用的是雙引號, python字典一般是單引號。
OK,獲得原始推送信息數據了,但這裡面有很多我們用不到的信息,將其剔除一下,值得一提的是,datetime的值是一個timestamp,我們需要將其轉化為直觀的時間表達。
到此,關於微信公眾號的爬蟲差不都就解決了,接下來需要將其封裝為類。主要部分代碼如下。
另外,關於關鍵詞搜索文章的爬蟲接口我也一併寫了,AccountAPI,ArticleAPI,其父類是一AP類,API類有query_url, params, headers, _get_response, _get_datetime等變量和方法,供於AccountAPI,ArticleAPI共用。
代碼放在
https://github.com/ice-tong/boring_item/tree/master/sougou_weixin
有興趣可以看看,點擊閱讀原文即可。
放兩張使用截圖
(AccountAPI)
(ArticleAPI)
結語:
這麼簡陋的一個爬蟲稱其為api,我實在是有點膽大妄為了。小打小鬧而已,難登大雅之堂,需要向各位大佬虛心學習。