気象庁のサイトから情報を取得して、はてなグラフにポストするスクリプト - Λάδι Βιώσας
を下地にして、
http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?block_no=1596&year=2008&month=04
などのAMEDASデータから前日の降水量、平均・最高・最低気温をはてなグラフにポストするスクリプトを作成した。
初めてのスクリプトなのでへたくそなところが多いと思うが、ご指摘いただければ幸い。
getAMEDASdata2.rb
観測地点番号("0001"〜"1596")、西暦4桁、月を指定することで一ヶ月の降水量、気温データを取得する。
# -*- coding: utf-8 -*- $KCODE='u' require 'kconv' require 'ostruct' require 'date' require 'rubygems' require 'mechanize' require 'hpricot' def get_point_data(placeno,yy,mm) url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?block_no=" + placeno.to_s + "&year=" + yy.to_s + "&month=" + mm.to_s agent = WWW::Mechanize.new agent.user_agent_alias = 'Windows IE 6' page = agent.get(url) amedas_hash = {} doc = Hpricot(page.body) place_pre = (doc/:html/:body/:table/"caption.m").inner_text.toutf8.gsub(/ /,' ') if place_pre =~ /^.*?\s/u place = $&.strip end data = (doc/:html/:body/:table/"tr.mtx") data.each do |days| dd = (days/'a[@href^="hourly_a1.php"]').inner_html.toutf8 # 日付 next if dd == "" amedas_data = (days/"td.data_0_0") rainfall = amedas_data[0].inner_html.toutf8.to_f # 降水量 avg = amedas_data[3].inner_html.toutf8.to_f # 平均気温 high = amedas_data[4].inner_html.toutf8.to_f # 最高気温 low = amedas_data[5].inner_html.toutf8.to_f # 最低気温 amedas_hash[dd] = OpenStruct.new({:place => place, :rainfall => rainfall, :avg => avg, :low => low, :high => high}) end return amedas_hash end
下のpostHatenaGraph2.rbでは使っていないけど、観測地点名もamedas_hash.placeとして含めている。
#観測地点名の切り出しが下手くそで…。
postHatenaGraph2.rb
# -*- coding: utf-8 -*- $KCODE='u' require 'kconv' require 'ostruct' require 'date' require 'rubygems' require 'hatena/api/graph' require 'getAMEDASdata2' HATENA_ID = '****' HATENA_PASSWORD = '****' def post_graph(pointno) yesterday = Date.today - 1 yy = yesterday.year mm = yesterday.month dd = yesterday.day amedas = get_point_data(pointno,yy,mm) graph = Hatena::API::Graph.new(HATENA_ID, HATENA_PASSWORD) graph.post_data("降水量", 'date' => yesterday, 'value' => amedas[dd.to_s].rainfall) graph.post_data("平均気温", 'date' => yesterday, 'value' => amedas[dd.to_s].avg) graph.post_data("最高気温", 'date' => yesterday, 'value' => amedas[dd.to_s].high) graph.post_data("最低気温", 'date' => yesterday, 'value' => amedas[dd.to_s].low) end post_graph("1596") # "0001"〜"1596"
最後のpost_graph("観測地点番号")で、観測地点を指定している。