1. 程式人生 > >【Python爬蟲】爬取微信公眾號文章資訊準備工作

【Python爬蟲】爬取微信公眾號文章資訊準備工作

有一天發現我關注了好多微信公眾號,那時就想有沒有什麼辦法能夠將微信公眾號的文章弄下來,而且還想將一些文章的精彩評論一起搞下來。參考了一些文章,通過幾天的研究基本上實現了自己的要求,現在記錄一下自己的一些心得。

整個研究過程如下:
1.瞭解微信公眾號文章連結的組成,歷史文章API組成,單個文章評論API組成,訪問微信公眾號的cookie組成;
2.分析歷史文章API以及單個文章評論API的結構,構建爬蟲進行爬取;
前面兩點需要藉助於抓包工具Fiddler,下面會詳細介紹抓包結果的分析,上一篇文章有介紹“ Fiddler在PC/臺式對Android進行抓包
3.設計表結構,將爬蟲獲取的資料存入到mysql資料庫;
4.對獲取的資料庫資訊進行過濾整理,將相關內容輸出,選擇相應文章進行閱讀並消化。

一、微信公眾號圖文訊息的連結組成
微信公眾帳號群發的圖文訊息一般情況下是在微信公眾平臺上編輯和產生的。
我們先從比較有名的公眾號“邏輯思維”的圖文訊息看看一篇圖文訊息連結的組成元素:
邏輯思維有一篇每天60秒的文章【羅胖60秒:一個“智慧系統”是什麼樣的?】,在微信開啟通過瀏覽器檢視到連結
http://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&mid=3009217237&idx=2&sn=881c0a758a43348e2e7602110862f6ec&chksm=90460ec6a73187d00ebc007b1429609573ca42b9ef1dd74d860b4716f04b63661b15cbee2c6b&mpshare=1&scene=23&srcid=1202m2DVBW8OubvaR1DcXF0a#rd
上面連結中的引數有__biz,mid,idx,sn,chksm,mpshare,scene和srcid
其實主要引數只有__biz,mid,idx和sn四個引數,而這四個引數能唯一確定一篇微信公眾平臺的圖文訊息,所以以下連結就可以訪問文章
https://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&mid=3009217237&idx=2&sn=881c0a758a43348e2e7602110862f6ec
這四個引數的含義是:
__biz可以認為是微信公眾平臺對外公佈的公眾帳號的唯一id,而這個__biz引數能用來生成公眾帳號的二維碼
mid是圖文訊息id,每篇文章這個訊息id都唯一
idx是釋出的第幾條訊息(1就代表是頭條位置訊息,2代表第二條)
sn是一個隨機加密串(對於一篇圖文訊息是唯一的,如果你想問這個sn的生成規則是什麼或者怎麼破解,你基本上只能從微信公眾平臺開發團隊才能得到答案)
另外,對於除了__biz之外的三個引數,mid/idx/sn 可以分別寫成 appmsgid/itemidx/sign,比如還是之前文章,用如下連結一樣可以訪問到:
https://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&appmsgid=3009217237&itemidx=2&sign=881c0a758a43348e2e7602110862f6ec
其實在早期,只需要__biz, mid和idx三個引數即可確定一篇微信公眾平臺的圖文訊息,微信後來增加一個引數sn(sign),這樣做的原因是:
微信公眾平臺的圖文訊息首先在後臺儲存為了一篇素材才能釋出,而這個素材也會生成一個連結,在早期這個素材的連結就是後來要釋出的文章的連結,而從上面這篇文章的連結你能猜出來,只需要改變mid(圖文訊息id)這個值,比如這篇文章的mid是10000382,對這個數字加上1或者2就極有可能是下一篇圖文訊息或者素材的連結,這樣使用者就有可能提前閱讀到公眾帳號已經寫好並儲存但還沒群發的素材了。
所以分佈文章時會加上一個隨機生成的引數sn,確保文章無法被知道。


二、微信公眾號歷史文章API組成
在公眾號主頁,右上角有個人上半身圖示,點選進入訊息介面,下滑找到並點選“全部訊息”,往下請求載入幾次歷史文章,然後回到Fiddler介面,不出意外的話應該可以看到這幾次請求,可以看到返回的資料是json格式的,同時文章資料是以json字串的形式定義在general_msg_list欄位中:
https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5NjAxOTU4MA==&f=json&offset=10&count=10&is_ok=1&scene=126&uin=777&key=777&pass_ticket

=pI3viTq3ke7q4XBuvPFfW04X1NN374CuTXRryqcWqIUGGXvrmHzytAth%2BMUWmDEv&wxtoken=&appmsg_token=985_CXzmkHn3e3dS9vsefAmdITS4irh69Rk351ye-w~~&x5=1&f=json


以下介紹幾個主要引數:
- __biz:相當於是當前公眾號的id(唯一固定標誌) 
- offset:文章資料介面請求偏移量標誌(從0開始),每次返回的json資料中會有下一次請求的offset,這裡一般是按10遞增的 
- count:每次請求的資料量(親測最多可以是10) ,所以可以固定為10
- pass_ticket:可以理解是請求票據,而且隔一段時間後(大概幾個小時)就會過期,失效後都需要重新抓包替換
- appmsg_token:同樣理解為非固定有過期策略的票據,失效後都需要重新抓包替換

三、微信公眾號訪問的cookie組成:

訪問微信公眾號歷史文章,我們是需要登入的,我們可以通過構建cookie去跳過登入過程
通過訪問微信公眾號文章,我們通過Fiddler抓包可以看到cookie的相關資訊

其中pass_ticket和wap_sid2不是固定的,經常有變化,失效了都需要重新抓包,而其他wxtokenkey,wxuin,devicetype,version等只要微訊號不變,登入裝置不變都不會改變。

四、微信公眾號單個文章評論API組成
通過訪問微信公眾號文章,我們抓包可以得到文章評論的API,這個返回的也是json格式,評論儲存在elected_comment
https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0&__biz=MjM5NjAxOTU4MA==&appmsgid=3009217642&idx=2&comment_id=578089232589930496&offset=0&limit=100&uin=777&key=777&pass_ticket=v+7PaoESYfMrxgXJpqOkfXV4Y2+gYNPPJfSSmzPXfeiuNrNiBeEcs+8b//Yit5sd&wxtoken=777&devicetype=android-26&clientversion=2607033b&appmsg_token=986_jbuKqpV9lCZ1cb787Tem5V5n6JKpU9TrOFUZRE5esVxnBK7IR-TsZiXLRNaO1tnfx4rkIk1xyFHRlqI7&x5=1&f=json

還是介紹一下其中的主要引數:
- __biz:和歷史文章列表中一致,微信公眾號ID
- comment_id:評論的id,一篇文章唯一
- appmsgid:圖文訊息ID,與文章有關(文章連結中的mid)
- pass_ticket:請求票據,同一時間段內歷史文章API和單個文章評論API一致
- appmsg_token:非固定有過期策略的票據,同一時間段內歷史文章API和單個文章評論API不一致
以上主要介紹了整個研究過程的第一點,下面將會分析歷史文章API和單個文章評論API的返回