Node.jsでWebスクレイピングを実現できる4つのツール
読む所要時間: 9 分
必要なデータをオンラインで入手できる場合でも、専用のREST APIが使えるとは限りません。幸いなことに、JavaScript開発者向けにNode.js用のさまざまなツールが用意されており、Webサイトから直接データのスクレイピングと解析を行い、プロジェクトやアプリケーションで使用できます。
ここでは、4つのライブラリーを取り上げ、その機能とともにそれぞれを比較して説明します。
コンピューターに最新バージョンのNode.js(16.14.2以上)とnpmがインストールされていることを確認してください。ターミナルを開き、コードを格納するディレクトリで次のコマンドを実行します。
本稿で構築する一部のアプリケーションにではGotライブラリーを使用してHTTPリクエストを行うため、次のコマンドを使用して同じディレクトリにインストールします。
こちらのWebページにあるVideo Game Music Archiveには、さまざまなNintendoゲームミュージックが収録されています。ここから固有のMIDIファイルを参照するリンクを探す処理を今回ご紹介するライブラリーのサンプル課題として使用します。
Webスクレイピングのためのヒント
各ツールを紹介する前に、どの方法を選ぶ場合でも役に立つ共通のテーマがあります。
必要なコンテンツを解析するコードを作成するには、一般的にブラウザが表示するHTMLを参照する必要があります。Webページはそれぞれに異なるため、適切なデータを取得するには少し工夫を凝らし、パターン認識などを試みることになります。
最新のほとんどのブラウザは、開発者用の便利なツールが利用できます。対象の要素を右クリックするだけで、その要素のHTMLを詳しく調べることができます。
次のコードで、前述したVideo Game Music ArchiveページにあるMIDIファイルのリンクを、すべて収集します。
非常にシンプルなクエリセレクタa
を使用してページ上にあるすべてのハイパーリンクにアクセスし、いくつかの関数によりコンテンツをフィルタリングし、必要なMIDIファイルのみを取得しています。noParens()
フィルター関数は、正規表現をもとに括弧を含むMIDIファイル(同じ曲の別バージョン)を除外します。
コードをindex.js
ファイルに保存し、ターミナルでnode index.js
コマンドを実行します。
このライブラリーのさらに詳しい説明についてはjsdomの使用方法を説明したチュートリアルで取り上げています。
Cheerio
Cheerioはjsdomと同様のライブラリーですが、より軽量で高速に実行が可能です。jQueryコアのサブセットが実装され、多くのJavaScript開発者が慣れ親しんだAPIが提供されます。
インストールするには、次のコマンドを実行します。
先ほどと同様のタスクを実行するために必要なコードは非常に似ています。
コンテンツのフィルタリングを行う関数は、CheerioのAPIに組み込まれているので、コードを追加して要素コレクションを配列に変換する必要はありません。index.js
内のコードを、上記のコードに置き換えて再度実行します。Cheerioは軽量なライブラリーのため、かなり高速で実行されます。
さらに詳しい説明は、こちらのCheerioの使用方法のチュートリアルで取り上げています。
Puppeteer
Puppeteerが前述のライブラリ2つと大きく異なる点は、ヘッドレスのブラウザスクリプティング用ライブラリーであることです。DevToolsプロトコルを介してChrome/Chromiumをコントロールする、ハイレベルなAPIが提供されます。固定データの読み取りだけでなく、Webアプリケーションと対話して操作するコードを作成できるため、より多目的に使えます。
インストールするには、次のコマンドを実行します。
Puppeteerを使用したWebスクレイピングは先の2つと大きく異なります。URLからHTMLコードを取得しオブジェクトに提供するコードではなく、与えられたURLのHTMLを処理し、実際のドキュメントオブジェクトモデルが構築されたブラウザコンテキスト上で動作するコードを記述することになります。
次のコード例は、Puppeteerのブラウザに目的のURLを参照させ、先に解析したものと同じハイパーリンク要素すべてにアクセスするよう指示しています。
ページのリンクに対してフィルタリングを行うために、いくつかのロジックを作成していますが、フィルター関数をさらに宣言するのではなく、インラインで処理しています。ブラウザに何をすべきかを指示するサンプルコードもありますが、別のNodeモジュールを使用して、スクレイピングしようとしているWebサイトにリクエストを送る必要はありません。Puppeteerはこのような単純な処理でも他のツールに比べて非常に時間がかかりますが、コンテンツが静的でないページを扱う場合には大変便利なツールです。
その他のPuppeteerの機能を利用して動的なWebアプリケーションを操作する方法の詳細は、Puppeteerの使用法を詳しく説明したチュートリアルで取り上げています。
Playwright
Playwrightも、ヘッドレスのブラウザスクリプティング用のライブラリーであり、Puppeteerと同じ開発チームが作成したものです。APIと機能はPuppeteerとほぼ同じですが、異なるブラウザでの使用を想定してあり、Chrome/ChromiumのほかにFireFoxやWebkitでも使用できます。
インストールするには、次のコマンドを実行します。
今回のタスクを実行するPlaywrightのコードは前述のライブラリとほぼ同じですが、使用するブラウザを明示的に宣言する必要があります。
Puppeteerで紹介したコードと同じ機能が、同じように実行されます。Playwrightのメリットは、複数種類のブラウザで使用できる多用途性にあります。このコードを他のブラウザで実行し、どのように機能するか試してみてください。
他のライブラリーと同じく、Playwrightの使用法を紹介したチュートリアルで詳しく取り上げています。
広大なWorld Wide Webを活用するために
これでプログラムを使用してWebページのコンテンツを収集できるようになり、膨大なデータにアクセスし、あらゆるプロジェクトのニーズに応えることができます。ただし、1つ注意すべき点があります。WebページのHTMLが変更されるとコードが機能しなくなることがあるため、スクレイピングを活用するアプリケーションの作成では、すべての要素を最新の状態にしておく必要があります。
皆さんが何を構築されるか、とても楽しみです。体験談の共有やご質問など、どうぞお気軽にお問い合わせください。
- Email: sagnew@twilio.com
- Twitter: @Sagnewshreds
- Github: Sagnew
- Twitch (streaming live code): Sagnewshreds