Cheerio と Puppeteer による Web スクレイピング

Puppeteer と Cheerio でそれぞれ Web スクレイパーを作成して、それぞれの違いを見てみましょう。
3 min read
Cheerio vs. Puppeteer featured image

 Node.js の Web スクレイピングツールを選択する場合、いくつかの選択肢があります。最も一般的なものとして、Cheerio と Puppeteer の 2 つがあります。

HTML 文書の解析と操作を目的とした、より高性能な jQuery として、Cheerio は作成されました。Puppeteer の場合、Web ページとアプリケーションのテストを自動化するために作成されました。

いずれにせよ、どちらのツールも Web スクレイピングに利用できます。Cheerio は Web ページの HTML を解析して必要な情報を見つけることができ、Puppeteer は、JavaScript を使用する動的サイトを Web ブラウザで自動的にスクレイピングできます。

この記事では、これらツールを紹介しつつ、機能、パフォーマンス、使いやすさの点で比較します。

Cheerio vs.Puppeteer

Cheerio と Puppeteer には大きな違いが 1 つあります。Cheerio は HTML パーサーであり、Puppeteer はブラウザ自動化ツールになります。つまり、この 2 つのツールの動作は大きく異なります。

Cheerio では、HTML 文書を取得して CSS セレクタ を介して任意の HTML 要素を見つけることができます。

例えば、次のセレクタをご覧ください。 h1 タグを持つ要素を検索します:

const title = $('h1');

このセレクタは次のような HTML コードで実行できます ( example.comから引用)。

<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>

この結果、Cheerio は h1 要素を返します。この要素から見出し名などの情報を抽出できます:

    <h1>Example Domain</h1>

Cheerio を使用するには、axios といったライブラリを使い、まず Web ページの HTML コードを取得します。その後、HTML コードを解析して必要な情報を見つけます。

例えば、次のコードサンプルは example.com の HTML コードをダウンロードして解析し、h1 要素のテキストを検索します:

(async () => {

  const url = 'https://example.com/';
  const response = await axios.get(url); // get HTML
  const $ = cheerio.load(response.data); // parse HTML with Cheerio
  const title = $('h1'); // use selectors to find data you need
  console.log(title.text());

})();

対して、Puppeteer は専用のブラウザインスタンスで Web ページを開き、ブラウザインスタンスが持つ機能を利用して動作します。つまり、対象ページの HTML には記述されていない JavaScript 要素とやり取りができます。例えば、ボタンをクリックしてナビゲーションしたり、ページをスクロールしたり、ページのコンテキストで JavaScript を実行したりすることができます。

こちらがスクリプトの例で、ブラウザを起動してページを開き、すべての h1 要素のタイトルを抽出します。Cheerio と比較すると、Puppeteer の場合、詳細情報ボタンなどのクリック可能な要素を見つけて、それらをナビゲーションに使用することもできます。

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: null
  });

  const page = await browser.newPage(); // open browser
  await page.goto('https://example.com/'); // go to the page

  const title = await page.evaluate(async () => { // use selectors to find data you need

    const h1 = document.querySelector('h1');
    return h1.textContent;
  });

  console.log(title);

  more_information = await page.waitForSelector('a');  // can also click on elements!
  await more_information.click();

  await new Promise(r => setTimeout(r, 2000));

  await browser.close(); // close the browser

})();

運用上の違いもあり、JavaScript を使用してアプリのようにインタラクティブに動作させる最近の Web サイトをスクレイピングするのに、Puppeteer は適しています。一方、Cheerio の方はブログなどの静的 Web サイトに適しています。

機能

必要な情報がすべて含まれているページを開くと、どちらのライブラリも CSS セレクタを使用して必要な情報を検索、抽出します。

Cheerio は jQuery ライクなビルトイン構文を使用して情報を検索するため、多くの JavaScript 開発者には使いやすくなっています。

const title = $('h1');

Puppeteer は通常、ページ上の JavaScript(特に QuerySelector と QuerySelectorAll メソッド)を評価し、結果を返すことで情報を特定します:

  const title = await page.evaluate(async () => {

    const h1 = document.querySelector('h1');
    return h1.textContent;
  });

ブラウザ上で実行される Puppeteer には他にも機能があります。たとえば、ページを開いている間、Puppeteer はユーザーが実行可能なアクションすべてを実行できます。


await button.click(); \\ clicking
await form.type('User'); \\ typing 

これにより、登録や認証といったあらゆるユーザーフローを通過させることができます。また、Web サイトの UI を使用して情報を検索したり、通常は表示されない情報を見つけることができます。

例えば、ログインが必要な Web サイトがあったとしても、Puppeteer を使えば、必要なフィールドをクリックしてユーザー名とパスワードを入力するだけで、簡単にログインできます。その後はブラウザが処理します。一方、Cheerio は Web セッションを管理するのではなく、単一のページしか解析できないので、技術的にはアカウントにログインすることはできません。

Puppeteer は任意の JavaScript を実行してページのコンテンツを操作することもできます。これは通常、ページをスクロールするために使用されます。したがって、Puppeteer を使用すれば無限スクロールで Web サイトをスクレイピングできますが、Cheerio は最初のページしか読み込むことができません。また、カスタムのスクレイピング防止対策も簡単に回避できます。

ブラウザの自然な挙動でスクレイピングを実行できるということは、デバッグにも最適です。 ヘッドレスモード を無効にすると、実行を監視し、実行時の Web サイトの問題を確認できます。

パフォーマンス

Puppeteer は Web スクレイピングを実装するためにブラウザを起動して実行する必要があり、スクリプトの起動と実行には時間がかかり、Cheerio よりも多くのコンピューティングリソースを要します。

例えば、以下は基本的な Web ページをライブラリがスクレイピングするのにかかる時間を簡単に確認したものです。

次のスクリプトを使用すると、Bright Data のブログページを開き、最初のページからブログ投稿のリンクを抽出できます。

Cheerio

async function cheerio_scrape() {

  const url = 'https://brightdata.com/blog';
  const response = await axios.get(url);
  const $ = cheerio.load(response.data);
  const h5s = $('h5');
  let titles = []
  h5s.each((i, el) => titles.push($(el).text().trim()));
  console.log(titles);

};

Puppeteer

async function puppeteer_scrape() {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: null
  });

  const page = await browser.newPage();
  await page.goto('https://brightdata.com/blog');


  await page.waitForSelector('h5');

  const titles = await page.evaluate(async () => {

    let titles = [];
    const h5s = document.querySelectorAll('h5');
    h5s.forEach(el => titles.push(el.textContent.trim()));
    return titles;
  });

  console.log(titles);
 await browser.close();
};

これで、両機能の実行時間を計測できます。

次のコードは Cheerio スクリプトの実行時間を計測します。通常、500 ミリ秒程度かかります(ご利用の環境により結果が異なる場合があります)。

let start = Date.now();
cheerio_scrape().then(() => {
  let end = Date.now();
  console.log(`Execution time: ${end - start} ms`);
});

次のコードは Puppeteer スクリプトの実行時間を計測します。

let start = Date.now();
puppeteer_scrape().then(() => {
  let end = Date.now();
  console.log(`Execution time: ${end - start} ms`);
});

Puppeteer では、スクリプトの完了までに 4,000 ミリ秒程度かかり、Cheerio の 500 ミリ秒と比べて大幅に長くなります。

使いやすさ

Web スクレイピングに慣れていない場合は、ページの HTML コードだけで動作する Cheerio の方が適しているかもしれません。ユーザーは Web 要素を操作したり、読み込み時間に合わせてスクリプトを調整する必要がないため、適切なセレクタの作成など、Web スクレイピングの重要な作業に集中できます。

さらに、Cheerio では、ダウンロード後に Web ページの HTML コードが変わってしまうことはありません。対照的に、JavaScript を実行していて、その影響を常に受ける Web サイトでは、HTML の内容が常に変化し、変更のタイミングを予測することは容易ではありません。

このため、ブラウザ自動化ツールは待機時間を設けます。特に Puppeteer には WaitForSelector 関数があり、ページに要素が存在するかどうか、といった条件が満たされるまで待機します。一定の時間(デフォルトは 30 秒)経過しても要素が存在しない場合、スクリプトはエラーを返します。

await page.waitForSelector('h1')

正しく設定を行わないと、大幅な遅延が発生するなどして、スクリプトの信頼性の低下につながることがあります。

さらに、Cheerio の構文は JavaScript 開発者にとっては、シンプルでよりなじみ深く感じられるはずです。Puppeteer は強力ではあるものの、使い始めれば、Web スクレイピング専用に開発されていないことがわかるでしょう。

結論

この記事では、JavaScript エコシステムでよく使われる 2 つの Web スクレイピングライブラリである Cheerio と Puppeteer について見てきました。操作方法の違いにより、それぞれに長所と短所があります。静的ページを対象とする単純な Web スクレイピングスクリプトなら Cheerio の方がはるかに適していますが、Puppeteer は JavaScript が惜しみなく使用された最新の Web ページから情報をスクレイピングする場合に役立ちます。

これらのツールはどちらも正確には Web スクレイピング専用ツールではないことに注意してください。これらのツールには HTML 操作やブラウザの自動化機能が備わっているため、Web サイトをスクレイピングしたい開発者が好んで使用しています。ただし、これらのツールが提供するインターフェースには、必ずしも Web スクレイピングを行う人の要望やニーズに合わせてカスタマイズされているわけではありません。

強力で使いやすいソリューションをお探しの場合は、包括的な Web スクレイピングサービスである Bright Dataをご確認ください。Web サイトをスクレイピングしたりブラウザを自動化したりするためのツールに加えて、Bright Data は最大の プロキシサービスプロバイダーであり、多数のフォーチュン 500 企業と 20,000 を超える顧客にサービスを提供しています。世界中に広がる Bright Data のプロキシネットワークの一部をご紹介いたします。

今すぐ無料トライアルを始めましょう。