【GAS】GASでのWebスクレイピングについて雑多に書いてみた。

Google Apps Script

最近Google Apps Script(GAS)を触る機会が増えていて、自分の中でGAS熱がやばいです。
私の中で、GASは好きなプログラミング言語としてはだいぶ上位にくるのですが、このブログでGASの記事を一つも書いていないとはどういうことだ?ということで、
GASについても色々と書いていきたいと思った今日この頃です。

最初のテーマとして、最近よく書いているWebスクレイピングのことについて、Tipsも交えながらつらつらと書いていこうと思います。

GASについて

Googleが提供しているサーバーサイドプログラミング環境です。

ネット上には、既にたくさん情報があり、「GAS 入門」でググるとGASの紹介ページが山ほど出てくるので、
詳しい特徴はそちらを見ていただくということで、このページでの詳細説明は割愛します。
(書くのがめんどくさ、、、くはないですよ)

GASでのWebスクレイピング

まずはHTTPリクエストを送ってみる

GASで行うHTTPリクエストを一番最小の形で書くとこうなります。


コード.gs

function scraping() {
  var fetch = UrlFetchApp.fetch("https://example.com/");
  var response = fetch.getContentText();
}

とても単純ですね。 response にはレスポンスの文字列が格納されています。
これを正規表現などで、煮るなり焼くなりすればいいわけです。

取得したHTMLの文字列をパーサーに突っ込んでとかやりたいですが、
GASで提供されているパーサーは XmlService しかなく、使い勝手もあまり良くないため、
個人的には正規表現だけでなんとかするのが手っ取り早いと思っています。
どなたかいいパーサーとかあったら教えて欲しいぐらいです。

オプションについて

HTTPリクエストを送る際に様々なオプションをつけることができます。
例えば、レスポンスが404などのエラー系のときはオプションを何も付加しないとエラーでこけてしまうので、


コード.gs

function scraping() {
  var options = {
    "muteHttpExceptions": true,     // 404エラーでも処理を継続する
  }
  var fetch = UrlFetchApp.fetch("https://example.com/", options);
}

としたりすることができます。

POSTを送信する時もオプション指定で行うことができます。


コード.gs

function sendHttpPost(message){
   var payload =
   {
     "message" : message
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

   UrlFetchApp.fetch("http://example.com", options);
}

詳細は公式のドキュメントをご参照ください。

スプレッドシートと組み合わせる

取得した結果を整理したり、表示したりするにはスプレッドシートを使うのが便利です。


コード.gs

function scraping() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow();
  
  // A列にURLが記入してあると想定
  var urls = sheet.getRange(1, 1, lastRow).getValues();
  
  for(var i = 0, l = urls.length; i < l; i++) {
    var url = urls[i][0];
    var fetch = UrlFetchApp.fetch(url);
  }
}

ECサイトの個別商品ページとかを並べて、
必要な情報だけ取得してセルに並べるといったことができますね。

1回の実行で送りたいリクエスト数が多い時

しかしながら、Apps Scriptには6分という時間制限があります。
先ほどの処理で取得先が大量にある場合、6分では処理しきれないことが多々あります。
そういう場合はユーザー定義関数で処理してあげるのが便利です。

例えば、先ほどの処理を少し書き換えて


コード.gs

function scraping(url) {
  var options = {
    "muteHttpExceptions": true,     // 404エラーでも処理を継続する
  }
  var fetch = UrlFetchApp.fetch(url, options);
  var response = fetch.getContentText();

  // imgタグだけ取り出したり
  var value = response.match(//g)[0];
  return value;
}

A1セルにURLが書いてあるとしたら、スプレッドシートのセルに

=scraping(A1)

と入力すれば、入力したセルに値が返ってきます。

まとめ

UrlFetchApp便利っす。
また思いついたら書こうと思います。

コメント

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