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

前言web

  • 不管是新方案仍是舊方案, 獲取公衆號文章列表, 獲取閱讀點贊, 獲取評論等接口能夠經過抓包來獲取微信

  • 以上接口都是須要受權的, 受權參數主要有一下幾個架構

    • uin : 用戶對於公衆號的惟一ID, 原本是一個數字, 傳的是base64以後的結果框架

    • key : 與公衆號和uin綁定, 過時時間大概是半小時測試

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

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

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

舊方案日誌

在2015年的時候微信網頁版限制仍是沒那麼嚴格的, 當時採用的主要思路是使用微信網頁版, 而後用requests去模擬登錄一下,code

而後不停的去訪問相似下面的接口爬取信息:

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

相關文章
相關標籤/搜索