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

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

經(jīng)過以上的幾項(xiàng)設(shè)置之后,anyproxy系統(tǒng)就會(huì)比原來更加穩(wěn)定,其實(shí)主要原因是模擬器或手機(jī)的不穩(wěn)定導(dǎo)致的anyproxy發(fā)生的錯(cuò)誤。經(jīng)過實(shí)際測試,anyproxy目前可以長時(shí)間運(yùn)行不崩潰。而微信客戶端還是在運(yùn)行大約6個(gè)小時(shí)之后崩潰,以2秒翻一頁的速度,采集總數(shù)大約1萬個(gè)頁面。如果不采集閱讀量,就可以是1萬個(gè)公眾號(hào)的歷史消息頁。
微信客戶端的崩潰現(xiàn)象是退出微信瀏覽器,停留在查看公眾號(hào)資料頁面。所以如果希望再進(jìn)一步提高自動(dòng)化,也可以使用觸動(dòng)精靈之作自動(dòng)化腳本,定時(shí)推出微信瀏覽器,再點(diǎn)擊歷史消息頁。這樣應(yīng)該就可以實(shí)現(xiàn)長時(shí)間自動(dòng)化采集了。
相關(guān)文章
php的api數(shù)據(jù)接口書寫實(shí)例(推薦)
下面小編就為大家?guī)硪黄猵hp的api數(shù)據(jù)接口書寫實(shí)例(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
三個(gè)思路解決laravel上傳文件報(bào)錯(cuò):413 Request Entity Too Large問題
上傳圖片的時(shí)候,是用laravel自帶的上傳圖片的方法,一下氣上傳了20張,結(jié)果就無情報(bào)錯(cuò):413 Request Entity Too Large,后面查一下,這個(gè)報(bào)錯(cuò)信息是nginx報(bào)的錯(cuò)誤,不是php報(bào)的錯(cuò)誤。也就是說在上傳圖片的時(shí)候被nginx攔截了2017-11-11
一個(gè)簡單的php實(shí)現(xiàn)的MySQL數(shù)據(jù)瀏覽器
一個(gè)簡單的php實(shí)現(xiàn)的MySQL數(shù)據(jù)瀏覽器...2007-03-03
Laravel框架Eloquent ORM新增數(shù)據(jù)、自定義時(shí)間戳及批量賦值用法詳解
這篇文章主要介紹了Laravel框架Eloquent ORM新增數(shù)據(jù)、自定義時(shí)間戳及批量賦值用法,結(jié)合實(shí)例形式詳細(xì)分析了Laravel框架Eloquent ORM通過模型新增數(shù)據(jù)、時(shí)間戳設(shè)置、批量賦值模型、Create新增等相關(guān)使用方法,需要的朋友可以參考下2019-12-12
PHP如何實(shí)現(xiàn)阿里云短信sdk靈活應(yīng)用在項(xiàng)目中的方法
這篇文章主要介紹了PHP如何實(shí)現(xiàn)阿里云短信sdk靈活應(yīng)用在項(xiàng)目中的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
PHP分頁初探 一個(gè)最簡單的PHP分頁代碼的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄狿HP分頁初探 一個(gè)最簡單的PHP分頁代碼的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
YII2框架實(shí)現(xiàn)表單中上傳單個(gè)文件的方法示例
這篇文章主要介紹了YII2框架實(shí)現(xiàn)表單中上傳單個(gè)文件的方法,結(jié)合實(shí)例形式分析了YII2框架表單提交與文件上傳相關(guān)操作技巧,需要的朋友可以參考下2020-03-03
laravel7學(xué)習(xí)之無限級(jí)分類的最新實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于laravel7學(xué)習(xí)之無限級(jí)分類的最新實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
laravel實(shí)現(xiàn)批量更新多條記錄的方法示例
最近在使用Laravel,想批量插入近千條數(shù)據(jù),通過網(wǎng)上找到了相關(guān)的解決方法,所以下面這篇文章主要給大家介紹了關(guān)于laravel實(shí)現(xiàn)批量更新多條記錄的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10

