はじめに
スプレッドシートとGASを使って、なんらかのWebページの一部分を取得し、条件に合ってたら通知を送る!みたいなことをやろうと思います。チケットの空きやグッズの再販情報を誰よりも早く入手したいけど、ずっとサイトを監視するのは無理かも...って時などに使えるかもしれません。
※スクレイピングは迷惑をかけない範囲でやりましょう。
※スクレイピングダメだよーって明記してるサイトでスクレイピングをやるのはやめましょう。
情報を抽出しよう
簡単に使いまわせるよう、情報を取得したいURLなどはスプシ側に記載していきます。
この例では、A2セルに情報を取得したいページのURL、B2セルにXPathを入れる想定です。
XPathは、
- ページ上の取得したい情報を範囲選択して右クリック
- 「検証」を選択
- 選択されている部分で右クリック
- 「XPathをコピー」を選択
という手順で取得できます。
そしてC2セルに、
=IMPORTXML(A2,B2)
と書いておけば、C2セルに指定した情報が表示されます!
通知を送ろう
「拡張機能」から「Apps Script」を選びます。
するとApps Scriptの画面に遷移するので、良い感じのコードを書いて通知を送れるよう設定してみましょう。ここではGmailに送る例を紹介します。
function check_update(sheetname,xml_cell,key_cell,key) {
//スプシ取得
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
//シート取得
const sheet = spreadSheet.getSheetByName(sheetname);
//IMPORTXMLが入っているセルの中身を一回消してまた上書きすることで、強制更新を行う
const tmp=sheet.getRange(xml_cell).getValue();
sheet.getRange(xml_cell).deleteCells(SpreadsheetApp.Dimension.ROWS);
sheet.getRange(xml_cell).setValue(tmp);
//抽出した値を取得
const value = sheet.getRange(key_cell).getDisplayValue();
const url = sheet.getRange("A2").getDisplayValue();
//特定の値だったらGmailを送る
if(value==key){
const email = Session.getActiveUser().getEmail();
GmailApp.sendEmail(email, sheetname+" "+value,url,{cc:"【メアド入れてね】"});
}
}
function main(){
//シート名指定
const sheetname="【シート名入れてね】";
//IMPORTXMLを入れたセルを指定
const xml_cell="C2";
//比較したい情報のセルを指定
//今回はIMPORTXMLで取得した情報をそのまま比較しています
const key_cell="C2";
//キーを指定
const key="【この値になったら通知したい!っていう値を入れてね】";
check_update(sheetname,xml_cell,key_cell,key);
}
こんな感じで書いて保存してmain関数を実行すると、抽出した値によってメールが送られたり送られてこなかったりするかなと思います。
次に、main関数を定期的に行ってもらうために、トリガーを設定しましょう。
左側から「トリガー」を選んで移動して...
なんかこんな感じで設定すればいけます。
「時間ベースのトリガーのタイプを選択」と「時間の間隔を選択」はお好みで選んでください。(迷惑かけない範囲でね)
こうすることで、自動で定期的にスクレイピングを行い、抽出した結果をもとに通知が送られるようになりました!
おわりに
今回はお手軽なスクレイピング方法としてIMPORTXMLを使う方法を紹介しました。
もっとたくさんの情報を取得したい場合は、ライブラリを使うのがよいと思います。また、Gmailだけではなく、DiscordとかSlackにも送信できるのでいい感じに組み合わせて使ってみてください。
法律を守ってよいスクレイピングライフを!