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に疎い小生にはもう少し時間が必要です。

以上。





 

Sponsored Link

 

Comments