nodejs + cheerioでスクレイピングするサンプルコード


nodejsを使ってスクレイピングをするための方法とソースコードのサンプルを紹介します。

AWS Lambdaでスクレイピングをする処理を作ろうと思い、試行したノウハウをまとめています。

nodejsでスクレイピングをする方法

スクレイピングをする方法は大きくヘッドレスブラウザを使うか、HTMLパーサを使用するかの2つになるかと思います。

ヘッドレスブラウザは画面なしでブラウザを動かす仕組みです。レンダリングや処理が完了した後の画面を解析出来るため、SPAを使ったサイト等も解析できるメリットがありますが、その分処理時間が長く、リソースも多く消費します。nodejsではpuppeteerを使ってヘッドレスChromeを動かすのが主流かと思います。

HTMLパーサは、静的なHTMLをパーサで解析する方法で、SPAなどの動的なサイトの解析には向きませんが、軽量でリソースの消費が少ないメリットがあります。nodejsではcherrioが使いやすいかと思います。

AWS Lambdaはライブラリも含めてソースは50Mと上限があり、処理時間×メモリ使用量で料金が発生するため、軽量かつ高速なcheerioを使うことにしました。SPAなど動的なサイトでない場合はcheerioで十分かと思いますので、以降はcheerioを使ったソースコードサンプルを紹介します。

cheerioを使ったソースコードサンプル

以下、cheerioを使ったスクレイピングを行うソースコードのサンプルになります。

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

const url = 'https://sample.co.jp/index.html';

https.get(url, function(res) {
  console.info("response code: " + res.statusCode);
  var data = "";

  // (1) レスポンスHTMLをdataに格納
  res.on("data", function(chunk) {
    data += chunk;
  });
  res.on("end", function() {
    const $ = cheerio.load(data); //(2) レスポンスHTMLをパース
    var target = $('CssSelector').text().trim(); //(3) CSSセレクタで要素からテキストを取得
    console.info("target:" + target);
  });
}).on('error', function(e) {
  console.error('error', e);
});

(1)ではレスポンスのHTMLを変数に格納しています。最初はこの中でパースを行っていたのですが、レスポンスの文字数が多いと分割されて複数回この関数が呼ばれる仕様らしく、上手くパースができずハマりました・・・

(2)でレスポンスHTMLをcheerioでパースします。

(3)でCSSセレクタを使って要素からテキストを抽出します。cheerioはjQueryライクにコードを書けるため、jQueryに慣れている人には馴染みやすいかと思います。要素の指定はCSSセレクタで行い、XPathなどは使えないので注意が必要です。

詳細は以下にドキュメントがあります。
Cheerioのドキュメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です