GASを用いたスクレイピングでポータルサイトの情報を取得
今回は、Google Apps Script(GAS)を用いて、ポータルサイトの情報をスクレイピングし、Googleスプレッドシートに出力する方法を実施しました。
目的
ポータルサイトに掲載されている情報(約20ページ分)を自動取得し、業務の効率化を図るためにGASを活用しました。
取得したデータ
- クリニック名
- 住所
- 電話番号
- 診療時間
- 休診日
- URL
これらの情報をスクレイピングし、スプレッドシートに自動で出力する仕組みを作成しました。
実装プレビュー
使用した技術
- Google Apps Script(GAS)
- UrlFetchApp を用いたデータ取得
- 正規表現やHTMLパース を活用したデータ抽出
- スプレッドシートAPI によるデータの保存
実装の流れ
- ポータルサイトのURLを解析
- 複数ページ(1〜20ページ)を巡回して情報を取得
- クリニック名、住所、電話番号、診療時間、休診日、URLを抽出
- スプレッドシートに一括出力
スクリプト
以下は、GASを使用してスクレイピングを行い、スプレッドシートに出力するスクリプトの一例です。
function scrapeClinics() {
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
var sheet = ss.getSheets()[0];
sheet.clearContents();
var rows = [];
rows.push(["クリニック名", "住所", "電話番号", "診療時間", "休診日", "URL"]);
var maxPages = 20;
for (var page = 1; page <= maxPages; page++) {
var pageUrl = page === 1 ? "https://www.sample-website.com/search-clinics/?page=1" : "https://www.sample-website.com/search-clinics/?page=" + page;
Logger.log("取得ページ: " + pageUrl);
var response = UrlFetchApp.fetch(pageUrl, {muteHttpExceptions: true});
if (response.getResponseCode() !== 200) {
Logger.log("ページ " + page + " の取得に失敗: ステータスコード " + response.getResponseCode());
continue;
}
var html = response.getContentText("UTF-8");
var articleRegex = /<article class="clinic-item">([\s\S]*?)<\/article>/g;
var articleMatch;
while ((articleMatch = articleRegex.exec(html)) !== null) {
var articleHTML = articleMatch[1];
var clinicName = extractData(articleHTML, /<h2 class="ttl\s+sample-class[^"]*">([\s\S]*?)<\/h2>/);
var address = extractData(articleHTML, /<span class="address">([\s\S]*?)<\/span>/);
var tel = extractData(articleHTML, /<th>電話番号<\/th>\s*<td>([\s\S]*?)<\/td>/);
var hours = extractData(articleHTML, /<th>診療時間<\/th>\s*<td>([\s\S]*?)<\/td>/);
var holiday = extractData(articleHTML, /<th>休診日<\/th>\s*<td>([\s\S]*?)<\/td>/);
var clinicUrl = extractData(articleHTML, /<div class="to-clinic sample-class">[\s\S]*?<a href="(.*?)"/);
if (clinicName || clinicUrl) {
rows.push([clinicName, address, tel, hours, holiday, clinicUrl]);
}
}
Utilities.sleep(1000);
}
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
Logger.log("合計件数:" + (rows.length - 1) + " 件");
}
function extractData(html, regex) {
var match = regex.exec(html);
return match ? match[1].replace(/<[^>]+>/g, "").trim() : "";
}
今後の展望
- より多くのデータ項目を取得できるように拡張
- 定期的にデータを取得するスケジュール設定
- APIを活用できるサイトの場合、APIを用いた効率的なデータ収集
GASを使うことで、手動での情報収集にかかる時間を大幅に削減できました。業務効率化の一環として、GASを活用したスクレイピングは非常に有用です。興味のある方は、ぜひ試してみてください!
コメント