J'ai utilisé la requête pour explorer les images. Afin d'éviter le blocage de l'adresse IP, j'ai utilisé un proxy. Cependant, après avoir utilisé le proxy, j'ai toujours signalé une erreur. nodejs utilise des modules de requête et asynchrones
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 est la fonction de rappel du flux de contrôle en async :
async.eachLimit(items,10,function(item,cb){
download(item,cb);
},function(){...})
A chaque fois après le téléchargement de quelques fichiers, une erreur se produit et l'opération s'arrête :
throw new assert.AssertionError({
^
AssertionError: 258 == 0
at ClientRequest.onConnect (C:\Users\fox\WebstormProjects\nodejs\实战\爬虫\node_modules\tunnel-agent\index.js:160:14)
Si je supprime l'en-tête de la requête proxy, rien ne se passera ; si je modifie le téléchargement ci-dessus pour ne plus continuer la requête et directement cb(), aucune erreur ne sera signalée si la requête échoue.
.on('error',function(){
console.log('下载出现异常,可能是pipe有问题,再次请求...');
// download(item,cb);
cb(null,item);
})
Veuillez jeter un œil et voir si vous pouvez m'aider à le résoudre. J'y réfléchis depuis longtemps et je le dépanne, je ne sais pas pourquoi.
J'ai fait presque la même fonction que vous auparavant, en téléchargeant directement un grand nombre d'images. J'en ai téléchargé une partie, puis j'ai signalé une erreur. Enfin, j'ai essayé d'envelopper un calque
.setTimeout
, similaire à :C'est en fait bien, j'ai écrit un article de blog à ce sujet : nodejs batch downloading pictures, vous pouvez vous y référer
Lorsque vous rencontrez ce genre de problème, le programme doit disposer d'un mécanisme de nouvelle tentative.
Un bon mécanisme de nouvelle tentative est le suivant : lors de la prochaine tentative, augmentez le temps de veille de manière appropriée pour garantir une exécution correcte.