PR
スポンサーリンク

GASでスプレッドシートにWebスクレイピング結果を自動取得する方法!【ECサイト編】

GASでスプレッドシートにWebスクレイピング結果を自動取得する方法!【ECサイト編】 GAS
記事内に広告が含まれています。

前回の記事では、Google Apps Script(GAS)を使って、各URL先のページから「タイトル」と「メタディスクリプション(説明)」を取得する方法を紹介しました。

今回は、その応用として、より実用的な例を紹介します。

練習用のスクレイピングサイトBooks to Scrapeから「商品名」「価格」「在庫状況」などの情報を取得し、Googleスプレッドシートに自動で書き込むスクリプトを作成する方法をご紹介します。

スポンサーリンク

サンプルプロジェクトの準備

今回のサンプルでは、スプレッドシートのA列に入力されたURLをもとに、各ページの「商品名」「価格」「在庫状況」を取得するようにしていきます。

そこで、まずサンプル用のGoogle スプレッドシートを作成しA1:D4セルに下記を入力しておきます。

今回、A列に入力するURLはBooks to Scrape内の任意のページを選んでいます。必要に応じて適宜変更してください。

URL商品名価格在庫状況
https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html
https://books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html
https://books.toscrape.com/catalogue/scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html

実際に、以下のようにスプレッドシートにデータを入力します。

WEBスクレイピング応用編のサンプル


続いて、Google Apps Scriptのスクリプトエディタを開いておきます

Googleスプレッドシートのメニューバーの「拡張機能」を左クリックし、「Apps Script」を選択します。

「Apps Script」を選択すると、スクリプトエディタが新しいタブで開きます。

「Apps Script」を左クリックする
GASエディタ

基本スクリプト作成

サンプルコード

以下のコードを、Google Apps Scriptのスクリプトエディタに貼り付けて、保存してください。

function scrapeBooksInfo() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var urls = sheet.getRange("A2:A").getValues().flat().filter(String);

  urls.forEach((url, index) => {
    var row = index + 2;
    try {
      var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
      var html = response.getContentText();
      
      var productName = html.match(/<h1>(.*?)<\/h1>/i)?.[1] || "取得失敗";
      var price = html.match(/<p class="price_color">(.*?)<\/p>/i)?.[1] || "取得失敗";
      var availability = html.match(/<p class="instock availability">\s*<i.*?><\/i>\s*(.*?)\s*<\/p>/i)?.[1] || "取得失敗";
      
      sheet.getRange(row, 2).setValue(productName);
      sheet.getRange(row, 3).setValue(price);
      sheet.getRange(row, 4).setValue(availability);
    } catch (e) {
      sheet.getRange(row, 2, 1, 3).setValue("取得エラー");
    }
  });
}

コードの解説

  1. スプレッドシートのデータ取得
    • var urls = sheet.getRange("A2:A").getValues().flat().filter(String);
      A列のURLリストを取得し、配列に格納します。
  2. 各URLのページを取得
    • UrlFetchApp.fetch(url) を使用して、対象ページのHTMLを取得します。
  3. 正規表現でデータを抽出
    • match() メソッドを使用して、
      <h1>(商品名)、
      <p class="price_color">(価格)、
      <p class="instock availability">(在庫状況)を取得。
  4. スプレッドシートに書き込む
    • sheet.getRange(row, 2).setValue(productName);
      sheet.getRange(row, 3).setValue(price);
      sheet.getRange(row, 4).setValue(availability);

      各データを該当のセル(B列〜D列)に書き込みます。
  5. エラーハンドリング
    • データが取得できなかった場合、catch (e) でエラーメッセージを記録します。

スクリプトの実行結果

それでは、スクリプトを実行していきます。

スクリプトエディターのメニューバーで「scrapeBooksInfo」が選択されていることを確認し、「実行」ボタンを左クリックします。

GASの「実行」ボタンをクリックする手順

初めて実行する際には、スクリプトに対する権限の承認が求められる場合がありますので、承認してください。

「このアプリは Google で確認されていません」と表示された場合は左下の詳細をクリックすると、「無題のプロジェクト(安全ではないページ)に移動」というリンクが表示されます。
このリンクをクリックすると次のページへ遷移できます。

続いて、スクリプトの実行結果を確認します。

スクリプトが正常に実行されると、B列~D列に「商品名」「価格」「在庫状況」が入力されます。

スクレイピングのスクリプトの実行結果

定期実行スクリプトの作成

前項の応用編として、スクリプトを定期的に実行し、その実行日時と取得結果を毎回記録する方法をご紹介します。

サンプルコード

まずは、取得データに 「実行日時」 を追加し、別シートに毎回データを記録するようにコードを修正します。

function scrapeBooksInfo() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  var urls = sheet.getRange("A2:A").getValues().flat().filter(String);
  var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ログ");

  if (!logSheet) {
    logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("ログ");
    logSheet.appendRow(["実行日時", "URL", "商品名", "価格", "在庫状況"]);
  }

  var now = new Date();
  var timestamp = Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");

  urls.forEach((url, index) => {
    var row = index + 2;
    try {
      var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
      var html = response.getContentText();
      
      var productName = html.match(/<h1>(.*?)<\/h1>/i)?.[1] || "取得失敗";
      var price = html.match(/<p class=\"price_color\">(.*?)<\/p>/i)?.[1] || "取得失敗";
      var availability = html.match(/<p class=\"instock availability\">\\s*<i.*?><\/i>\\s*(.*?)\\s*<\/p>/i)?.[1] || "取得失敗";

      // スプレッドシートに記録
      sheet.getRange(row, 2).setValue(productName);
      sheet.getRange(row, 3).setValue(price);
      sheet.getRange(row, 4).setValue(availability);

      // ログに記録
      logSheet.appendRow([timestamp, url, productName, price, availability]);

    } catch (e) {
      sheet.getRange(row, 2, 1, 3).setValue("取得エラー");
      logSheet.appendRow([timestamp, url, "取得エラー", "取得エラー", "取得エラー"]);
    }
  });
}

コードの解説

  1. 「ログ」シートの作成
    • var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ログ");
      「ログ」という名前のシートを取得します。
    • 「ログ」シートが存在しない場合は、if (!logSheet){}で「ログ」シートを新規作成します。
  2. 実行日時のフォーマット
    • Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss") で実行日時を整形します。
  3. スプレッドシートに書き込む
    • logSheet.appendRow([timestamp, url, productName, price, availability]);
      「ログ」シートに行を追加し、取得した各データを書き込みます。
  4. エラーハンドリング
    • 「ログ」シートに書き込むデータが取得できなかった場合、
      logSheet.appendRow([timestamp, url, "取得エラー", "取得エラー", "取得エラー"]);
      でエラーを記録します。

スクリプト定期実行設定

Google Apps Scriptではトリガーを設定することで、スクリプトを自動実行させることができます。

この設定を入れることで、定期的にスクレイピングを実行し、「ログ」シートに新たな情報を追加していくことができます。

トリガー設定方法を詳しく知りたい方はこちらをご覧ください。

WEBスクレイピングの注意点

  1. 今回ご紹介したサンプルコードのURL正規表現を変更することで、他のサイトのスクレイピングにも対応することが可能です。
    他のサイトをスクレイピングする際には、サイトの利用規約を確認し、スクレイピングが許可されていることを確認してください。
  2. 過剰なリクエストを送らないように、適切な実行間隔に調整してください

まとめ

今回は、Google Apps Script(GAS)を使って、GoogleスプレッドシートにBooks to Scrapeの商品情報を自動取得する方法をご紹介しました。

正規表現を活用すれば、さまざまなWebページの情報をスクレイピングし、スプレッドシートに整理できます。
ぜひご自身のスプレッドシートでも試してみてください!

コメント

タイトルとURLをコピーしました