Google Apps Script から tenki.jp をスクレイピングしてみる

前回、「OpenWeatherMap」の天気APIを使いましたが、実際の気温と全然違っていたので、

精度が高い、「tenki.jp」のWEB表示をスクレイピングするようにしました。

朝は6時、昼は12時、夜は18時のデータを取得するようにしています。

var sheet = SpreadsheetApp.getActiveSheet();

function getTenkiHtml(){

sheet.clear();

var response = UrlFetchApp.fetch("https://tenki.jp/forecast/[各都市で変わるURL]/3hours.html");

var html = response.getContentText();

var regexp_table = /

([\s\S]*?)<\/table>/i;
var match_table = regexp_table.exec(html);
var tenki_table = match_table[1];

var regexp_hour = /

([\s\S]*?)<\/tr>/i;
var match_hour = regexp_hour.exec(tenki_table);
var tenki_hour = match_hour[1];

var tenki_hour_arr = tenki_hour.split("

");
sheet.getRange(1, 1).setValue("時間");
for(var i=0;i<tenki_hour_arr.length;i++){
var item = tenki_hour_arr[i];
item = delTag(item);
item = trim(item);
sheet.getRange(1, i+2).setValue(item);
}

var regexp_weather = /

([\s\S]*?)<\/tr>/i;
var match_weather = regexp_weather.exec(tenki_table);
var tenki_weather = match_weather[1];

var tenki_weather_arr = tenki_weather.split("

");
sheet.getRange(2, 1).setValue("天気");
for(var i=0;i<tenki_weather_arr.length;i++){
var item = tenki_weather_arr[i];
item = item.replace(/天気/g, '');
item = delTag(item);
item = trim(item);
sheet.getRange(2, i+2).setValue(item);
}

var regexp_temperature = /

([\s\S]*?)<\/tr>/i;
var match_temperature = regexp_temperature.exec(tenki_table);
var tenki_temperature = match_temperature[1];

var tenki_temperature_arr = tenki_temperature.split("

");
sheet.getRange(3, 1).setValue("気温");
for(var i=0;i<tenki_temperature_arr.length;i++){
var item = tenki_temperature_arr[i];
item = delTag(item);
item = trim(item);
if(item == ""){
continue;
}
sheet.getRange(3, i+2).setValue(Math.floor(item));
}

var regexp_precip = /

([\s\S]*?)<\/tr>/i;
var match_precip = regexp_precip.exec(tenki_table);
var tenki_precip = match_precip[1];

var tenki_precip_arr = tenki_precip.split("

");
sheet.getRange(4, 1).setValue("降水確率");
for(var i=0;i<tenki_precip_arr.length;i++){
var item = tenki_precip_arr[i];
item = item.replace(/降水確率|(\%)/g, '');
item = delTag(item);
item = trim(item);
sheet.getRange(4, i+2).setValue(item);
}

var msg = "今日の天気をお知らせします。";

var asa_weather = sheet.getRange(2, 3).getValue();
var asa_temperature = sheet.getRange(3, 3).getValue();
var asa_precip = sheet.getRange(4, 3).getValue();

msg += "朝の天気は、" + asa_weather + "。";
msg += "気温は、" + asa_temperature + "度。";
msg += "降水確率、" + asa_precip + "パーセント。";

var hiru_weather = sheet.getRange(2, 5).getValue();
var hiru_temperature = sheet.getRange(3, 5).getValue();
var hiru_precip = sheet.getRange(4, 5).getValue();

msg += "昼の天気は、" + hiru_weather + "。";
msg += "気温は、" + hiru_temperature + "度。";
msg += "降水確率、" + hiru_precip + "パーセント。";

var yoru_weather = sheet.getRange(2, 7).getValue();
var yoru_temperature = sheet.getRange(3, 7).getValue();
var yoru_precip = sheet.getRange(4, 7).getValue();

msg += "夜の天気は、" + yoru_weather + "。";
msg += "気温は、" + yoru_temperature + "度。";
msg += "降水確率、" + yoru_precip + "パーセント。";

sheet.getRange(5, 1).setValue(msg); //デバッグ

Logger.log(msg); //今日の天気をお知らせします。朝の天気は、曇り。気温は、23度。降水確率、20パーセント。昼の天気は、小雨。気温は、24度。降水確率、60パーセント。夜の天気は、曇り。気温は、22度。降水確率、50パーセント。
}

function trim(str){
return str.replace(/(^\s+)|(\s+$)/g, "");
}

function delTag(str){ //tag削除
return str.replace(/<("[^"]"|'[^']'|[^'">])*>/g,'');
}

こんな感じで、取得したデータをわかりやすく、スプレッドシートに表示してみました。

このスクリプトをタイマー設定して、最後に出てきたメッセージを Google Home に投げて、音声出力しています。

データの取得方法が、APIではなく、スクレイピングなので、tenki.jp のHTMLテンプレートが変われば、またそれに対応しないといけません。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA