GASでスクレイピング!ポータルサイトの情報をGoogleスプレッドシートに自動出力する方法

Google Apps Script
この記事は約5分で読めます。

GASを用いたスクレイピングでポータルサイトの情報を取得

今回は、Google Apps Script(GAS)を用いて、ポータルサイトの情報をスクレイピングし、Googleスプレッドシートに出力する方法を実施しました。

目的

ポータルサイトに掲載されている情報(約20ページ分)を自動取得し、業務の効率化を図るためにGASを活用しました。

取得したデータ

  • クリニック名
  • 住所
  • 電話番号
  • 診療時間
  • 休診日
  • URL

これらの情報をスクレイピングし、スプレッドシートに自動で出力する仕組みを作成しました。

実装プレビュー

使用した技術

  • Google Apps Script(GAS)
  • UrlFetchApp を用いたデータ取得
  • 正規表現やHTMLパース を活用したデータ抽出
  • スプレッドシートAPI によるデータの保存

実装の流れ

  1. ポータルサイトのURLを解析
  2. 複数ページ(1〜20ページ)を巡回して情報を取得
  3. クリニック名、住所、電話番号、診療時間、休診日、URLを抽出
  4. スプレッドシートに一括出力

スクリプト

以下は、GASを使用してスクレイピングを行い、スプレッドシートに出力するスクリプトの一例です。

function scrapeClinics() {
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  var sheet = ss.getSheets()[0];
  sheet.clearContents();
  
  var rows = [];
  rows.push(["クリニック名", "住所", "電話番号", "診療時間", "休診日", "URL"]);
  
  var maxPages = 20;
  for (var page = 1; page <= maxPages; page++) {
    var pageUrl = page === 1 ? "https://www.sample-website.com/search-clinics/?page=1" : "https://www.sample-website.com/search-clinics/?page=" + page;
    Logger.log("取得ページ: " + pageUrl);
    
    var response = UrlFetchApp.fetch(pageUrl, {muteHttpExceptions: true});
    if (response.getResponseCode() !== 200) {
      Logger.log("ページ " + page + " の取得に失敗: ステータスコード " + response.getResponseCode());
      continue;
    }
    
    var html = response.getContentText("UTF-8");
    var articleRegex = /<article class="clinic-item">([\s\S]*?)<\/article>/g;
    var articleMatch;
    while ((articleMatch = articleRegex.exec(html)) !== null) {
      var articleHTML = articleMatch[1];
      
      var clinicName = extractData(articleHTML, /<h2 class="ttl\s+sample-class[^"]*">([\s\S]*?)<\/h2>/);
      var address = extractData(articleHTML, /<span class="address">([\s\S]*?)<\/span>/);
      var tel = extractData(articleHTML, /<th>電話番号<\/th>\s*<td>([\s\S]*?)<\/td>/);
      var hours = extractData(articleHTML, /<th>診療時間<\/th>\s*<td>([\s\S]*?)<\/td>/);
      var holiday = extractData(articleHTML, /<th>休診日<\/th>\s*<td>([\s\S]*?)<\/td>/);
      var clinicUrl = extractData(articleHTML, /<div class="to-clinic sample-class">[\s\S]*?<a href="(.*?)"/);
      
      if (clinicName || clinicUrl) {
        rows.push([clinicName, address, tel, hours, holiday, clinicUrl]);
      }
    }
    
    Utilities.sleep(1000);
  }
  
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
  Logger.log("合計件数:" + (rows.length - 1) + " 件");
}

function extractData(html, regex) {
  var match = regex.exec(html);
  return match ? match[1].replace(/<[^>]+>/g, "").trim() : "";
}

今後の展望

  • より多くのデータ項目を取得できるように拡張
  • 定期的にデータを取得するスケジュール設定
  • APIを活用できるサイトの場合、APIを用いた効率的なデータ収集

GASを使うことで、手動での情報収集にかかる時間を大幅に削減できました。業務効率化の一環として、GASを活用したスクレイピングは非常に有用です。興味のある方は、ぜひ試してみてください!

コメント