基于anyproxy的微信公眾號(hào)文章爬取笛粘,包含閱讀數(shù)點(diǎn)贊數(shù)

github項(xiàng)目地址
錄制的視頻:點(diǎn)擊前往

基本原理

  1. AnyProxy是一個(gè)阿里開(kāi)源的HTTP代理服務(wù)器,類似fiddler和charles郑兴,但是提供了二次開(kāi)發(fā)能力,可以編寫js代碼改變http/https請(qǐng)求和響應(yīng)
  2. 為了爬取一個(gè)微信公眾號(hào)的全部文章贝乎,首先就是獲取全部文章情连,然后一篇一篇去打開(kāi)獲取文章標(biāo)題,作者览效,閱讀數(shù)却舀,點(diǎn)贊數(shù)(這兩個(gè)只能在微信瀏覽器獲取)
  3. 每個(gè)微信公眾號(hào)都提供查看歷史消息的功能锤灿,點(diǎn)擊去打開(kāi)這個(gè)網(wǎng)頁(yè)禁筏,不停下滾,可以查到全部發(fā)布文章衡招。在這一步篱昔,基于anyproxy,修改了這個(gè)網(wǎng)頁(yè)html始腾,注入一段讓頁(yè)面不停往下滾動(dòng)的js腳本州刽,當(dāng)滾到底部,就獲取了全部文章列表浪箭。 本質(zhì)上是中間人攻擊穗椅。
  4. 獲取完全部文章的內(nèi)容(包括url,標(biāo)題奶栖,發(fā)布時(shí)間等等)后匹表,下一步就是循環(huán)通知微信瀏覽器一個(gè)一個(gè)去打開(kāi)這些文章網(wǎng)頁(yè)。每個(gè)文章網(wǎng)頁(yè)也注入js腳本宣鄙,功能是不停的檢查頁(yè)面的點(diǎn)贊數(shù)和閱讀數(shù)袍镀,檢測(cè)到,就往某服務(wù)器發(fā)冻晤,后臺(tái)每成功收到一個(gè)文章的點(diǎn)贊數(shù)和閱讀數(shù)苇羡,就通知微信瀏覽器打開(kāi)下一個(gè)url。這里我使用了socketio鼻弧,實(shí)現(xiàn)微信瀏覽器和自建的koa服務(wù)器之間的通訊设江。
    如圖所示:


    獲取文章列表演示
一篇一篇打開(kāi)文章鏈接

如何運(yùn)行

第一步锦茁,一定要安裝成功anyproxy,這一步請(qǐng)?jiān)敿?xì)閱讀anyproxy的官方教程叉存,寫的很詳細(xì)码俩,要保證能成功代理https,能查看到https的body內(nèi)容歼捏。

npm install
npm start

會(huì)自動(dòng)打開(kāi)一個(gè)result.html握玛,實(shí)時(shí)查看爬取文章的內(nèi)容
點(diǎn)擊一個(gè)微信公眾號(hào),點(diǎn)擊查看歷史消息甫菠,之后歷史頁(yè)面會(huì)不停的滾動(dòng)到底,滾動(dòng)完畢冕屯,就開(kāi)始一篇一篇打開(kāi)文章寂诱,爬取內(nèi)容。


實(shí)時(shí)結(jié)果顯示.jpg

具體過(guò)程

1.第一步安聘,要獲取一個(gè)公眾號(hào)的全部歷史文章痰洒。在已經(jīng)設(shè)置好anyproxy代理的真機(jī)上,查看歷史消息浴韭,這時(shí)微信會(huì)打開(kāi)歷史文章網(wǎng)頁(yè)丘喻。
獲取一個(gè)html文檔:


var msgList就是我們需要的歷史文章數(shù)據(jù)念颈,簡(jiǎn)單正則匹配出來(lái)泉粉,替代非法字符,JSON.parse轉(zhuǎn)成我們需要的格式榴芳。 基于anyproxy嗡靡,我們給這個(gè)html文檔注入一段腳本,目的是讓這個(gè)網(wǎng)頁(yè)不停的往下自己滾動(dòng)窟感,觸發(fā)瀏覽器去獲得更多的文章讨彼。

var scrollKey = setInterval(function () {
    window.scrollTo(0,document.body.scrollHeight);
},1000);

當(dāng)網(wǎng)頁(yè)滾到底,再次獲取文章柿祈,這個(gè)時(shí)候哈误,同樣的是get請(qǐng)求,但是返回了Content-Type為application/json的格式躏嚎,這里同樣的方法蜜自,正則匹配找出并格式化成我們需要的格式


同時(shí)當(dāng)can_msg_continue為0時(shí),表示已經(jīng)拉到底卢佣,獲取了全部文章袁辈。

至此,獲得了一個(gè)公眾號(hào)的全部文章珠漂,包括文章標(biāo)題晚缩,作者尾膊,url。但是沒(méi)有閱讀數(shù)和點(diǎn)贊數(shù)荞彼,這需要打開(kāi)具體的文章鏈接冈敛,才能看得到。

  1. 我們還沒(méi)獲得閱讀數(shù)和點(diǎn)贊數(shù)鸣皂,接下來(lái)就是一步一步讓微信瀏覽器不停地打開(kāi)具體文章抓谴,觸發(fā)微信瀏覽器獲取閱讀數(shù)和點(diǎn)贊數(shù)。這里使用了socket.io寞缝,讓文章頁(yè)面連接自定義的服務(wù)器癌压,服務(wù)器主動(dòng)通知瀏覽器下一個(gè)點(diǎn)開(kāi)的文章鏈接,這樣雙向通訊荆陆,一個(gè)循環(huán)就能獲取具體文章的閱讀數(shù)和點(diǎn)贊滩届。
socket.on('url', function (data) {
    window.location = data.url;
});

閱讀數(shù)和點(diǎn)贊可以在瀏覽器端,不停檢查dom元素是否渲染出來(lái)然后收集發(fā)往服務(wù)器被啼,也可以直接anyproxy檢查出來(lái)(這里我采用前一種)帜消。

key = setInterval(function () {
        var readNum = $('#readNum3').text().trim();

        if (!readNum) return;
        var likeNum = $('#likeNum3').text().trim();
        var postUser = $('#post-user').text().trim();
        var postDate = $('#post-date').text().trim() || $('#publish_time').text().trim();
        var activityName = $('#activity-name').text().trim();
        var js_share_source = $('#js_share_source').attr('href');
        socket.emit('crawler', {
            readNum: readNum,
            likeNum: likeNum,
            postUser: postUser,
            postDate: postDate,
            activityName: activityName,
            js_share_source: js_share_source
        });
    }, 1000);
post響應(yīng)中的閱讀數(shù)和點(diǎn)贊數(shù)

實(shí)踐過(guò)程的注意點(diǎn)

原理很簡(jiǎn)單,基于真機(jī)的爬蟲浓体,中間人攻擊泡挺,注入javascript腳本,讓瀏覽器模擬人的操作過(guò)程命浴。

  1. 禁止網(wǎng)頁(yè)的Content-Security-Policy娄猫。CSP 的實(shí)質(zhì)就是白名單制度,開(kāi)發(fā)者明確告訴客戶端生闲,哪些外部資源可以加載和執(zhí)行稚新,等同于提供白名單。如果不禁用跪腹,注入的javascript將無(wú)法執(zhí)行褂删。這里的做法,簡(jiǎn)單粗暴的刪除http響應(yīng)的任何和csp有關(guān)的頭部冲茸。
 // 刪除微信網(wǎng)頁(yè)的安全策略
delete header['Content-Security-Policy'];
delete header['Content-Security-Policy-Report-Only'];
刪除和scp有關(guān)的header.jpg
  1. 禁止微信瀏覽器緩存頁(yè)面內(nèi)容屯阀,同樣要修改響應(yīng)頭的和緩存相關(guān)的內(nèi)容。
 header['Expires'] = 0;
 header['Cache-Control'] = 'no-cache, no-store, must-revalidate';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轴术,一起剝皮案震驚了整個(gè)濱河市难衰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逗栽,老刑警劉巖盖袭,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鳄虱,警方通過(guò)查閱死者的電腦和手機(jī)弟塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拙已,“玉大人决记,你說(shuō)我怎么就攤上這事”蹲伲” “怎么了系宫?”我有些...
    開(kāi)封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)建车。 經(jīng)常有香客問(wèn)我扩借,道長(zhǎng),這世上最難降的妖魔是什么缤至? 我笑而不...
    開(kāi)封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任潮罪,我火速辦了婚禮,結(jié)果婚禮上凄杯,老公的妹妹穿的比我還像新娘。我一直安慰自己秉宿,他們只是感情好戒突,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著描睦,像睡著了一般膊存。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忱叭,一...
    開(kāi)封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天隔崎,我揣著相機(jī)與錄音,去河邊找鬼韵丑。 笑死爵卒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撵彻。 我是一名探鬼主播钓株,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陌僵!你這毒婦竟也來(lái)了轴合?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碗短,失蹤者是張志新(化名)和其女友劉穎受葛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡总滩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年纲堵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咳秉。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婉支,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澜建,到底是詐尸還是另有隱情向挖,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布炕舵,位于F島的核電站何之,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咽筋。R本人自食惡果不足惜溶推,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奸攻。 院中可真熱鬧蒜危,春花似錦、人聲如沸睹耐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)硝训。三九已至响委,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窖梁,已是汗流浹背赘风。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵刘,地道東北人邀窃。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像假哎,于是被迫代替她去往敵國(guó)和親蛔翅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容