wechat articles crawler
1.0.0
錄製的影片:點擊前往
查看历史消息
的功能,點擊去打開這個網頁,不停下滾,可以查到全部發布文章。在這一步,基於anyproxy,修改了這個網頁html,注入一段讓頁面不停往下滾動的js腳本,當滾到底部,就獲取了全部文章列表。 本質上是中間人攻擊。如圖所示:
取得文章列表示範:
一篇一篇開啟文章連結:
第一步,一定要安裝成功anyproxy,這一步請詳細閱讀anyproxy的官方教程,寫的很詳細,要保證能成功代理https,能查看到https的body內容。
yarn install
yarn start
會自動開啟一個result.html,即時查看爬取文章的內容點擊一個微信公眾號,點擊查看歷史消息,之後歷史頁面會不停的滾動到底,滾動完畢,就開始一篇一篇打開文章,爬取內容。
1.第一步,要取得一個公眾號的全部歷史文章。在已經設定好anyproxy代理的真機上,查看歷史消息,這時微信會開啟歷史文章網頁。 取得一個html文件: , var msgList
就是我們需要的歷史文章數據,簡單正則匹配出來,替代非法字符,JSON.parse轉成我們需要的格式。 基於anyproxy,我們給這個html文件注入一段腳本,目的是讓這個網頁不停的往下自己滾動,觸發瀏覽器去獲得更多的文章。
var scrollKey = setInterval ( function ( ) {
window . scrollTo ( 0 , document . body . scrollHeight ) ;
} , 1000 ) ;
當網頁滾到底,再次獲取文章,這個時候,同樣的是get請求,但是返回了Content-Type為application/json
的格式,這裡同樣的方法,正則匹配找出並格式化成我們需要的格式
同時當can_msg_continue
為0時,表示已經拉到底,取得了全部文章。
至此,獲得了一個公眾號的全部文章,包括文章標題,作者,url。但是沒有閱讀數和點讚數,這需要打開具體的文章鏈接,才能看到。
socket . on ( 'url' , function ( data ) {
window . location = data . url ;
} ) ;
閱讀數和讚可以在瀏覽器端,不停檢查dom元素是否渲染出來然後收集發送到伺服器,也可以直接anyproxy檢查出來(這裡我採用前一種)。
key = setInterval ( function ( ) {
var readNum = $ ( '#readNum3' ) . text ( ) . trim ( ) ;
if ( ! readNum ) return ;
var likeNum = $ ( '#likeNum3' ) . text ( ) . trim ( ) ;
var postUser = $ ( '#post-user' ) . text ( ) . trim ( ) ;
var postDate = $ ( '#post-date' ) . text ( ) . trim ( ) || $ ( '#publish_time' ) . text ( ) . trim ( ) ;
var activityName = $ ( '#activity-name' ) . text ( ) . trim ( ) ;
var js_share_source = $ ( '#js_share_source' ) . attr ( 'href' ) ;
socket . emit ( 'crawler' , {
readNum : readNum ,
likeNum : likeNum ,
postUser : postUser ,
postDate : postDate ,
activityName : activityName ,
js_share_source : js_share_source
} ) ;
} , 1000 ) ;
原理很簡單,基於真機的爬蟲,中間人攻擊,注入javascript腳本,讓瀏覽器模擬人的操作過程。
// 删除微信网页的安全策略
delete header [ 'Content-Security-Policy' ] ;
delete header [ 'Content-Security-Policy-Report-Only' ] ;
header [ 'Expires' ] = 0 ;
header [ 'Cache-Control' ] = 'no-cache, no-store, must-revalidate' ;