Maison  >  Article  >  interface Web  >  Exemple d'analyse de code d'un robot d'exploration multipage dans nodejs

Exemple d'analyse de code d'un robot d'exploration multipage dans nodejs

黄舟
黄舟original
2017-05-31 10:11:271597parcourir

Cet article présente principalement le robot d'exploration multipage basé sur nodejs L'éditeur pense qu'il est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un oeil.

Préface

J'ai revu le temps du front-endnode.js, donc j'en ai profité de la situation et créé un robot d'exploration. Approfondissez votre compréhension de node.

Les trois modules principalement utilisés sont request, cheerio et async

request

pour demander des adresses et un téléchargement rapide imagesflux.

cheerio

Une implémentation de base jQuery rapide, flexible et implémentée spécialement personnalisée pour le serveur.

Code HTML facile à analyser.

async

Appel asynchrone pour éviter le blocage.

Idée principale

  1. Utilisez la demande pour envoyer une demande. Obtenez le code html et obtenez la balise img et une balise.

  2. Faites un appel récursif à travers l'expression obtenue. Obtenez en continu l'adresse img et une adresse, continuez à récurer

  3. obtenez l'adresse img via request(photo).pipe(fs.createWriteStream(dir + «/» + filename)); pour un téléchargement rapide.

function requestall(url) {

 request({

  uri: url,

  headers: setting.header

 }, function (error, response, body) {

  if (error) {

   console.log(error);

  } else {

   console.log(response.statusCode);

   if (!error && response.statusCode == 200) {

    var $ = cheerio.load(body);

    var photos = [];

    $('img').each(function () {

     // 判断地址是否存在

     if ($(this).attr('src')) {

      var src = $(this).attr('src');

      var end = src.substr(-4, 4).toLowerCase();

      if (end == '.jpg' || end == '.png' || end == '.jpeg') {

       if (IsURL(src)) {

        photos.push(src);

       }

      }

     }

    });

    downloadImg(photos, dir, setting.download_v);

    // 递归爬虫

    $('a').each(function () {

     var murl = $(this).attr('href');

     if (IsURL(murl)) {

      setTimeout(function () {

       fetchre(murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     } else {

      setTimeout(function () {

       fetchre("http://www.ivsky.com/" + murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     }

    })

   }

  }

 });

}

Anti-pits

1 Lorsque la demande est téléchargée via l'adresse de l'image, liez l'erreur événement <.> pour éviter une interruption anormale de Crawler.

2. Limitez la simultanéité via la

mapLimit d'async.

3. Ajoutez un en-tête de requête pour empêcher le blocage de l'IP.


4. Obtenez des photos et des

hyperliens adresses, qui peuvent être des chemins relatifs (à déterminer s'il existe une solution).

function downloadImg(photos, dir, asyncNum) {

 console.log("即将异步并发下载图片,当前并发数为:" + asyncNum);

 async.mapLimit(photos, asyncNum, function (photo, callback) {

  var filename = (new Date().getTime()) + photo.substr(-4, 4);

  if (filename) {

   console.log(&#39;正在下载&#39; + photo);

   // 默认

   // fs.createWriteStream(dir + "/" + filename)

   // 防止pipe错误

   request(photo)

    .on(&#39;error&#39;, function (err) {

     console.log(err);

    })

    .pipe(fs.createWriteStream(dir + "/" + filename));

   console.log(&#39;下载完成&#39;);

   callback(null, filename);

  }

 }, function (err, result) {

  if (err) {

   console.log(err);

  } else {

   console.log(" all right ! ");

   console.log(result);

  }

 })

}

Test :


On sent que la vitesse est relativement rapide.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn