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.
我之前也做过几乎和你一样的功能,直接下载图片很多下载了一部分,然后报错了,最后我试着包裹一层
setTimeout
,类似于:这样居然就好了,我为此写了一篇博文的:nodejs批量下载图片,你可以参考一下
遇到这种问题,程序要有重试机制。
一个好的重试机制是:在下一次尝试的时候,适当的增加sleep时间确保正确的执行。