Ruby on Rails - アメダスデータ取得!
Updated:
Ruby on Railsで気象庁のアメダスデータのページから気温・湿度等の最新のアメダスデータを取得してみました。
以下がその記録です
作業記録
前提条件
・Ruby on Railsの環境が構築済みであること。(Windows, Linux, BSD等OSは問わない) ・取得するアメダスデータは「島根県松江市」。 (データの存在する都市であれば、URL内のコードを変更することで「島根県松江市」以外も対応可能) ・最新のデータといっても、1時間毎のデータです。
1. Gemfile編集
“hpricot”をインストールするため、Railsアプリフォルダ内の”Gemfile”の最終行に以下の記述を追加する。
gem 'hpricot'
2. hpricotのインストール
コマンドラインでRailsアプリのディレクトリへ移動し、以下のコマンドで”hpricot”をインストールする。
bundle install
3. ソース作成
“app/controllers”ディレクトリ内の”application_controller.rb”に以下の内容でメソッドを追加する。
# アメダス取得
def get_amedas
require 'hpricot'
require 'open-uri'
# データ取得先URL
url = "http://www.jma.go.jp/jp/amedas_h/today-68132.html?groupCode=51&areaCode=212"
# HTML取得
html = Hpricot( open( url ) )
array = [] # データ用配列 ( 1日分 )
# "#tbl_list"のTABLEタグを1行ずつ読み込み
html.search('#tbl_list tr').map do |tr|
arr = [] # データ用配列 ( 1時間分 )
# 1時間分のデータ読み込み
tr.search('td').each do |td|
arr << td.inner_html.strip
end
array << arr
end
# 何番目に「気温」、「湿度」、「気圧」のデータが格納されているかを検索
# ( 列の構成が変更になっても対応可能 )
col_temp = array[0].index("気温")
col_humi = array[0].index("湿度")
col_pres = array[0].index("気圧")
row_cnt = 0
array.each do |row|
# 1,2行目はヘッダ部分なので読み飛ばす
if row_cnt > 1
# 気温データが数値でなければ、ループ終了
if /^[+-]?\d+\.?\d*$/ =~ row[col_temp].to_s
@now_hour = row_cnt - 1
@now_temp = row[col_temp].to_s
@now_humi = row[col_humi].to_s
@now_pres = row[col_pres].to_s
else
break
end
end
row_cnt += 1
end
end
※ちなみに松江市の場合、「気温」、「湿度」、「気圧」の他に「降水量」、「風向」、「風速」、「日照時間」も取得可能です。
4. メソッドの呼び出し
あとは前述のメソッドを各controll内で実行すれば時間・気温・湿度・気圧が取得できるので、表示したい場所(viewソース内)で@now_hour,@now_temp,@now_humi,@now_presを使用すればよい。 当方の場合は、ヘッダ画像部分に表示するため、全controll内で”get_amedas”メソッドを実行し、ヘッダ用のview内に表示用ソースを記述しています。
作業は以上です。
実際の出来栄えはこちらで確認できます。
今回は、直近の正時のデータを取得・表示させていますが、毎正時のデータを取得しますので、一覧表示等も即可能です。 また、取得元URLを操作したり、取得ロジックを変更したりすることで他のページのデータも取得可能です。
“hpricot”(他に”mechanize”等)を使用すれば、HTMLソース内から必要なデータを取得することが可能です。
当方は同様の方法で(といっても、もっと複雑な方法ですが)、みずほ銀行のサイトから数字選択式宝くじの当選データを取得・公開したり()、Yahoo!ファイナンスから株価データを取得(非公開)したりしています。
また、当ブログ(WordPress)でもアメダスデータを表示させたいところですが、PHPに疎い小生にはもう少し時間が必要です。
以上。
Comments