Heim > Fragen und Antworten > Hauptteil
Ich habe zum Crawlen von Bildern eine Anfrage verwendet, um zu verhindern, dass die IP-Adresse blockiert wird. Nach der Verwendung des Proxys habe ich jedoch immer einen Fehler gemeldet. nodejs verwendet Anforderungs- und asynchrone Module
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 ist die Rückruffunktion des Kontrollflusses in async:
async.eachLimit(items,10,function(item,cb){
download(item,cb);
},function(){...})
Jedes Mal, wenn nach dem Herunterladen einiger Dateien ein Fehler auftritt und der Vorgang abgebrochen wird:
throw new assert.AssertionError({
^
AssertionError: 258 == 0
at ClientRequest.onConnect (C:\Users\fox\WebstormProjects\nodejs\实战\爬虫\node_modules\tunnel-agent\index.js:160:14)
Wenn ich den Proxy-Anfrage-Header entferne, passiert nichts; wenn ich den obigen Download so ändere, dass die Anfrage nicht mehr fortgesetzt wird und direkt cb(), wird kein Fehler gemeldet, wenn die Anfrage fehlschlägt.
.on('error',function(){
console.log('下载出现异常,可能是pipe有问题,再次请求...');
// download(item,cb);
cb(null,item);
})
Bitte werfen Sie einen Blick darauf und sehen Sie, ob Sie mir bei der Lösung des Problems helfen können. Ich habe lange darüber nachgedacht, aber ich weiß nicht, warum.
伊谢尔伦2017-06-21 10:14:18
我之前也做过几乎和你一样的功能,直接下载图片很多下载了一部分,然后报错了,最后我试着包裹一层setTimeout
,类似于:
setTimeout(function(){
download(item, cb);
},400);
这样居然就好了,我为此写了一篇博文的:nodejs批量下载图片,你可以参考一下