前言
-
無論是新方案還是舊方案, 獲取公眾號文章列表, 獲取閱讀點贊, 獲取評論等接口可以通過抓包來獲取
-
以上接口都是需要授權的, 授權參數主要有一下幾個
-
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