Node.jsを使用したWebスクレイピングの究極のガイド

では、とにかくWebスクレイピングとは何ですか?これには、Webサイトから情報を収集するという面倒な作業を自動化することが含まれます。

Webスクレイピングには多くのユースケースがあります。価格比較サイトのためにさまざまなeコマースサイトから価格を収集することをお勧めします。または、旅行サイトのフライト時間とホテル/ AirBNBのリストが必要な場合もあります。セールスリードのためにさまざまなディレクトリからメールを収集したり、インターネットのデータを使用して機械学習/ AIモデルをトレーニングしたりすることができます。または、Googleのような検索エンジンを構築したいと思うかもしれません!

ウェブスクレイピングの開始は簡単で、プロセスは2つの主要な部分に分けることができます。

  • HTMLリクエストライブラリまたはヘッドレスブラウザを使用してデータを取得し、
  • データを解析して、必要な正確な情報を取得します。

このガイドでは、人気のあるNode.jsリクエストプロミスモジュール、CheerioJS、およびPuppeteerのプロセスについて説明します。このガイドの例を使用して、Node.jsで必要なデータを収集する際にプロになるために必要なすべてのヒントとコツを学びます。

ウィキペディアから米国大統領のすべての名前と誕生日のリストと、Redditのフロントページにあるすべての投稿のタイトルを収集します。

まず最初に:このガイドで使用するライブラリをインストールしましょう(PuppeteerはChromiumもダウンロードする必要があるため、インストールに時間がかかります)。

最初のリクエストをする

次に、新しいテキストファイル(ファイルpotusScraper.jsという名前)を開き、ウィキペディアの「大統領のリスト」ページのHTMLを取得するための簡単な関数を記述しましょう。

出力:

ChromeDevToolsの使用

かっこいい、Webページから生のHTMLを取得しました!しかし今、私たちはこの巨大なテキストの塊を理解する必要があります。そのためには、Chrome DevToolsを使用して、ウェブページのHTMLを簡単に検索できるようにする必要があります。

Chrome DevToolsの使用は簡単です。GoogleChromeを開き、削りたい要素を右クリックします(この場合、個々の大統領のWikipediaページすべてへのリンクを取得したいので、George Washingtonを右クリックします)。 :

ここで、[検査]をクリックするだけで、ChromeのDevToolsペインが表示され、ページのソースHTMLを簡単に検査できます。

Cheerio.jsを使用したHTMLの解析

すばらしいことに、Chrome DevToolsは、コードで探す必要のある正確なパターン(内部にハイパーリンクが含まれる「大きな」タグ)を表示しています。Cheerio.jsを使用して、以前に受け取ったHTMLを解析し、米国大統領の個々のWikipediaページへのリンクのリストを返しましょう。

出力:

正確に45個の要素(米国大統領の数)が返されることを確認します。つまり、ページの他の場所に余分な非表示の「大きな」タグがないことを意味します。これで、各要素の「属性」セクションからそれらを取得することにより、45の大統領ウィキペディアページすべてへのリンクのリストを調べて取得できます。

出力:

これで、45の大統領ウィキペディアページすべてのリストができました。新しいファイル(potusParse.jsという名前)を作成しましょう。このファイルには、大統領のWikipediaページを取得し、大統領の名前と誕生日を返す関数が含まれています。まず最初に、GeorgeWashingtonのWikipediaページから生のHTMLを取得しましょう。

出力:

もう一度ChromeDevToolsを使用して、解析するコードの構文を見つけて、Cheerio.jsで名前と誕生日を抽出できるようにします。

つまり、名前は「firstHeading」というクラスにあり、誕生日は「bday」というクラスにあることがわかります。Cheerio.jsを使用してこれら2つのクラスを抽出するように、コードを変更してみましょう。

出力:

すべてを一緒に入れて

完璧!これを関数にまとめて、このモジュールからエクスポートしましょう。

次に、元のファイルpotusScraper.jsに戻り、potusParse.jsモジュールを要求します。次に、それを以前に収集したwikiUrlのリストに適用します。

出力:

JavaScriptページのレンダリング

Voilà!45人の米国大統領全員の名前と誕生日のリスト。request-promiseモジュールとCheerio.jsだけを使用すると、インターネット上の大多数のサイトをスクレイプできるはずです。

ただし、最近、多くのサイトがJavaScriptを使用してWebサイトに動的コンテンツを生成し始めています。これにより、request-promiseやその他の同様のHTTPリクエストライブラリ(axiosやfetchなど)で問題が発生します。これらは最初のリクエストからの応答しか取得できませんが、WebブラウザのようにJavaScriptを実行できないためです。

したがって、JavaScriptの実行が必要なサイトをスクレイプするには、別のソリューションが必要です。次の例では、Redditのフロントページにあるすべての投稿のタイトルを取得します。前の例のようにrequest-promiseを使おうとするとどうなるか見てみましょう。

出力:

出力は次のようになります。

うーん…私たちが望んでいるものではありません。これは、実際のコンテンツを取得するには、ページでJavaScriptを実行する必要があるためです。Puppeteerの場合、それは問題ありません。

Puppeteerは、Google Chromeチームが提供する非常に人気のある新しいモジュールで、ヘッドレスブラウザを制御できます。これは、JavaScriptの実行を必要とするページをプログラムでスクレイピングするのに最適です。request-promiseの代わりにPuppeteerを使用してRedditのフロントページからHTMLを取得しましょう。

出力:

いいね!ページは正しいコンテンツでいっぱいです!

これで、前の例で行ったようにChromeDevToolsを使用できます。

Redditがタイトルを「h2」タグの中に入れているようです。Cheerio.jsを使用して、ページからh2タグを抽出してみましょう。

出力:

追加リソース

そして、リストがあります!この時点で、任意のWebサイトからデータを収集するための最初のWebスクレイパーを快適に作成できるはずです。Webスクレイピングの過程で役立つと思われる追加のリソースを次に示します。

  • Webスクレイピングプロキシサービスのリスト
  • 便利なウェブスクレイピングツールのリスト
  • ウェブスクレイピングのヒントのリスト
  • ウェブスクレイピングプロキシの比較
  • Cheerioドキュメント
  • Puppeteerのドキュメント