æ°è±¡åºã®ãµã¤ãããæ å ±ãåå¾ãã¦ãã¯ã¦ãªã°ã©ãã«ãã¹ãããã¹ã¯ãªãã
id:riocampos2ããã®日記ããããã©ãã¯ããã¯ãããã ããã®ã§è¦ã«è¡ã£ã¦ã¿ãã¨ãããpythonã使ã£ã¦æ°è±¡åºããéæ°´éãæ°æ¸©ãåå¾ãã¦ãã¯ã¦ãªã°ã©ãã«èªåã§ãã¹ãããããããªã
ã¡ãã£ã¨èãã¦ã¿ãã¨ãããrubyã§æ¸ããæ¹ã楽ããã ã£ãã®ã§ãrubyã§æ¸ãã¦ã¿ãã
#!/usr/bin/env ruby # -*- coding: utf-8 -*- $KCODE='u' require 'kconv' require 'ostruct' require 'date' require 'rubygems' require 'mechanize' require 'hpricot' require 'hatena/api/graph' HATENA_ID = 'ï¼ï¼ï¼ï¼' HATENA_PASSWORD = 'ï¼ï¼ï¼ï¼' def get_yesterday_spots_data url = "http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data2.html" agent = WWW::Mechanize.new agent.user_agent_alias = 'Windows IE 6' page = agent.get(url) h = {} doc = Hpricot(page.body) places = (doc/:html/:body/:table/"tr.o1|tr.o2") places.each do |place| spot_infos = (place/"td.oR") break unless spot_infos[11] spot = (place/"td.o0").inner_html.toutf8 # å°ç¹ low = spot_infos[4].inner_html.toutf8 # æä½æ°æ¸© high = spot_infos[3].inner_html.toutf8 # æé«æ°æ¸© avg = spot_infos[2].inner_html.toutf8 # å¹³åæ°æ¸© rainfall = spot_infos[11].inner_html.toutf8 # éæ°´é rainfall = 0 if rainfall == '--' h[spot] = OpenStruct.new({:low => low, :high => high, :avg => avg, :rainfall => rainfall}) end h end def post_graph(spot) d = get_yesterday_spots_data yesterday = Date.today - 1 graph = Hatena::API::Graph.new(HATENA_ID, HATENA_PASSWORD) graph.post_data("#{spot}ã®æé«æ°æ¸©", 'date' => yesterday, 'value' => d[spot].high) graph.post_data("#{spot}ã®æä½æ°æ¸©", 'date' => yesterday, 'value' => d[spot].low) graph.post_data("#{spot}ã®å¹³åæ°æ¸©", 'date' => yesterday, 'value' => d[spot].avg) graph.post_data("#{spot}ã®éæ°´é", 'date' => yesterday, 'value' => d[spot].rainfall) end post_graph("æ±äº¬")
æ°è±¡åºã®このページãããæ¨æ¥ã®æ¥ä»ã®éæ°´éãæé«ãæä½ãå¹³åæ°æ¸©ãåå¾ãã¦ãã¯ã¦ãªã°ã©ãã«ãã¹ããã¾ããこんな感じãpost_graphã¡ã½ããã®å¼æ°ã«ã¯ãé©å½ãªå ´æãæå®ãã¾ãã
ã¡ãªã¿ã«ãget_yesterday_spots_data ã¯ãæ¨æ¥ã®å ¨å½ã®æ°è±¡æ å ±ã®ããã·ã¥ãè¿ãã¾ãã®ã§ãä¸ã®ããã«æ¸ãã¨ãå ¨å½ã®éæ°´éãã¹ãï¼ï¼ãåå¾ã§ãã¾ãã(æ°è±¡åºã®ãµã¤ãã§ãã¿ãã¾ããã©ããã)
>> d = get_yesterday_spots_data >> d.map {|k, v| [k, v.rainfall.to_f]}.sort {|x, y| y[1] <=> x[1]}[0...10] [["é£è¦", 138.5], ["ä¹ ç±³å³¶", 111.5], ["æ¸ æ°´", 64.0], ["延岡", 52.0], ["æå´", 51.0], ["大å", 46.5], ["åè·", 43.0], ["å®®å¤å³¶", 42.5], ["é¿èå±±", 39.0], ["å¹³æ¸", 38.5]]