You are currently viewing GASでスクレイピングする

GASでスクレイピングする

かなり久しぶりのTechブログ
書きたいことは色々あるんですが、なかなか書く時間が取れず久しぶりの更新となりました

業務でGASを使う機会が増えました

業務改善で「サーバー上にあるファイルを自動取得したい」という相談が来ました
調べてみるとGASでスクレイピングしてURLを抽出できそうだったので、GASでスクレイピングしてみることにしました

ライブラリ導入から実際のスクレイピングまで

まずはパーサー(構文解析)の追加を行います
ライブラリの「+」ボタンをクリックし、以下のIDを入力して検索をクリックします

1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

追加をクリックすると、以下のようにPaserが追加されます

以上で事前準備は完了です

スクレイピングしてみる

このライブラリは非常にシンプルで「fromメソッド、toメソッドで指定された範囲の文字列を取得する」という動作をします
サンプルプログラムは以下になります

function myFunction() {
  // URLを指定してスクレイピングする場合
  // var url = "https://example.com";
  // var content = UrlFetchApp.fetch(url).getContentText("UTF-8");

var content = '<!DOCTYPE html>' +
  '<html>' +
  '<head>' +
  '  <meta charset="UTF-8">' +
  '  <title>サンプルページ</title>' +
  '</head>' +
  '<body>' +
  '  <h1>見出し1</h1>' +
  '  <p>これはサンプルのHTMLページです。</p>' +
  '  <div id="content">' +
  '    <p>ここはコンテンツエリアです。</p>' +
  '    <p>もう一つの段落です。</p>' +
  '  </div>' +
  '  <footer>' +
  '    <small>© 2025 サンプルサイト</small>' +
  '  </footer>' +
  '</body>' +
  '</html>';

  
  // ------------------------
  // build() を利用して、<title> タグの中身を1回だけ抽出
  var titleText = Parser.data(content)
                        .from("<title>")
                        .to("</title>")
                        .build();
  Logger.log("タイトル: " + titleText);
  
  // ------------------------
  // iterate() を利用して、すべての <p> タグの中身を抽出
  var paragraphs = Parser.data(content)
                         .from("<p>")
                         .to("</p>")
                         .iterate();
  
  Logger.log("抽出された段落の数: " + paragraphs.length);
  paragraphs.forEach(function(text, index) {
    Logger.log("段落 " + (index + 1) + ": " + text);
  });
}

from-toメソッドで抽出範囲を指定し、build(1つだけ取得)、itearte(該当するすべてを取得)を指定するだけです
もちろん、buildやiterateで取得した文字列に対して、更にfrom-toで絞り込みを行うこともできます

GASの限界

今回紹介したライブラリを利用することでGASでもスクレイピングを行うことができます
ただし、seleniumなどのヘッドレスブラウザのような硬度なスクレイピングは行えないため、例えばページが動的に変化するようなページはGASだけでは対応できません

以上

簡単ですが、GASでスクレイピングを行う方法を紹介しました
これを使えば毎日チェックしているWebページの自動化などが行えるかもしれませんね

コメントを残す