mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby on Rails - アメダスデータ取得!

[ webサイト, プログラミング ] [ HTML, Rails, Ruby ]

こんばんは。

Ruby on Railsで気象庁のアメダスデータのページから気温・湿度等の最新のアメダスデータを取得してみました。

以下がその記録です

作業記録

前提条件

・Ruby on Railsの環境が構築済みであること。(Windows, Linux, BSD等OSは問わない) ・取得するアメダスデータは「島根県松江市」。 (データの存在する都市であれば、URL内のコードを変更することで「島根県松江市」以外も対応可能) ・最新のデータといっても、1時間毎のデータです。

1. Gemfile編集

“hpricot"をインストールするため、Railsアプリフォルダ内の"Gemfile"の最終行に以下の記述を追加する。

1
gem 'hpricot'

2. hpricotのインストール

コマンドラインでRailsアプリのディレクトリへ移動し、以下のコマンドで"hpricot"をインストールする。

1
bundle install

3. ソース作成

“app/controllers"ディレクトリ内の"application_controller.rb"に以下の内容でメソッドを追加する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# アメダス取得
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