天気を表示したい
slack に毎日天気を表示させるために気象庁のページから今日の天気予報をスクレイピングしました
そのうち gem にしたいとは思うけれど時間があまりとれないので、ここに張り付けておく
気象庁の天気の注意ポイント
- 毎日5時・11時・17時に発表される
- 予報なので発表時点で過去のデータは表示されない
例えば 11時の発表時点で 00-06 と 06-12 の予報は削除されている
ソースコード
なので下のコードで Safe Navigation Operator つけて空文字表示を実現しています
なおライセンスは MIT にしておきます。
require 'mechanize'
agent = Mechanize.new
page = agent.get("https://www.jma.go.jp/jp/yoho/333.html")
prefecture = page.at(".titleText").children.text.delete("天気予報\n: ")
table = page.search('#forecasttablefont')
INDEX_1_AREA = 3
INDEX_1 = 5
today_weather = []
today_weather[0] = {}
today_weather[0][:area] = table&.children[INDEX_1_AREA]&.search(".th-area")&.children&.at("div")&.children&.first&.text
today_weather[0][:weather] = table&.children[INDEX_1]&.search(".weather")&.children&.search("img")&.attribute("alt")&.value
today_weather[0][:rainy_percent] = table&.children[INDEX_1]&.search("table.rain")&.search("td")&.map(&:children)&.map(&:text)
today_weather[0][:temp] = {min: table&.children[INDEX_1]&.search("table.temp")&.search("td.min")&.children&.text, max: table&.children[INDEX_1]&.search("table.temp")&.search("td.max")&.children&.text}
INDEX_2_AREA = 11
INDEX_2 = 13
today_weather[1] = {}
today_weather[1][:area] = table&.children[INDEX_2_AREA]&.search(".th-area")&.children&.at("div")&.children&.first&.text
today_weather[1][:weather] = table&.children[INDEX_2]&.search(".weather")&.children&.search("img")&.attribute("alt")&.value
today_weather[1][:rainy_percent] = table&.children[INDEX_2]&.search("table.rain")&.search("td")&.map(&:children)&.map(&:text)
today_weather[1][:temp] = {min: table&.children[INDEX_2]&.search("table.temp")&.search("td.min")&.children&.text, max: table&.children[INDEX_2]&.search("table.temp")&.search("td.max")&.children&.text}
result = "```\n"
result << "#{prefecture}\n"
today_weather.each do |v|
result << "───────────\n"
result << "#{v[:area]}\n"
result << "#{v[:weather]}\n"
result << "🗾降水確率\n"
v[:rainy_percent].each_slice(2) do |r1, r2|
result << "#{r1} #{r2}\n"
end
result << "🌡️気温\n"
result << "最低 #{v[:temp][:min]}\n"
result << "最高 #{v[:temp][:max]}\n"
end
result << "```"
puts result