我用request爬取圖片,為了防止ip被封,用了代理,可是用了代理後,總是報錯。 nodejs用到了request和async模組
function download(item,cb){
request({
url:item.img,
proxy:proxys[Math.random()*proxys.length|0],
method:'GET',
timeout:5000
},function(err,response,body){
if(response && response.statusCode == 200){
cb(null,item);
}
}).on('error',function(){
console.log('下载出现异常,可能是pipe有问题,再次请求...');
download(item,cb);
// cb(null,item);
}).pipe(fs.createWriteStream(fileDir2+item.name+'.'+item.url_token+'.jpg'));
}
download(item,cb) ,cb是async中控制流程的回呼函數:
async.eachLimit(items,10,function(item,cb){
download(item,cb);
},function(){...})
每次下載沒幾個,就報錯停止運作了:
#throw new assert.AssertionError({
^
AssertionError: 258 == 0
at ClientRequest.onConnect (C:\Users\fox\WebstormProjects\nodejs\实战\爬虫\node_modules\tunnel-agent\index.js:160:14)
如果我去掉代理的請求頭,一點事都沒有;如果我把上面download裡面,改成 不再繼續請求,直接cb(),請求失敗不會報錯。
.on('error',function(){
console.log('下载出现异常,可能是pipe有问题,再次请求...');
// download(item,cb);
cb(null,item);
})
請大佬看了,能不能幫我解決一下,想了很久,一直排錯,不知道什麼原因。
伊谢尔伦2017-06-21 10:14:18
我之前也做過幾乎和你一樣的功能,直接下載圖片很多下載了一部分,然後報錯了,最後我試著包裹一層setTimeout
,類似於:
setTimeout(function(){
download(item, cb);
},400);
這樣居然就好了,我為此寫了一篇博文的:nodejs批量下載圖片,你可以參考一下