読者です 読者をやめる 読者になる 読者になる

技術のメモ帳

気が向いたときに書いてます

[GAS]ウェブサイトをスクレイピングする

Google Apps Scriptは、HTTPの処理や定期実行ができるため、スクレイピングも簡単にできます。

実装手順としては、次の通りです。

  1. UrlFetchAppで対象コンテンツをfetch
  2. HtmlResponseクラスのgetContentText()メソッドで文字列化
  3. 正規表現で文字列を加工
  4. 加工した情報をSpreadsheetやDBに書き込む

Google検索結果をSpreadsheetに書き込むサンプル

Googleの特定文字列を検索した結果をSpreadsheetに書き込むサンプルを実装しました。

サンプルでは、XmlServiceクラスを使っていますが、正規表現のみで加工しても問題ありません。

function loggingToSpreadsheet() {
  var id      = '***YOUR_SPREADSHEET_ID***',
      sheet   = SpreadsheetApp.openById(id).getActiveSheet(),
      results = scrapeSearchResult('cookpad');
  for (var i in results) {
    var data = results[i];
    sheet.appendRow([data.title, data.link]);
  }
}

function scrapeSearchResult(text) {
  var response = UrlFetchApp.fetch('https://www.google.co.jp/search?q='+text),
      regexp   = /<h3 class=\"r\">(<a href=\"\/url[\s\S]*?)<\/h3>/gi,
      elements = response.getContentText().match(regexp),
      result   = [];
  for (var i in elements) {
    var doc  = XmlService.parse(elements[i]),
        root = doc.getRootElement();
    result.push({
      title: root.getValue(),
      link:  root.getChild('a').getAttribute('href').getValue().match(/^\/url\?q=(.+?)\&/)[1]
    })
  }
  return result;
}

loggingToSpreadsheet()関数を実行すると、指定したSpreadsheetに次のように書き込まれます。

クライアントサイドと比較して、DOMの扱いに難があるため、少々面倒ですが、工夫次第で色々なデータが取得できそうです。

参考リンク