bnsgt's diary

個人的な備忘と日記

【BASIC認証有りでも対応】GoogleスプレッドシートとGoogle Apps ScriptでWebページのメタ情報スクレイピングして指示通りか自動チェックする方法

GoogleスプレッドシートのIMPORTXMLという関数で、簡単にスクレイピング出来る。

けど、テスト環境などはBASIC認証をかけている場合が多く、その状態でも確認したい場合は、IMPORTXMLだけでは無理っぽい。

Google Apps Scriptを使用したら、出来るらしい。 blog.halt.project-p.jp

手順

1.Google Apps Scriptを書く。
/*
 * メタ情報を取得する
 * path - ドメイン以下のURLパス
 * type - titleなど何を取得するか
 */
function getMeta(path, type) {

  // 現在表示しているスプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  
  // ドメインとBASIC認証のID、PWは、スプレッドシートのC4、C5、C6に記載した。
  var domain = sheet.getRange("C4").getValue();
  var user = sheet.getRange("C5").getValue();
  var pass = sheet.getRange("C6").getValue();

  // BASIC認証対応
  var options = {
    "headers" : {"Authorization" : " Basic " + Utilities.base64Encode(user + ":" + pass)}
  };
  var response = UrlFetchApp.fetch(domain + path, options);
  var content = response.getContentText("UTF-8");
  
  var text = "";

  if ( type.match(/title/) ) {
    // titleタグ取得
    var titleMatch = content.match(/<title>([\s\S]*)<\/title>/i);
    var title = getFirstValue(titleMatch);
    text = title;
  } else if ( type.match(/description/) ) {
    // description取得
    var descMatch   = content.match(/meta\s+name=['"]description['"]\s+content=['"](.+)['"]/i);
    var description = getFirstValue(descMatch);
    text = description;
  } else if ( type.match(/keywords/) ) {
    // keywords取得
    var keywordsMatch   = content.match(/meta\s+name=['"]keywords['"]\s+content=['"](.+)['"]/i);
    var keywords = getFirstValue(keywordsMatch);
    text = keywords;
  }
  
  // Logger.log(text); // エディタ上でcommand + Enterで、logが見れる
  return text;
}

// マッチする最初の要素を返す
function getFirstValue(values) {
  return values && values.length > 1 ? values[1] : '';
}

2.スプレッドシートからGoogle Apps Scriptを呼び出す
  • スクレイピングした文字列を反映したいセルに、1で書いたGoogle Apps ScriptのgetMeta関数を記入する(第1引数がドメイン以下のURLパス、第2がtitleなど何を取得するか)
=getMeta($C10, "title")
  • 条件付き書式で間違っていた場合に色をつけたり一致した場合に○をつけるなどしたら便利。
  • ドメインBASIC認証のID、PWは、スクリプトに直書きしているので、セルの移動はNG。

f:id:bnsgt:20210109030920j:plain