🌐

GASでクローラ作成時のコツ等

2024/05/27に公開

出力されるHTMLからデータを拾う場合

fetch用関数とデータ読み込み関数を分ける

fetchしたhtmlを引数の形で読み込み関数に渡すようにする

crawler.gs
/**
 * urlからhtmlを取得する
 * @param {string} url
 * @returns {string} html
 */
function fetch(url) {
  const options = {
    method: "get",
    headers: {} // user-agent設定など
  }
  const result = UrlFetchApp.fetch(url, options);
  if (result.getResponseCode() !== 200) throw new Error('can not get html, ${url}');
  return result.getContentText();
}

Cheerioなどでデータを解析する

CheerioのScript ID: 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
直接htmlを解析するのは地獄なので💦

crawler.gs
/**
 * htmlをcheerioへ読み込む
 * @param {string} html
 * @returns {Cheerio.CheerioAPI}
 * @see https://github.com/cheeriojs/cheerio
 * @see https://github.com/tani/cheeriogs
 */
function load(html) {
  return Cheerio.load(html);
}
/**
 * ページから情報を取得する
 * @param {Cheerio.CheerioAPI} $
 * @returns {any[]}
 */
function getInfoFromPage($) {
  const items = $("#list div").toArray();
  const array = [];
  if (items.length < 1) return array;

  for (const item of items) {
    const data = {}; // itemからdataを取り出し配列へ入れる
    array.push(data);
  }
  return array;
}

テスト時に相手先サーバへ毎回アクセスしない

超重要!! 相手先サーバから出力されるHTMLをGoogleドライブ上に保存すし、関数のテストに使用する

Discussion