ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs でのマルチページ クローラーのサンプル コード分析

Nodejs でのマルチページ クローラーのサンプル コード分析

黄舟
黄舟オリジナル
2017-05-31 10:11:271598ブラウズ

この記事では主にnodejsをベースにしたマルチページクローラーを紹介していますが、編集者がとても良いと思ったので、参考として共有させていただきます。編集者をフォローして一緒に見てみましょう

前書き

フロントエンドの時間を改めて見直したnode.jsので、この状況を利用してnodeの理解を深めるためにクローラーを作成しました。

主に使用される 3 つのモジュールは、request、cheerio、async です。

request

は、アドレスを要求し、写真ストリームを迅速にダウンロードするために使用されます。

cheerio

サーバー用に特別にカスタマイズされており、高速、柔軟で、jQueryコア実装が実装されています。

HTMLコードを解析するのが簡単です。

async

ブロックを防ぐための非同期呼び出し。

コアアイデア

  1. リクエストを送信するにはリクエストを使用します。 HTMLコードを取得し、imgタグとタグを取得します。

  2. 取得した式を介して再帰呼び出しを行います。継続的に img アドレスとアドレスを取得し、再帰を続けます

  3. 高速ダウンロードのために request(photo).pipe(fs.createWriteStream(dir + “/” + filename)); を通じて img アドレスを取得します。

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;

     }

    })

   }

  }

 });

}

アンチピット

1. リクエストがイメージアドレスを通じてダウンロードされるとき、クローラーの異常な中断を防ぐためにエラーイベントをバインドします。

2. async の mapLimit を通じて同時実行を制限します。

3. IP がブロックされないようにリクエスト ヘッダーを追加します。

4. いくつかの写真と ハイパーリンク アドレスを取得します。これらは相対パスである可能性があります (解決策があるかどうかを検討するため)。

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('正在下载' + photo);

   // 默认

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

   // 防止pipe错误

   request(photo)

    .on('error', function (err) {

     console.log(err);

    })

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

   console.log('下载完成');

   callback(null, filename);

  }

 }, function (err, result) {

  if (err) {

   console.log(err);

  } else {

   console.log(" all right ! ");

   console.log(result);

  }

 })

}

テスト:


比較的スピードが速いと感じられます。

以上がNodejs でのマルチページ クローラーのサンプル コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。