🌐
GASでクローラ作成時のコツ等
出力される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