微信公衆號文章抓去

微信公衆號存在很多精彩的文章,若是善於挖掘,能夠獲得很多的收穫。但因爲微信對PC端的支持並不友好,雖然有搜狗搜索能夠用,但其結果仍然不全,一些公衆號發的不是文章類型的只是一段話,搜狗就不收錄。想要獲得一個帳號全部的文章,仍是要從爬蟲着手。網上對於微信公衆號文章爬取的方法幾乎沒有介紹,不過有幾個網站,好比傳送門就作出來了。這就告訴咱們這個目標是能夠達到的。廢話很少說,直入主題。 要想獲得一個公衆號發送的全部文章,須要從微信手機端入手。點擊公衆號右上角小人圖標,會有查看歷史消息的連接。點了以後可查看全部歷史文章。因此天然要從這裏入手了。上抓包工具,Fiddler4,手機和電腦接入同一網絡,手機wlan設置代理,指向電腦的ip地址,端口默認8888,這樣在電腦上就能夠監聽手機的http流量了。經過抓包,在點擊‘查看歷史消息’選項時,請求的地址是 抓包1git

經過對多個帳號進行抓包分析,能夠肯定biz這個14位的字符串是每一個公衆號的「id」,uin彷佛與訪問者有關,key也和所訪問的公衆號有關,能夠在下面的抓取中獲得這兩個參數,其餘的查詢參數均可以去掉。 因此,必須獲得三個參數才能夠獲得文章列表。這三個參數biz最容易得到,在搜狗的微信平臺,搜索目標公衆號,會有對應的文章列表,鏈接到相應的文章頁面。解析文章列表,便可獲得公共帳號的biz。能夠經過請求http://weixin.sogou.com/weixin?query=,填入目標帳號名稱,返回的結果裏解析最新文章的url,裏面包含biz。固然,模糊搜索會出現多個候選帳號,這個就比較難辦了。 如今,已知biz,如何繼續?我曾經也困擾了很久,也算是偶然發現的。電腦登錄微信,在手機上訪問某個公衆號的查看歷史消息頁面,點擊右上角,發送給朋友,發送給文件助手便可,電腦上查看。 github

如圖

彷佛看到鏈接了,打開,果真跳轉到了文章列表的頁面!查看元素,這個存在span標籤內,仔細觀察,才發現坑爹啊,和剛纔抓包看到的url是同樣的!繼續尋找,這個spana標籤的子元素,看這個a標籤的hrefa 加上https://wx.qq.com的前綴,就能夠訪問了,最後301跳轉到了span的內容那個url。多看幾個不一樣的公衆號,能夠發現a標籤的內容基本同樣,不一樣的只是biz而已。因此能夠把這個url記爲raw_url,每次請求時,用不一樣的biz替換便可。固然,要帶上ua,cookie的header。用request.get(url,headers=m_header,verify=False),由於請求的是https域,因此要加上verify=False,返回的內容文章列表的那個頁面。分析那個頁面,便可以找到uin,key, uin正則表達式

能夠用正則表達式提取出來。緊接着下面就是這個頁面的msgList,相似json的文本,當前頁面就是經過這裏的文本渲染的。 msglistjson

能夠用正則提取出來直接解析出來,而後用json.loads方法就能夠獲得dict,裏面的信息包括content_url,文章發表的datetime時間戳,摘要信息,文章的id編號mid,還有是不是一次發多篇is_multi等。 鼠標向下滾動,能夠看到動態請求更久遠的文章,抓包可得,是經過json返回的。請求的url就是相似 json微信

這種的,前面獲取的參數就都派上用場了。只要這幾個參數就能夠抓取了,後面幾個參數不要也能夠。要得到一個公衆號的所有文章,能夠將frommsgid改到比他最新文章的id大一點的數字(實驗證實若恰好取最新文章的id,則會忽略最新的那篇),count值設置大一點,好比5000,基本上就會把全部文章信息都返回了。 根據返回的json,從中解析出文章的url,而後就能夠去爬取文章了,這個比較常規,貌似連cookie都不用帶,就不贅述了。cookie

接下來再說說獲取文章點贊數,閱讀數的思路。從電腦網頁訪問是得不到這些數據的,只能從手機上得到。須要的參數仍是uin,biz,key,mid以及idx。其中idx是這篇文章所在的編號,好比一我的一天發了3篇文章,idx就分別對應1,2,3。這幾個參數的名稱可能有些不同,有時叫mid,有時是appmsgid,是從這樣的url裏得到的http://mp.weixin.qq.com/s?__biz=MzA3NTEzMTUwNA==&mid=206110593&idx=1&sn=bbebeb601bec2cd9bb576f31601774c5&scene=4#wechat_redirect,可能要進行一些異常處理。提交的地址是http://mp.weixin.qq.com/mp/getappmsgext,參數是上面提到的,提交的header要假裝成手機的,主要是ua,host要不要用我忘記了,以前的代碼裏是註釋掉這句的, readnum_header={'User-Agent':'Mozilla/5.0 (Linux; Android 4.4.2; sdk Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/6.0.0.61_r920612.501 NetType/epc.tmobile.com',#'Host':'mp.weixin.qq.com'},而後返回的仍是json,進行解析便可。網絡

相關文章
相關標籤/搜索