GoogleAppsScript WEBスクレイピング「スーパーマーケットのサイトからチラシを自動収集&保存するスクリプト」
こんにちは。自宅の配電盤が故障し、ヤシマ作戦に協力しているかのように、ほとんどの電源が使えない状況下のpikiです。
先日知り合いから、「業務で”スーパーマーケット”のチラシを集めて保管しておきたいんだけど、毎日チェックしてダウンロードするのが面倒くさいから自動化できない?」と相談を受けました。
チラシデータは機会を逃すとダウンロードできなくなるという時間の制約があるものの、すぐ使いたいものではなく、あとでふとした時に利用をしたいものだそうです。こういう業務は、なるべく自動化したいという気持ちはよくわかりますね。
ということで、個人レベルの管理がしやすく、また企業のPCからでも環境に左右されず利用できる「GoogleAppsScript」を使ってスクリプトを作成して見ました。
テストとしてとあるスーパーさんのHPからチラシのPDFをダウンロードして、GoogleDriveに保管、メールで送付するまでの一連の流れをスクリプトにしています。
function chirashi_dl() {
//東武ストアさんのHPからチラシをPDFでダウンロード
//保存先&店ID&店名
var shop_id = "11";
var shop_name = "東武ストア王子店";
var sheet_id ="Googleドライブに保管しているスプレッドシートのID";
var folder_id ="PDF保管先のGoogleドライブのID";
var address="PDF送付先メールアドレス";
//チラシIDデータベース DL済みチラシの重複チェック用
var spreadsheet = SpreadsheetApp.openById(sheet_id);
var sheet = spreadsheet.getActiveSheet();
var lastRow = sheet.getLastRow()+1;
//上記IDに該当するお店のページURLを取得
var page_url ="https://www.tobustore.co.jp/index.php/shop/detail/"+shop_id+"/";
var response =UrlFetchApp.fetch(page_url).getContentText();
var regexp1 =/<div class="swiper-wrapper"([\s\S]+?)<!-- .swiper-wrapper -->/ig;
var regexp2 = /<a class=\"button button_pdf\"([\s\S]+?)PDF版/ig;
var regexp3 = /http:\/\/.+?(?=")/g;
var line_html = response.match(regexp1);
var chirashi_html = line_html[0].match(regexp2);
//チラシ掲載を確認する(複数枚ある場合、反復)
try{
var chirashi_num =chirashi_html.length;
}catch(e){
var chirashi_num =0;
}
for(var i=0;i<chirashi_num;i++){
//チラシPDFのURLを取得
var chirashi_pdf_url = line_html[i].match(regexp3);
//サイト上にチラシデータがあるとき
if(chirashi_pdf_url!=null){
//取得するチラシに重複があるかデータベースからチェックする
var frag = check_chirashi(chirashi_pdf_url,lastRow,sheet);
if(frag==false){
sheet.getRange("A"+lastRow).setValue(chirashi_pdf_url);
//日付を生成する(ファイルネーム用)
var dateman = new Date();
var dateman = Utilities.formatDate(dateman,"JST", "YYYY_MM_dd");
var namedate = dateman +"_"+ shop_name +".pdf";
//チラシPDFを取得
try {
var pdf = UrlFetchApp.fetch(chirashi_pdf_url).getBlob().setName(namedate);
if (pdf!=null){
GmailApp.sendEmail(address,
"本日の"+shop_name+"チラシ送付",
namedate,
{attachments: pdf})
Logger.log("パターン1:チラシ送りました");
}
//Driveに名前を付けてファイル生成
var pdfid = DriveApp.getFolderById(folder_id).createFile(pdf).getId();
//チラシURLからチラシPDFの取得ができない場合
}catch (e) {
Logger.log("パターン2:このURLはPDFデータではありません");
}
}
}else{
//すでに掲載チラシをダウンロード済みの場合
var dateman = new Date();
var dateman = Utilities.formatDate(dateman,"JST", "YYYY_MM_dd");
GmailApp.sendEmail(address,
"すでにダウンロード済みでした。"+shop_name+"の新しいチラシはありません",
dateman);
Logger.log("パターン3:チラシダウンロード炭");
}
}
//チラシ掲載がない場合(メールが鬱陶しい場合ここは外す)
if(chirashi_num==0){
var dateman = new Date();
var dateman = Utilities.formatDate(dateman,"JST", "YYYY_MM_dd");
GmailApp.sendEmail(address,
"本日の"+shop_name+"のチラシはありません",
dateman);
Logger.log("パターン4:チラシ無し");
}
}
//チラシID重複チェック用の関数
function check_chirashi(url,num,sheet){
var frag = false;
for(var i=1;i<=num;i++){
var check = sheet.getRange("A"+i).getValue();
//シート内に既にURLがある場合ダウンロードしないフラグを立てる
if(check==url){
var frag = true;
}
}
return frag;
}
正直、もう少し短くコーディングできそうな気がしますが、とりあえず動くので今回は良しとしています(笑)
正規表現箇所がやや複雑なので、少しだけ説明すると
var regexp1 =/<div class="swiper-wrapper"([\s\S]+?)<!-- .swiper-wrapper -->/ig;
var regexp2 = /<a class=\"button button_pdf\"([\s\S]+?)PDF版/ig;
var regexp3 = /http:\/\/.+?(?=")/g;
regexp1・・・チラシ掲載箇所のHTMLを抜き出す正規表現
regexp2・・・PDFボタン箇所のHTMLを抜き出す正規表現
regexp3・・・href属性にあるURLを抜き出す正規表現
となっています。
スクリプトをGoogleAppsScriptで作成したら、下記のようにトリガー設定が可能です。これで毎日「午前6~7時」にこのスクリプトが実行されます。GoogleAppsScriptは、個人的にこのトリガー設定の容易さが好きですね。
画質が悪く申し訳ございませんが、下記のようにメールが送信できました!
スクリプトを作成してみて・・・
やはり技術力のなさが無駄なコードを生んでしまっています。
少しずつ力をつけていきたいところです。
GoogleAppsScriptは正直煩雑なプログラムの実行には向きませんが、簡単なスクレピングにはもってこいです。無料アカウントの場合、実行時間が6分などといった制限がありますが、個人の趣味程度には有用なプログラミング言語ではないでしょうか。ぜひ試してみてください。
この記事が気に入ったらサポートをしてみませんか?