recherche

Maison  >  Questions et réponses  >  le corps du texte

node.js - robot d'exploration de nœuds, demande de définition de proxy, signale toujours une erreur pour obtenir de l'aide

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.

学习ing学习ing2715 Il y a quelques jours1059

répondre à tous(2)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-06-21 10:14:18

    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 à :

    .
    setTimeout(function(){
        download(item, cb);
    },400);

    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

    répondre
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-21 10:14:18

    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.

    répondre
    0
  • Annulerrépondre