微信公眾號(hào)文章爬取方法匯總(下)

上一篇我們講了如何獲取一個(gè)公眾號(hào)下面的文章,但是有時(shí)候只獲取文章內(nèi)容還是不夠,還要得到文章的閱讀數(shù)和點(diǎn)贊數(shù)。
公眾號(hào)文章如果不在微信里面打開,頁面是不會(huì)有閱讀數(shù)、點(diǎn)贊數(shù)、評(píng)論的。微信應(yīng)該是做了限制,翻遍了公眾平臺(tái)也沒有找到獲取閱讀數(shù)的接口,沒辦法只能上抓包的工具分析了。
抓包工具有很多,windows系統(tǒng)一般使用Fiddler, mac 系統(tǒng)一般使用charles。這類工具教程都有很多了,就不做介紹了,自行g(shù)oogle吧。今天來介紹一個(gè)新的抓包工具,它和其他抓包工具最大的不同就是它是可編程的,是一個(gè)可以靈活配置的代理服務(wù)器,同時(shí)還提供了一個(gè)web界面便于觀察請(qǐng)求。它就是阿里巴巴基于 Node.js開發(fā)的一款開源代理服務(wù)器 —— AnyProxy

處理流程

處理流程

可以看到,客戶端與服務(wù)器的通信被anyproxy介入,通過rule.js 就可以修改客戶端發(fā)送的數(shù)據(jù)和服務(wù)器返回的數(shù)據(jù)。
客戶端與服務(wù)器通信的數(shù)據(jù)可以通過瀏覽器訪問 http://127.0.0.1:8002 或者本機(jī)局域網(wǎng)ip的8002端口查看。

image

安裝 AnyProxy

  1. 安裝node.js
brew install node
  1. 安裝AnyProxy
npm install -g anyproxy
  1. 啟動(dòng)AnyProxy
anyproxy

代理HTTPS

微信數(shù)據(jù)接口是https的,而AnyProxy默認(rèn)不對(duì)https請(qǐng)求做處理,要看到明文信息,需要配置CA證書。解析https請(qǐng)求的原理是中間人攻擊(man-in-the-middle),用戶必須信任AnyProxy生成的CA證書,才能進(jìn)行后續(xù)流程。

  1. 生成證書
# 生成rootCA證書,生成后需要手動(dòng)信任
anyproxy-ca 
  1. 安裝證書
    找到上一步生成的證書,雙擊安裝。


    安裝證書
  2. 信任證書
    找到剛剛導(dǎo)入的AnyProxy證書,配置為信任


    信任證書
  3. 啟動(dòng)anyproxy

# 啟動(dòng)AnyProxy,并解析所有https請(qǐng)求
anyproxy --intercept

此時(shí)電腦端的https的相關(guān)配置就完了,下面來設(shè)置手機(jī)端。
首先讓手機(jī)和電腦在同一個(gè)局域網(wǎng),然后手機(jī)端訪問 http://電腦端ip:8002/fetchCrtFile ,下載并安裝根證書。


安裝證書

除了上述證書安裝過程,還需要在 設(shè)置->通用->關(guān)于本機(jī)->證書信任設(shè)置 中把AnyProxy證書的開關(guān)打開,否則safari將報(bào)錯(cuò)。


信任證書

配置代理:

設(shè)置 -> 無線局域網(wǎng) -> 你連接的網(wǎng)絡(luò) -> 配置代理,選擇手動(dòng),服務(wù)器填電腦端ip,端口填8001,保存就可以了。

代理設(shè)置

微信接口分析

要查看一個(gè)公眾號(hào)的文章,可以進(jìn)入每個(gè)公眾號(hào)的歷史消息頁面,如果沒有關(guān)注的話可以查看最近10篇,關(guān)注了就可以查看所有歷史文章了。

歷史文章列表獲取

通過AnyProxy代理分析,點(diǎn)擊歷史消息按鈕之后,微信是GET請(qǐng)求的 https://mp.weixin.qq.com/mp/profile_ext 接口,然后通過js渲染的界面,文章列表是保存在一個(gè) msgList 變量中。

msgList

這個(gè)msgList里面有每一次推送文章的標(biāo)題,作者、封面、url等信息,如果推送的是多條消息,會(huì)包含這個(gè)數(shù)據(jù)結(jié)構(gòu)的multi_app_msg_item_list 字段里。通過正則獲取這個(gè)字符串然后解析成json對(duì)象,大概是這樣:

image
閱讀數(shù)和點(diǎn)贊數(shù)獲取

在微信中點(diǎn)擊某一篇文章之后,微信是通過POST請(qǐng)求 https://mp.weixin.qq.com/mp/getappmsgext 接口獲取到閱讀數(shù)和點(diǎn)贊數(shù)等相關(guān)數(shù)據(jù)。

image

但是要請(qǐng)求這個(gè)接口除了需要cookie之后,需要一個(gè)關(guān)鍵參數(shù)appmsg_token

image

而這個(gè)參數(shù)又是通過GET請(qǐng)求 https://mp.weixin.qq.com/s 拿到,每篇文章的appmsg_token都是不一樣的,所以要拿每篇文章的點(diǎn)贊數(shù)都需要先請(qǐng)求這個(gè)接口,然后從response中解析出appmsg_token

image

rule.js

微信接口就分析到這里了,下面開始具體操作:

AnyProxy 提供了很多注入接口,常用的也就是 beforeSendRequestbeforeSendResponse ,這里我們不需要處理發(fā)送請(qǐng)求,只需要處理微信返回的數(shù)據(jù)就行。

image

parseHistoryPage方法里面,首先解析 msgList 字段,拿到每一篇文章的url,然后循環(huán)請(qǐng)求拿appmsg_token,最后根據(jù)這個(gè)參數(shù)獲取閱讀數(shù)和點(diǎn)贊數(shù)。請(qǐng)求接口的時(shí)候需要仔細(xì)分析各個(gè)參數(shù),有些是從cookie取,有些是從url里面取,這些就沒啥難度了。最終效果如下:

image

訪問頻次問題

微信對(duì)訪問次數(shù)是有限制的,首先是封ip,訪問越快封的越快。其次對(duì)每個(gè)微信號(hào)每天的請(qǐng)求次數(shù)也是有限制的,每秒發(fā)一次請(qǐng)求,大概測(cè)試下來是1500次請(qǐng)求左右。達(dá)到后就進(jìn)不了公眾號(hào)歷史頁面(禁24h),微信其他功能不影響。不清楚請(qǐng)求速度如果降下來次數(shù)是不是能增加。

上面是網(wǎng)友的測(cè)試結(jié)果,具體我沒有驗(yàn)證過,只是提供個(gè)參考。

ok,抓取某個(gè)公眾號(hào)文章并獲取閱讀數(shù)和點(diǎn)贊數(shù)的教程就完了,其實(shí)目前還是半自動(dòng),還得人工一個(gè)一個(gè)去點(diǎn)擊公眾號(hào)的歷史消息頁面,要想完全自動(dòng)還得配合一些自動(dòng)化工具,比如按鍵精靈或者appium這些。

以上這些教程都只作為學(xué)習(xí)交流使用,請(qǐng)不要拿去做壞事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容