LoginSignup
0
0

More than 3 years have passed since last update.

京都府の今日の天気予報を気象庁のページからとってきて表示する

Last updated at Posted at 2019-10-16

天気を表示したい

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0