????????微信公眾號現(xiàn)已成為主流的一對多媒體行為活動弟晚,也是現(xiàn)在互聯(lián)網(wǎng)內(nèi)容生產(chǎn)不可忽視的一股力量嚣镜。
在此基礎(chǔ)上藕甩,微信公眾號爬蟲變得很有價值海雪,對內(nèi)容生產(chǎn)型公眾號進(jìn)行數(shù)據(jù)挖掘可以得到很多有意思、有價值的信息子房。就我所知形用,可用于微信公眾號爬蟲的方式主要有以下幾種:web微信就轧,手機客戶端抓包,搜狗微信入口田度,appium自動化測試妒御,Xposed框架等。
????????其中镇饺,web微信只能被動接受公眾號消息乎莉,不能主動去查閱微信公眾號歷史消息。由此奸笤,可以通過itchat惋啃,wxpy等web微信庫來編寫一個機器人,實時接收微信推送监右,適用于需要實時更新微信推送消息的場景需求肥橙。但此方法有個弊端,首先要保證手機上自己的微信不經(jīng)常斷網(wǎng)掉線秸侣,才能使機器人長時間在線。再者宠互,用這些第三方庫長時間登陸或頻繁的登陸web微信味榛,或被封號,要是微信小號很多予跌,可以嘗試這個方法搏色。
????????手機客戶端抓包,利用fiddler或charles等抓包工具券册,算是一個比較主流(我自己感覺的orz)频轿,效率較高的方法,可以快速的抓取微信公眾號信息和歷史消息烁焙,此方法也有弊端:cookies失效快航邢,半天差不多的時間吧,有針對性的去抓取某幾個公眾號的歷史消息也是可以的骄蝇。要想通過模擬登陸微信自動獲得cookies膳殷,好像挺難的,小弟愚鈍九火,無法實現(xiàn)赚窃,貌似微信登陸是tcp協(xié)議?
????????搜狗微信入口與其他相比顯得友好的多岔激。應(yīng)該是微信搜索引擎和搜狗有合作吧勒极,所以搜狗能有微信搜索的入口。搜狗微信有兩個類型虑鼎,一是通過關(guān)鍵詞搜索文章辱匿,二是通過關(guān)鍵詞搜索公眾號键痛,并且搜索到的微信號只能獲得其最近十條消息推送(即意味著無法通過此方法爬取指定公眾號歷史消息)。這個方法還是有一些應(yīng)用場景的掀鹅,比如像獲取關(guān)于某個關(guān)鍵詞的大量文章散休,比如做一個定時任務(wù),或間隔一定時間去爬取某個微信公眾號最新十條推送來獲取其最新推送乐尊,這一點上戚丸,比web微信要好得多,搜狗微信的更新也是實時的扔嵌,直接和mp.weixin.qq.com相關(guān)聯(lián)限府。
????????appium自動化和Xposed框架我了解不多。appium類似于selenium痢缎,在移動端做自動化測試的胁勺,模擬點擊即可。Xposed框架就有很多可以搞的了独旷,Xposed可以在不修改apk的情況下做到一些額外的功能署穗,爬蟲自然是可以的,除此之外可做到以自動搶紅包嵌洼,自動回復(fù)機器人案疲,修改微信步數(shù)等等騷操作。
????????寫爬蟲也有一段時間了麻养,個人感覺實現(xiàn)爬蟲除了反反爬褐啡,爬蟲效率外,還有一個很難實現(xiàn)的地方就是爬蟲的穩(wěn)定性鳖昌,健壯性备畦,需要考慮到很多異常情況,以及合理有效的異常處理许昨,在這一點上懂盐,我覺得我還需要向各大爬蟲大佬學(xué)習(xí)。(感覺自己瞎扯了好多车要,還沒有開始我的正文(orz)允粤,感覺嫌我啰嗦的大佬請別生氣。)
????利用搜狗微信寫一個爬蟲接口翼岁,代碼很簡陋类垫,只有兩百行不到的代碼。(這里我還得吐槽一下琅坡,python寫多了悉患,總有一種自己很叼,編程很簡單的錯覺榆俺,幾行代碼就能實現(xiàn)很厲害的功能售躁,這時候需要去寫寫CPP冷靜一下坞淮,讓自己知道什么是真正的編程。)
以下記錄下我寫這個爬蟲接口腳本的過程:
1. 頁面請求分析(以公眾號搜索為例):
可以看到第一個http請求包就是我們想要的結(jié)果陪捷,查看其query string回窘,如下:
看起來挺簡單的不是,我們得到以下幾個信息:
請求url為http://weixin.sogou.com/weixin
請求類型為 Get
請求參數(shù)如上圖
發(fā)現(xiàn)將請求參數(shù)tyepe 改成 2市袖,就是獲取關(guān)鍵字搜索文章的結(jié)果
比較簡單
2. 模擬頁面請求:
我們直接用 url, 請求參數(shù)params, 還有谷歌瀏覽器的 user-agent 請求啡直,發(fā)現(xiàn)可以成功的獲取到我們想要頁面的源碼,接下來我們獲取搜索結(jié)果下的第一個公眾號即可(這意味著需要準(zhǔn)確的給定公眾號名稱苍碟,太過模糊有可能獲取到與其類似的公眾號結(jié)果)酒觅。
3. 分析頁面:
先確定爬取思路,第一步獲取微信公眾號鏈接微峰,再通過該微信公眾號鏈接獲取其最近十條推送的相關(guān)信息舷丹,包括標(biāo)題,日期蜓肆,作者颜凯,內(nèi)容摘要,內(nèi)容鏈接(事實上仗扬,我們發(fā)現(xiàn)有了微信推送鏈接之后就能很輕松的獲取其推送主體內(nèi)容装获,但不包括點贊數(shù)和閱讀數(shù),這幾個數(shù)據(jù)只能在微信手機端才能查看厉颤,如果有機會的話,下次記錄下自己手機微信抓包爬蟲的過程)凡简。
于是第一步我們獲取公眾號鏈接:
這里我們直接使用正則表達(dá)式提取即可(這么簡單的就不用xpath,bs4了逼友,依賴標(biāo)準(zhǔn)庫和第三方庫還是有所不同的。)
(抱歉被水印擋住了orz秤涩,換一張帜乞。)
?第二步根據(jù)微信公眾號鏈接獲取最近十條推送信息:
(我只寫了一篇orz,以后多加油筐眷。)
ctlr U 查看網(wǎng)頁源碼黎烈,發(fā)現(xiàn)原始信息都放在一個js變量里面。
好辦匀谣,繼續(xù)正則提取照棋,將json格式的字符串轉(zhuǎn)換成python里面的字典,有兩種辦法武翎,第一種是用? json.loads 方法烈炭, 第二種是用內(nèi)置的 eval方法,這兩種方法有些區(qū)別宝恶,比如說單引號和雙引號符隙, json格式中使用的是雙引號趴捅, python字典一般是單引號。
OK霹疫,獲得原始推送信息數(shù)據(jù)了拱绑,但這里面有很多我們用不到的信息,將其剔除一下丽蝎,值得一提的是猎拨,datetime的值是一個timestamp,我們需要將其轉(zhuǎn)化為直觀的時間表達(dá)征峦。
到此迟几,關(guān)于微信公眾號的爬蟲差不都就解決了,接下來需要將其封裝為類栏笆。主要部分代碼如下类腮。
另外,關(guān)于關(guān)鍵詞搜索文章的爬蟲接口我也一并寫了蛉加,AccountAPI蚜枢,ArticleAPI,其父類是一AP類针饥,API類有query_url, params, headers, _get_response, _get_datetime等變量和方法厂抽,供于AccountAPI,ArticleAPI共用丁眼。
代碼放在?github倉庫筷凤,有興趣可以看看
放兩張使用截圖
結(jié)語:
這么簡陋的一個爬蟲稱其為api,我實在是有點膽大妄為了苞七。小打小鬧而已藐守,難登大雅之堂,需要向各位大佬虛心學(xué)習(xí)蹂风。