著作權所有:http://www.cnblogs.com/zeusro/
引用(爬蟲)不給稿費的,切你jj
追憶似屎年華
在上一篇post(http://www.cnblogs.com/zeusro/p/4185196.html)里面,我留下了3個坑沒有填平。
2模塊化
加載到nodejs里面,用於批量采集。
方法:把變動的參數做成
3淘寶的反采集
4數據的持久化
其實呢,還有一個,就是中文編碼的問題,
那么今天把其中2個解決了。持久化給個思路,反采集就算了,哥已經宣布棄坑了。
正文
模塊化其實很簡單。在采集模塊(js)里面引入system就行了。
var system = require('system');
var url = system.args[1];
var filename = system.args[2];
第一個參數是我們運行的js,第二個參數開始才是我們真正用得到的。
phantomjs phantomcapture.js http://shop115235781.m.taobao.com/#list av
這樣就簡單完成了模塊化。
那么在node那邊,我們要做到的就是,要引用並運行這個模塊。這里我用了node的child_process,每一個url開啟一個子進程。
淘寶的反采集
這個才是我宣布棄坑的原因。我在每次調用waitfor超時之后都有去截屏處理的。而我開那么多個子進程捕獲到的結果就是,要登錄淘寶,還得輸入驗證碼。。。要輸入驗證碼,呵呵....
數據的持久化
樓主用SqlServer慣的。
node.js確實有連SqlServer的驅動(https://github.com/Azure/node-sqlserver),問題是那玩意我連接失敗了。那個項目2年前最后一次提交代碼。作者自己也說了,說是去放假了解決不了一些issue,其實看起來更像是棄坑的節奏。
那么我只能建議連芒果DB或者nosql了。
中文編碼問題。
這個有人在私信里面問我。這個我其實一早就預料到了,因為之前在找資料的時候就有提到js的編碼問題,這個是固有缺陷。解決這個問題,引入iconv-lite就行了。
這里,我使用了這玩意擴展了node的編碼
// After this call all Node basic primitives will understand iconv-lite encodings. iconv.extendNodeEncodings();
然后在進程通信那里
var buf = new Buffer(data, 'win1251');
buf.write(data, 'gbk');
console.log(buf.toString('gbk'));
這樣就行了
代碼
主進程node的代碼如下
var colors = require('colors')
, jsdom = require('jsdom').jsdom
, async = require('async')
, http = require('http')
, fs = require('fs')
, jquery = fs.readFileSync("jquery-1.10.2.min.js", "utf-8")
, iconv = require('../node_modules/iconv-lite')
, phantom = require('phantomjs');
// After this call all Node basic primitives will understand iconv-lite encodings.
iconv.extendNodeEncodings();
var count = 0;
console.log('主進程開啟');
var startTime = new Date().getTime();
var urls = new Array(
"http://shop100338207.m.taobao.com/#list",
"http://shop68291879.m.taobao.com/#list",
"http://shop115235781.m.taobao.com/#list",
"http://shop10199638.m.taobao.com/#list",
"http://shop67272667.m.taobao.com/#list",
"http://shop109683760.m.taobao.com/#list",
"http://shop33495993.m.taobao.com/#list",
"http://shop58501945.m.taobao.com/#list",
"http://shop62907168.m.taobao.com/#list",
"http://shop59495864.m.taobao.com/#list",
"http://shop60374631.m.taobao.com/#list"
);
for (var i = 0; i < urls.length; i++) {
console.log(("采集地址:" + urls[i]).red);
capture(urls[i]);
}
function capture(url) {
count++;
var spawn = require('child_process').spawn,
ls = spawn('phantomjs', ['phantomcapture.js', url, count]);
ls.stdout.on('data', function (data) {
var buf = new Buffer(data, 'win1251');
buf.write(data, 'gbk');
console.log(buf.toString('gbk'));
});
ls.stderr.on('data', function (data) {
//console.log('stderr: ' + data);
});
ls.on('close', function (code) {
if (code == 1) {
console.log('child process異常結束。目標:' + url);
}
});
}
坑
1在window平台上編譯一些模塊的時候要用到VS2010的MSbuild,我本來裝2013的,但是不行。這貨就是這么賤,要10版本的MSbuild,所以我只能老老實實去裝個10版本了
最后啰嗦一下,如果出現啥不是內部或外部命令之類的,那肯定是你打開方式不對,沒有弄系統環境變量。
著作權所有:http://www.cnblogs.com/zeusro/
引用(爬蟲)不給稿費的,切你jj
參考鏈接
Node.js中的child_process及進程通信
iconv-lite
child_process.spawn 亂碼?
從寫 node.js 爬蟲說起
Nodejs寫一個簡單爬蟲
