【GAS】スプレッドシートからURLを読み込みスクレイピングを実行する
前回はGoogle Apps Script(GAS)で複数ページを一括でスクレイピングする方法を解説しました。
この記事では、スプレッドシート上にあるスクレイピング対象のURLのリストを読み込んでから実行結果を書き出す方法を解説します。
- スクレイピング対象のURLリストをスプレッドシートに用意
- スプレッドシートを読み込んでリストを格納、その際.flat()で一次元配列に整形
- スクレイピングを実行し、書き出したい形で配列を作成
- スプレッドシートに書き出す
スクレイピング対象のURLリストを用意
例に習ってCookpadさんのサイトを事例に使わせていただきます。スクレイピングしたいレシピページを複数用意して下記のように用意しておきます。
今回、書き出しも同じスプレッドシートの別シートに実行するので、各リンクごとに「料理No.」「料理名」「材料」の3つの要素を格納する想定で予め列名を記載しています。
サンプルコード
レシピページにスクレイピングを実行して料理名と材料の組み合わせ配列を戻す関数Scraping()は前回の記事と同じものを使います。
今回はこのスクレイピング実行関数を利用して、スプレッドシートからスクレイピング対象のURLを読み込み、実行結果をスプレッドシートに書き出す処理を行います。
function Cookpad(){
//読み込み
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('読み込み');
const range = sheet.getDataRange();
const recipes = range.getValues().flat();
// console.log(recipes);
let menu = [];
recipes.forEach(function(value,index){
menu.push(Scraping(value,index));
// console.log([value,index]);
})
// console.log(menu);
const sheet_ex = ss.getSheetByName('書き出し');
sheet_ex.getRange(2,1,menu.length,3).setValues(menu);
}
function Scraping(url,index) {
const contentText = UrlFetchApp.fetch(url).getContentText('utf-8');
try{
var meal = ingredients = Parser.data(contentText).from('<h1 class=\'recipe-title fn clearfix\'>').to('</h1>').build().replace(/\n/g,'');
var ingredients = Parser.data(contentText).from('<span class=\'name\'>').to('</span>').iterate().map(function(value){
return OmitLink(value);
})
}catch (e) {
console.log("エラーになりました");
}
return ['料理'+ (index+1) ,meal, ingredients.join('/')];
}
スプレッドシートからURLリストを読み込む
通常の読み込み方法でスプレッドシート、シート、範囲、値を読み込んでいきます。今回2シートあるので、読み込み対象を指定するために.getSheetByName('読み込み’)という記述にしました。
若干トリッキーなのは、getValues()の宣言時点ではrecipesという定数が二次元配列ということです。サンプルコードではflat()関数を使って一次元配列に変換しています。
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('読み込み');
const range = sheet.getDataRange();
const recipes = range.getValues().flat();
// recipes = range.getValues();
// console.log(recipes);
[ [ 'https://cookpad.com/recipe/7018658' ],
[ 'https://cookpad.com/recipe/6578580' ],
[ 'https://cookpad.com/recipe/6937498' ],
[ 'https://cookpad.com/recipe/6580774' ],
[ 'https://cookpad.com/recipe/4554194' ],
[ 'https://cookpad.com/recipe/4646139' ],
[ 'https://cookpad.com/recipe/4683665' ] ]
// recipes = range.getValues().flat();
// console.log(recipes);
[ 'https://cookpad.com/recipe/7018658',
'https://cookpad.com/recipe/6578580',
'https://cookpad.com/recipe/6937498',
'https://cookpad.com/recipe/6580774',
'https://cookpad.com/recipe/4554194',
'https://cookpad.com/recipe/4646139',
'https://cookpad.com/recipe/4683665' ]
実行結果(配列)を書き出す
getSheetByName(<書き出し先のシート名>)として対象のシートを指定し、getRange('開始行’,’開始列’,’行数’,’列数’) .setValues(<実行結果>)で書き出します。
今回は書き出し用のシートには、あらかじめ「料理No.」「料理名」「材料」の列は用意しておいたので、2行目から書き出しを行うように記述しました。
const sheet_ex = ss.getSheetByName('書き出し');
sheet_ex.getRange(2,1,menu.length,3).setValues(menu);
// console.log(menu);
[ [ '料理1', 'オーブンで簡単伊達巻', '卵/白はんぺん/砂糖/白だし' ],
[ '料理2', '伊達巻き', 'はんぺん/たまご/★砂糖/★みりん/★塩/★麺つゆ(3倍濃縮)/サラダ油' ],
[ '料理3',
'はんぺんのチーズはさみ焼き',
'はんぺん/ベーコン/とろけるスライスチーズ/小麦粉/卵/パン粉/油(揚げ用)/ケチャップ' ],
[ '料理4', 'チーズ入 ミキサーなし 甘さ控えめ伊達巻', 'はんぺん/卵/醤油/みりん/ベビーチーズ' ],
[ '料理5', '簡単!生姜ベーコンのチーズはんぺんサンド', 'はんぺん/生姜焼きベーコン/とろけるスライスチーズ/海苔' ],
[ '料理6', '☆はんぺんとチーズのベーコン巻き☆', 'はんぺん/スライスチーズかとろけるチーズ/ベーコン/醤油' ],
[ '料理7', '弁当おかず後一品はんぺん海苔巻きベーコン', 'はんぺん/ベーコンハーフ/海苔' ] ]
うまく書き出せたようです。
まとめ
スプレッドシート上に用意したURLのリストを読み込み、スクレイピングしてから実行結果をスプレッドシートに書き出す方法を解説しました。
- スクレイピング対象のURLリストをスプレッドシートに用意
- スプレッドシートを読み込んでリストを格納、その際.flat()で一次元配列に整形
- スクレイピングを実行し、書き出したい形で配列を作成
- スプレッドシートに書き出す