引用(爬蟲)不給稿費的,切你jjhtml
在上一篇post(http://www.cnblogs.com/zeusro/p/4185196.html)裏面,我留下了3個坑沒有填平。node
2模塊化jquery
加載到nodejs裏面,用於批量採集。git
方法:把變更的參數作成github
3淘寶的反採集sql
4數據的持久化dom
其實呢,還有一個,就是中文編碼的問題,nosql
那麼今天把其中2個解決了。持久化給個思路,反採集就算了,哥已經宣佈棄坑了。async
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版本了
最後囉嗦一下,若是出現啥不是內部或外部命令之類的,那確定是你打開方式不對,沒有弄系統環境變量。
引用(爬蟲)不給稿費的,切你jj
Node.js中的child_process及進程通訊
iconv-lite