給大家講解了公眾號文章採集的入口曆史訊息頁資訊擷取方法,有需要的朋友參考一下本內容。
採集文章和採集網站內容一樣,都需要從一個列表頁開始。而文章的列表頁就是公眾號裡的查看曆史訊息頁。現在網路上的其它採集器有的是利用搜狗搜尋,採集方式雖然簡單多了,但是內容不全。所以我們還是要從最標準最全面的公眾號曆史訊息頁來採集。
因為的限制,我們能複製到的連結是不完整的,在瀏覽器中無法開啟看到內容。所以我們需要通過上一篇文章介紹的方法,使用anyproxy擷取到一個完整的公眾號曆史訊息頁面的連結地址。
http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5NDAwMTA2MA==&uin=NzM4MTk1ODgx&key=bf9387c4d02682e186a298a18276d8e0555e3ab51d81ca46de339e6082eb767343bef610edd80c9e1bfda66c2b62751511f7cc091a33a029709e94f0d1604e11220fc099a27b2e2d29db75cc0849d4bf&devicetype=android-17&version=26031c34&lang=zh_CN&nettype=WIFI&ascene=3&pass_ticket=Iox5ZdpRhrSxGYEeopVJwTBP7kZj51GYyEL24AT5Zyx%2BBoEMdPDBtOun1F%2F9ENSz&wx_header=1
前一篇文章提到過,biz參數是公眾號的ID,uin是使用者的ID,目前來看uin是在所有公眾號之間唯一的。其它兩個重要參數key和pass_ticket是用戶端補充上的參數。
所以在這個地址失效之前我們是可以通過瀏覽器查看原文的方法擷取到曆史訊息的文章列表的,如果希望自動化分析內容,也可以製作一個程式,將這個帶有尚未失效的key和pass_ticket的連結地址提交進去,再通過例如php程式來擷取到文章列表。
最近有朋友跟我說他的採集目標就是單一的一個公眾號,我覺得這樣就沒必要用上一篇文章寫的批量採集的方法了。所以我們接下來看看曆史訊息頁裡面是怎樣擷取到文章列表的,通過分析文章列表,就可以得到這個公眾號所有的內容連結地址,然後再採集內容就可以了。
在anyproxy的web介面中如果認證配置正確,是可以顯示出https的內容的。web介面的地址是http://localhost:8002 其中localhost可以替換成自己的IP地址或網域名稱。從列表中找到getmasssendmsg開頭的記錄,點擊之後右側就會顯示出這條記錄的詳情:
紅框部分就是完整的連結地址,將公眾平台這個網域名稱拼接在前面之後就可以在瀏覽器中開啟了。
然後將頁面向下拉,到html內容的結尾部分,我們可以看到一個json的變數就是曆史訊息的文章列表:
我們將msgList的變數值拷貝出來,用json格式化工具分析一下,我們就可以看到這個json是以下這個結構:
{ "list": [ { "app_msg_ext_info": { "author": "", "content": "", "content_url": "http://mp.weixin.qq.com/s?__biz=MzA5MzEzNDg3MQ==&mid=2652767427&idx=1&sn=37da0d7208283bf90e9a4a536e0af0ea&chksm=8b882dbbbcffa4ad2f0b8a141cc988d16bace564274018e68e5c53ee6f354f8ad56c9b98bade&scene=4#wechat_redirect", "copyright_stat": 100, "cover": "http://mmbiz.qpic.cn/mmbiz/MofBAcBsJ6X0xGrQ2XK5yQjzwb2eswxkRNBTgLtcqGziaFqwibzvtZAHCDkMeJU1fGZHpjoeibanPJ8rziaq68Akkg/0?wx_fmt=jpeg", "digest": "擦亮雙眼,遠離謠言。", "fileid": 505283695, "is_multi": 1, "multi_app_msg_item_list": [ { "author": "", "content": "", "content_url": "http://mp.weixin.qq.com/s?__biz=MzA5MzEzNDg3MQ==&mid=2652767427&idx=2&sn=449ef1a874a37fed2429e14f724b56ef&chksm=8b882dbbbcffa4ade48a7932cda4263687e34fca8ea3a5a6233d2589d448b9f6130d3890ce93&scene=4#wechat_redirect", "copyright_stat": 100, "cover": "http://mmbiz.qpic.cn/mmbiz_png/MofBAcBsJ6XyaIn0qEDSSicBUBZbMYHYrhibia89ZnksCsUiaia2TLI1fyqjclibGa1hw3icP6oXeSpaWMjiabaghHl7yw/0?wx_fmt=png", "digest": "12月28日,廣州亞運城綜合體育館,內附購票入口~", "fileid": 0, "source_url": "http://wechat.show.wepiao.com/detail/ff764b0731b7465db03b56b998e1f2b8?detailReferrer=1&from=groupmessage&isappinstalled=0", "title": "2017公開課Pro版即將召開" }, ...//迴圈被省略 ], "source_url": "", "subtype": 9, "title": "謠言熱榜 | 十一月朋友圈十大謠言" }, "comm_msg_info": { "content": "", "datetime": 1480933315, "fakeid": "3093134871", "id": 1000000010, "status": 2, "type": 49 //類型為49的時候是圖文訊息 } }, ...//迴圈被省略 ]}
簡要的分析一下這個json(這裡只介紹一些重要的資訊,其它的被省略):
"list": [ //最外層的鍵名;只出現一次,所有內容都被它包含。 {//這個大闊號之內是一條多圖文或單圖文訊息,通俗的說就是一天的群發都在這裡 "app_msg_ext_info":{//圖文訊息的擴充資訊 "content_url": "圖文訊息的連結地址", "cover": "封面圖片", "digest": "摘要", "is_multi": "是否多圖文,值為1和0", "multi_app_msg_item_list": [//這裡麵包含的是從第二條開始的圖文訊息,如果is_multi=0,這裡將為空白 { "content_url": "圖文訊息的連結地址", "cover": "封面圖片", "digest": ""摘要"", "source_url": "閱讀原文的地址", "title": "子內容標題" }, ...//迴圈被省略 ], "source_url": "閱讀原文的地址", "title": "頭條標題" }, "comm_msg_info":{//圖文訊息的基本資料 "datetime": '發布時間,值為unix時間戳記', "type": 49 //類型為49的時候是圖文訊息 } }, ...//迴圈被省略]
在這裡還要提到一點就是如果希望擷取到時間更久遠一些的曆史訊息內容,就需要在手機或模擬器中將頁面向下拉,當拉到最底下的時候,將自動讀取下一頁的內容。下一頁的連結地址和曆史訊息頁的連結地址同樣是getmasssendmsg開頭的地址。但是內容就是只有json了,沒有html了。直接解析json就可以了。
這時可以通過上一篇文章介紹的方法,使用anyproxy將msgList變數值正則匹配出來之後,非同步提交到伺服器,再從伺服器上使用php的json_decode解析json成為數組。然後遍曆迴圈數組。我們就可以得到每一篇文章的標題和連結地址。
如果只需要採集單一公眾號的內容,完全可以在每天群發之後,通過anyproxy擷取到完整的帶有key和pass_ticket的連結地址。然後自己製作一個程式,手動將地址提交給自己的程式。使用例如php這樣的語言來正則匹配到msgList,然後解析json。這樣就不用修改anyproxy的rule,也不需要製作一個採集隊列和跳轉頁面了。
相關推薦:
PHP實現基數排序的方法講解
PHP基於反射機制實現自動依賴注入的方法講解
PHP進行中時-變數詳解及字串動態插入變數相關講解