微信公眾號文章爬蟲抓取實現原理!


前言

  • 無論是新方案還是舊方案, 獲取公眾號文章列表, 獲取閱讀點贊, 獲取評論等接口可以通過抓包來獲取

  • 以上接口都是需要授權的, 授權參數主要有一下幾個

    • uin : 用戶對於公眾號的唯一ID, 本來是一個數字, 傳的是base64之后的結果

    • key : 與公眾號和uin綁定, 過期時間大概是半小時

    • pass_ticket: 另外一個驗證碼, 與uin進行綁定

    • req_id: 在文章里HTML里, 每次請求會不一樣, 用來構成獲取閱讀點贊接口的RequestBody, 一次有效

    • 獲取閱讀點贊接口有頻率限制, 測試的結果是一個微信號5分鍾可以查看30篇文章的閱讀點贊

舊方案

在2015年的時候微信網頁版限制還是沒那么嚴格的, 當時采用的主要思路是使用微信網頁版, 然后用requests去模擬登陸一下,

然后不停的去訪問類似下面的接口爬取信息:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrl=encodeURIComponent('http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5NzQ3ODAwMQ==#wechat_redirect‘)

當時為了能讓爬蟲多個實例跑, 用了一下 Celery 框架(現在想簡直智障, 多個實例跑直接把程序啟動N次就行了啊。。摔), 由於是模擬登陸, 所以又寫了一套復雜的東西去生成二維碼, 然后獲取登陸URL, 具體的模擬登陸原理參考這個 wechat-deleted-friends, 另外相關的Celery Task里寫的邏輯太復雜了, 一個Task里就帶上了 requests斷線重連機制, 模擬登陸機制, 解析列表, 解析文章等, 另外由於是web版微信有一套蠻復雜的sync機制, 有時候直接掉線需要再次的去手動登陸, 很是麻煩。

之后web版微信已經無法的獲取Key了(2016年開始), 此方案就廢棄了。。

新方案

經leader提醒, 改了一下架構, 其中項目的整體結構如下:

微信公眾號爬蟲實現

微信爬蟲架構圖

  • Seeds 是一個producer, 在此處指通過某種方式獲取 uin, key, pass_ticket 信息, 思路類似中間人攻擊+解析squid日志

  • Consumer C1從Q1隊列中取出seeds后爬取某個公眾號的文章列表, 解析后將文章Meta信息放入隊列Q2

  • Consumer C2獲取文章原信息后就可以直接做入庫&爬取操作了

  • 之后可以繼續加隊列然后去實現爬取文章閱讀點贊的相關數據了, 由於有頻率限制。一個微信號一天只能最多獲取8000篇文章的閱讀點贊信息

  • 拋棄了Celery和其默認選用的RabbitMQ隊列, 這種東西實在太重了。。改用beanstalkd做消息隊列

  • 目前的效果是單微信號每日更新4w左右的公眾號文章, 如果想繼續增加數量可以通過加機器來擴展

Update

生成key的方式是寫按鍵精靈的腳本去不斷地生成文章列表URL然后不停的點擊, 用squid做代理來獲取帶Key的URL(squid需要配置一下ssl-bump透明代理)

Over


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM