影響因素主要會有以下幾點:
1、網絡環境不佳;
2、手機或模擬器中微信客戶端崩潰;
3、其它一些網絡傳輸錯誤;
因為我比較看重采集系統的運行成本,這個成本包括硬件投入,運算力投入和占用的人工精力。所以必須提高運行的穩定性。因此如果采集中斷,必然增加人工精力的成本。所以針對這一點我對anyproxy做了一些進階的改造,并且借助了其它一些工具提高了運行效率。以下就是具體的解決方法:
一、代碼升級
1)微信瀏覽器白屏
解決方法:修改文件requestHandler.js,還是在rule_default.js同級目錄下,(mac系統/usr/local/lib/node_modules/anyproxy/lib/;win系統評論區網友cnbattle提供C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib)
在代碼中找到proxyReq.on("error",function(e){這個函數,并修改內容
//userRes.end();//把這一行注釋掉
userRes.end('script>setTimeout(function(){window.location.reload();},2000);/script>');//插入這一行
這樣當發生錯誤時,會返回一個刷新當前頁面的js;這樣程序就能繼續下去了
2)替換所有圖片,減輕瀏覽器負擔
首先需要制作一張非常小的圖片,我做的是1x1像素,png透明圖;放到任意文件夾里。然后修改文件rule_default.js的代碼:
在文件開頭有許多var的位置加入以下代碼
var fs = require("fs"),
img = fs.readFileSync("/Library/WebServer/Documents/space.png");//代碼絕對路徑替換成自己的
在下面的代碼中找到shouldUseLocalResponse : function(req,reqBody){函數,在函數內插入代碼:
if(/mmbiz\.qpic\.cn/i.test(req.url)){
req.replaceLocalFile = true;
return true;
}else{
return false;
}
繼續在下面的代碼中找到dealLocalResponse : function(req,reqBody,callback){函數,在函數內插入代碼:
if(req.replaceLocalFile){
callback(200, {"content-type":"image/png"},img );
}
這三段代碼就會將公眾號里面的所有圖片替換成本地圖片,減輕網絡傳輸壓力和瀏覽器占用的內存,有效的提高運行效率;
3)禁止手機或模擬器訪問一些無用的和會導致錯誤的網址
同樣在rule_default.js里找到代碼replaceRequestOption : function(req,option){函數,在函數內部插入代碼:
var newOption = option;
if(/google|btrace/i.test(newOption.headers.host)){//這里面的正則可以替換成自己不希望訪問的網址特征字符串,這里面的btrace是一個騰訊視頻的域名,經過實踐發現特別容易導致瀏覽器崩潰,所以加在里面了,繼續添加可以使用|分割。
newOption.hostname = "127.0.0.1";//這個ip也可以替換成其他的
newOption.port = "80";
}
return newOption;
這個修改之前的文章也提到過了,在這里重新再詳細介紹一下。他的用途很多,不同的手機和模擬器都有可能訪問一些無用的地址導致設備變慢,通過這個代碼就可以阻止訪問。
二、使用pm2管理anyproxy進程
pm2 是一個帶有負載均衡功能的Node應用的進程管理器.
當你要把你的獨立代碼利用全部的服務器上的所有CPU,并保證進程永遠都活著,0秒的重載, PM2是完美的。它非常適合IaaS結構,但不要把它用于PaaS方案(隨后將開發Paas的解決方案).
主要特性:
內建負載均衡(使用Node cluster 集群模塊)
后臺運行
0秒停機重載,我理解大概意思是維護升級的時候不需要停機.
具有Ubuntu和CentOS 的啟動腳本
停止不穩定的進程(避免無限循環)
控制臺檢測
提供 HTTP API
遠程控制和實時的接口API ( Nodejs 模塊,允許和PM2進程管理器交互 )
測試過Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS.
首先安裝pm2
在pm2環境下運行anyproxy
sudo pm2 start anyproxy -x -- -i
現在anyproxy就在pm2的環境中運行了

之后還有幾個pm2的命令可以幫助管理和監控anyproxy
//查看運行日志
sudo pm2 logs anyproxy [--lines 10]
//關閉anyproxy
sudo pm2 delete anyproxy
//重啟anyproxy
sudo pm2 restart anyproxy
//監控內存占用
sudo pm2 monit
//監控運行狀態
sudo pm2 list
特別提示:pm2運行后,終端窗口是可以關閉的。
使用pm2管理anyproxy進程,最重要的目的是:anyproxy因為錯誤而退出程序之后,pm2可以另anyproxy自動重啟。
三、取消sudo密碼,并使pm2開機自啟
以下內容是在mac環境下的方法,windows也應該有類似的方法,如果了解的網友可以私信發給我。
1)首先取消sudo的密碼
運行命令:
找到代碼:
修改為:
%admin ALL = (ALL) NOPASSWD: ALL
這樣sudo的密碼就取消掉了,然后就可以將pm2加入到開機自啟動中了
2)設置開機自啟
在終端中輸入命令:
cd
touch autoexec.sh
vim autoexec.sh
然后進入編輯模式,按鍵盤字母i開始編輯,粘貼代碼:
#!/bin/sh
sudo pm2 start anyproxy -x -- -i
sudo pm2 monit
編輯完之后,按esc,再鍵入命令wq保存退出編輯模式。
再執行命令:
這樣一個可執行文件就建立好了
然后打開mac系統的“系統偏好設置”,找到“用戶與群組”,在左側選擇當前用戶,右側選擇登錄項;然后點擊+號,找到當前用戶的根目錄(可以按shift+command+h快捷鍵),選擇autoexec.sh文件,添加到登錄項中,就可以開機自啟動了。

經過以上的幾項設置之后,anyproxy系統就會比原來更加穩定,其實主要原因是模擬器或手機的不穩定導致的anyproxy發生的錯誤。經過實際測試,anyproxy目前可以長時間運行不崩潰。而微信客戶端還是在運行大約6個小時之后崩潰,以2秒翻一頁的速度,采集總數大約1萬個頁面。如果不采集閱讀量,就可以是1萬個公眾號的歷史消息頁。
微信客戶端的崩潰現象是退出微信瀏覽器,停留在查看公眾號資料頁面。所以如果希望再進一步提高自動化,也可以使用觸動精靈之作自動化腳本,定時推出微信瀏覽器,再點擊歷史消息頁。這樣應該就可以實現長時間自動化采集了。