クローラーの主な目的は、インターネット上で公開されている特定のデータを収集することです。このデータを使用して、いくつかの傾向を分析して比較したり、深層学習などのモデルをトレーニングしたりできます。この号では、Web クローリングに特に使用されるnode.js
パッケージ、 node-crawler
を紹介し、それを使用して Web ページ上の画像をクロールし、ローカルにダウンロードする単純なクローラーのケースを完成させます。
node-crawler
、効率と利便性の両方を考慮した軽量のnode.js
クローラー ツールで、分散クローラー システム、ハード コーディング、および http フロントエンド エージェントをサポートします。さらに、完全にnodejs
で記述されており、本質的にノンブロッキングの非同期 IO をサポートしているため、クローラーのパイプライン操作メカニズムに非常に便利です。同時に、 DOM
の素早い選択 ( jQuery
構文を使用できます) をサポートします。これは、Web ページの特定の部分をクロールするタスクにとってキラー機能と言えます。正規表現を手書きする必要はありません。クローラー開発の効率が向上します。
、まず新しいプロジェクトを作成し、エントリーファイルとしてindex.jsを作成します。
次に、クローラー ライブラリnode-crawler
をインストールします。
#PNPM pnpm クローラーを追加 #NPM npm i-S クローラー #糸 糸でクローラーを追加し
、 require
を使用して導入します。
// インデックス.js const Crawler = require("crawler");
//index.js let クローラ = 新しいクローラ({ タイムアウト:10000、 jQuery: true、 }) 関数 getImages(uri) { クローラー.キュー({ ウリ、 コールバック: (エラー、解決、完了) => { if (err) エラーをスローします。 } })ここからは
、
crawler
がインスタンス化された後、HTML ページの画像を取得するメソッドの作成を開始します。これは主に、キューにリンクとコールバック メソッドを書き込むために使用されます。このコールバック関数は、各リクエストが処理された後に呼び出されます。
ここで、 Crawler
request
ライブラリを使用するため、 Crawler
設定に使用できるパラメータ リストはrequest
ライブラリのパラメータのスーパーセットであることにも注意してください。つまり、 request
ライブラリ内のすべての設定はCrawler
に適用できます。
先ほどjQuery
パラメーターも見たかもしれませんが、ご想像のとおり、 jQuery
構文を使用してDOM
要素をキャプチャできます。
// インデックス.js データを = [] にします 関数 getImages(uri) { クローラー.キュー({ ウリ、 コールバック: (エラー、解決、完了) => { if (err) エラーをスローします。 $ = res.$ とします。 試す { $imgs = $("img"); Object.keys($imgs).forEach(index => { img = $imgs[インデックス]; const { タイプ、名前、属性 = {} } = img; src = attribs.src にします || if (type === "tag" && src && !data.includes(src)) { fileSrc = src.startsWith('http') src : `https:${src}` ? let fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // 写真のダウンロード方法 data.push(src) } }); } キャッチ (e) { コンソール.エラー(e); 終わり() } 終わり(); } })
$
使用してリクエスト内のimg
タグをキャプチャしたことがわかります
。
次に、次のロジックを使用して完成した画像へのリンクを処理し、後で保存して名前を付けられるように名前を削除します。ここでは配列も定義されています。その目的は、キャプチャされた画像アドレスを保存することです。次のキャプチャで同じ画像アドレスが見つかった場合、ダウンロードは繰り返し処理されません。
以下は、 $("img")
使用して Nuggets のホームページ HTML をキャプチャして出力される情報です。
イメージをダウンロードする前に、
nodejs
パッケージ - axios
をインストールする必要があります。はい、よくお読みください。axios axios
フロントエンド用に提供されているだけでなく、バックエンドでも使用できます。ただし、画像のダウンロードはデータ ストリームに処理する必要があるため、 responseType
stream
に設定されます。その後、 pipe
メソッドを使用してデータ フロー ファイルを保存できます。
const { デフォルト: axios } = require("axios"); const fs = require('fs'); 非同期関数 downloadFile(uri, name) { let dir = "./imgs" if (!fs.existsSync(dir)) { await fs.mkdirSync(dir) } filePath = `${dir}/${name}` にします let res = await axios({ URL: うり、 応答タイプ: 'ストリーム' }) let ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("閉じる",()=>{ ws.close(); })
画像がたくさんある可能性があるため、それらを 1 つのフォルダーに入れたい場合は、そのようなフォルダーがあるかどうかを確認する必要があります。ない場合は、フォルダーを作成します
。
次に、 createWriteStream
メソッドを使用して、取得したデータ ストリームをファイルの形式でフォルダーに保存します。
次に、Nuggets のホームページの HTML の下にある画像をキャプチャしてみましょう。
//index.js getImages("https://juejin.cn/") を実行すると、
静的 HTML 内のすべての画像がキャプチャされたことがわかります。
ノードインデックス.js
結論
最後に、このコードは SPA (シングル ページ アプリケーション) では機能しない可能性があることもわかります。シングルページ アプリケーションには HTML ファイルが 1 つしかなく、Web ページ上のすべてのコンテンツが動的にレンダリングされるため、データ リクエストを直接処理して必要な情報を収集できます。 。
もう 1 つ言いたいのは、多くの友人がrequest.js
使用して画像をダウンロードするリクエストを処理していることです。もちろん、これは可能であり、コードの量も少なくなりますが、私が言いたいのは、このライブラリはすでに使用されているということです。 2020 年には非推奨となります。常に更新および保守されているライブラリに変更することをお勧めします。