Web ページの情報をスクレイピングし、Google スプレッドシートにまとめて保存する必要がでてきた。そのような場合には Google Apps Script を利用すると簡単に保存までできるので便利だ。
Google Apps Script を利用して Web サイトをスクレイピングし、取得したデータをスプレッドシートに保存するまでの流れをメモ代わりに残しておこう。
Google Apps Script で Web サイトをスクレイピングする方法
Google Apps Script で Web サイトにアクセスして目的の情報を取得し、スプレッドシートに保存するまでの流れを解説する。
Google Apps Script で Web サイトにアクセスする
指定の URL にアクセスし、HTML を取得するには UrlFetchApp を利用する。以下のように記述すると HTML を取得できる。
function getHtmlSource(url) {
const url = 'https://loumo.jp/'
const response = UrlFetchApp.fetch(url)
const content = response.getContentText("utf-8")
console.log(content)
}
実行するとこんな感じ。
console.log に出力すると HTML を表示してくれる。
Google Apps Script で HTML をスクレイピングする
HTML が取得できたので正規表現などで目的の文字列を取得しても良いが、面倒くさいのでライブラリを利用するのが良い。HTML をスクレイピングするのに利用できるライブラリはいくつかあるが、Cheerio が簡単そうなので利用してみた。
Cheerio は jQuery のような感じで CSS セレクターを用いて要素を検索できる便利なライブラリだ。Google Apps Script のライブラリ追加画面より以下のスクリプト ID を入力し、検索しよう。
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
現時点ではバージョン 14 が最新のようだ。「追加」をクリックしてライブラリに追加しよう。
追加できたらコードを記述していく。例としてこのブログのトップページをスクレイピングし、記事のタイトルと URL の一覧を取得するコードを書いた。
function scrapingWithCheerio() {
const url = 'https://loumo.jp/'
const response = UrlFetchApp.fetch(url);
const content = response.getContentText("utf-8");
const $ = Cheerio.load(content);
var articles = $('#list a');
let retrieved = [];
for (article of articles) {
console.log($(article).find('h2').text())
console.log($(article).attr('href'))
}
}
これを実行すると以下のように記事のタイトルと URL が表示される。
スクレイピングしたデータをスプレッドシートに保存する
スクレイピングが正常に出来たら取得したデータをスプレッドシートに保存しよう。Google Apps Script からスプレッドシートにアクセスするには SpreadsheetApp を利用する。
以下のように getSheetByName を利用すると書き込み対象のシートを選択できる。
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
const sheet = spreadsheet.getSheetByName(targetSheetName)
シートに書き込みを行うには以下のように setValue を利用する。
sheet.getRange(`A1`).setValue(article.title)
sheet.getRange(`B1`).setValue(article.link)
これらを組み合わせて完成したのが以下のコードだ。
function scrapingBlog() {
const targetSheetName = 'sheet1'
const url = 'https://loumo.jp/'
const response = UrlFetchApp.fetch(url);
const content = response.getContentText("utf-8");
const $ = Cheerio.load(content);
var articles = $('#list a');
let retrieved = [];
for (article of articles) {
_a = {
'title': $(article).find('h2').text(),
'link': $(article).attr('href')
}
retrieved.push(_a)
}
// insert data into spreadsheet
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
const sheet = spreadsheet.getSheetByName(targetSheetName)
row = 1;
for (article of retrieved) {
sheet.getRange(`A${row}`).setValue(article.title)
sheet.getRange(`B${row}`).setValue(article.link)
row += 1
}
}
これを実行すると指定のシートにブログのタイトルと URL の一覧が保存される。
こんな感じ。
スクレイピングの注意事項
スクレイピング時には以下のことに気を付ける必要がある。
- 対象の Web サイトが利用規約などでスクレイピングを禁止しているか
- Web サイトに負荷がかからないようにする
Web サービスによってはスクレイピングを禁止している場合もある。そのようなサイトへのスクレイピングは避けよう。
また、同一の Web サイトに対して何度もアクセスする場合には Utilities.sleep() を利用して適度間隔を空けて負荷がかかることを防ごう。
スクレイピングを行う際にはこれらに注意して実行しよう。