この記事では主にnodejsをベースにしたマルチページクローラーを紹介していますが、編集者がとても良いと思ったので、参考として共有させていただきます。編集者をフォローして一緒に見てみましょう
前書き
フロントエンドの時間を改めて見直したnode.jsので、この状況を利用してnodeの理解を深めるためにクローラーを作成しました。
主に使用される 3 つのモジュールは、request、cheerio、async です。
request
は、アドレスを要求し、写真ストリームを迅速にダウンロードするために使用されます。
cheerio
サーバー用に特別にカスタマイズされており、高速、柔軟で、jQueryコア実装が実装されています。
HTMLコードを解析するのが簡単です。
async
ブロックを防ぐための非同期呼び出し。
コアアイデア
リクエストを送信するにはリクエストを使用します。 HTMLコードを取得し、imgタグとタグを取得します。
取得した式を介して再帰呼び出しを行います。継続的に img アドレスとアドレスを取得し、再帰を続けます
高速ダウンロードのために 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 サイトの他の関連記事を参照してください。