Node.jsでスクレイピング | Axios+Cheerio vs. Puppeteer

今回はNode.jsを使用したスクレイピングをする方法を解説していきます。

スクレイピングとは、webサイトからデータや情報を収集するためのプロセスです。

主な目的としては

  • 市場調査
  • データ分析
  • 競合分析
  • ニュース収集
  • 価格比較

など、さまざまな目的で利用されます。これらを実現したい人たちに向けて、スクレイピングを行う方法を紹介していきます。

ただし、webスクレイピングはwebサイトの利用規約に違反する場合があります。スクレイピングを行う前に、対象のウェブサイトの利用規約やrobots.txtを確認し、許可されているかどうかを確認してください。

また、スクレイピングの頻度にも注意してください。過度なリクエストを送信するとサーバーに負荷をかけることになり、問題を引き起こす可能性があります。

手軽にスクレイピング | Axios+Cheerio

この章では、axioscheerioを使用した基本的なスクレイピングの手順を説明します。

後述するPuppeteerでのスクレイピングの方法と比較すると手軽にスクレイピングを実現する事が可能です。

まず、Node.jsプロジェクトを作成し、必要なモジュールをインストールします。

mkdir scraping-project
cd scraping-project
npm init -y
npm install axios cheerio

npm install でスクレイピングを行うために必要なモジュールをインストールしています。

実際のスクレイピングするコードを用意していきます。

const axios = require('axios');
const cheerio = require('cheerio');

// スクレイピング対象のURL
const url = 'https://rensaba-programer.jp';

// axiosを使ってHTMLを取得
axios.get(url)
  .then(response => {
    // HTMLをcheerioでロード
    const $ = cheerio.load(response.data);

    // 必要な情報を抽出
    const title = $('h1').text();
    const description = $('meta[name="description"]').attr('content');

    console.log('タイトル:', title);
    console.log('説明:', description);
  })
  .catch(error => {
    console.error('エラー:', error);
  });

この例では、axiosを使って指定したURLからHTMLを取得し、cheerioを使ってHTMLをパースして必要な情報を抽出しています。

ここでの例では、<h1>タグ内のテキストと<meta name="description">タグのcontent属性を抽出しています。

実際の実行結果はこちらになります

$ node sample.js 
タイトル: レン鯖プログラマー
説明: システム制作のプロであるプログラマ目線でレンタルサーバーを使いこなす日々を書いていきます。

cheerio モジュールはjQueryのようにdomの取得が可能になるため、わかりやすく、柔軟な記述方法が可能になります。

JavaScriptを実行しながらスクレイピング | Puppeteer

最近のweb開発の手法は目覚ましい発展を遂げており、ブラウザ上でアプリケーションのような操作感を実現させる方法としてJavaScriptが多様されるようになりました。

中でも、特殊なUIの実装であったり滑らかなページ遷移を実現する方法としてSPA (Single Page Application)と呼ばれる、単一のページでコンテンツの切り替えを行うwebアプリケーションがあり、JavaScriptを実行させないと表示されないコンテンツが存在します。

そういったJavaScriptを実行させてコンテンツを表示させるのはスクレイピングでは苦手分野なのですが、解決する方法も存在します。

この章で紹介する Puppeteer はヘッドレスブラウザと呼ばれるプログラム上から実行できるブラウザ操作を行い、JavaScriptを実行しながらwebページを操作し、スクレイピングを行うことができます。

まず、Node.jsプロジェクトを作成し、Puppeteerをインストールします。

mkdir puppeteer-scraping
cd puppeteer-scraping
npm init -y
npm install puppeteer

次に、Puppeteerを使用してウェブページをスクレイピングする基本的な例です。

const puppeteer = require("puppeteer");

(async () => {
  // ブラウザを起動
  const browser = await puppeteer.launch({
    headless: 'new',
  });

  // 新しいページを開く
  const page = await browser.newPage();

  // スクレイピング対象のURLを開く
  const url = "https://rensaba-programer.jp";
  await page.goto(url);

  // 必要な情報を抽出
  const title = await page.$eval("h1", h1 => h1.textContent);
  const description = await page.$eval(
    'meta[name="description"]',
    meta => meta.content
  );

  console.log("タイトル:", title);
  console.log("説明:", description);

  // ブラウザを閉じる
  await browser.close();
})();

このコードでは、Puppeteerを使用してブラウザを起動し、指定したURLにアクセスしています。page.$eval()メソッドを使用して、ページ内の要素からテキストや属性を抽出しています。

実行すると以下になります。

% node sample.js
タイトル: レン鯖プログラマー
説明: システム制作のプロであるプログラマ目線でレンタルサーバーを使いこなす日々を書いていきます。

Puppeteerは非常に強力であり、webページ上のクリックやフォーム入力などの操作もシミュレートすることができます。

前述のaxiosと比べると実現できる機能が多い反面、実行環境によってはヘッドレスブラウザの導入に手間が発生する場合があります。

ちなみに、Chromeブラウザでは「Recorder」という機能があり、ブラウザ操作を記録して繰り返し実行することができます。その繰り返しコードを puppetter で出力することも可能となっています。

https://developer.chrome.com/docs/devtools/recorder/reference/

終わりに

以上、Node.jsでスクレイピングをする方法として2つの実装を紹介してきました。

スクレイピングは非常に強力なツールですが、ウェブサイトの利用規約や倫理的な側面を尊重しながら使用することが重要です。

また、ウェブサイトの構造が変更された場合などにはスクレイピングコードも修正する必要があることに注意してください。