Calendar

December 2010
M T W T F S S
« Nov   Jan »
 12345
6789101112
13141516171819
20212223242526
2728293031  

気象データを取得する – 気象庁編


降水量が知りたい

以前、気象データを取得する – METAR編 で、全国の空港の気象情報(METAR)の取得を試み、最終的には 全国の不快指数 というGAEアプリを作成し、METARの自動収集・グラフ表示が出来るようにしました。

しかし、 METARには大きな不満があります。 それは「降水量が分からない」ということです。

飛行機を飛ばすには雨が降ってる/降ってないだけで降水量は不要かもしれませんが、 私の畑には必要です

(2010年夏のトマト)
CIMG1528

そもそも気象データを集めようとしたのは 畑の水やりタイミングの判断のため なので、降水量が分からないと意味がありません。 (家から畑まで遠いので…)

ということで、降水量のデータがある気象庁から、気象データの取得を試みることにしました。 (ついに本丸に突入です)

気象庁のホームページ

気象庁のHPのトップページはこちらです。

http://www.jma.go.jp/jma/index.html

ここからどんなデータを取れるか調べてみます。

気象データの入手方法

まずは次のページの説明を読んでみます。

・気象観測データ等の閲覧や入手について – http://www.jma.go.jp/jma/kishou/know/faq/faq17.html


関係ありそうな項目は…

気象庁ホームページで過去の観測データや平年値を閲覧できますか?

全国の気象台やアメダス観測所の観測データは、過去の気象データ検索で閲覧することができます
ご覧になりたい都道府県・地点、年月日、「データの種類」でご覧になりたい要素を選択していただくと、一覧表が表示されます。

検索画面はあるようです。 しかし、こちらが欲しいのはデータだけ、しかもプログラムから自動で取得したい。

気象庁ホームページから気象観測データをダウンロードできますか?

気象庁ホームページは、通常のブラウザで閲覧することを前提に各種情報を掲載しております。
このため、気象観測データのダウンロードには対応していません

データだけ取得することは出来ないようです。

アメダス観測データやウィンドプロファイラの観測データを気象データセットとして入手したいのですが?

観測データの入手につきましては、(財)気象業務支援センターからCD-ROMを販売していますので以下へお問合せください。
(財)気象業務支援センター TEL:03-5281-0440

有料ですかっ! (財)気象業務支援センターのHP「CD-ROM資料の詳細」で確認すると…

4,200円(1か月分。CD-ROM1枚)(本体4,000円+税200円・送料別)

こ、これは… 畑の一月分の地代より高い! 8-O


ということで生データはあきらめ、検索画面の結果(HTMLファイル)から必要なデータだけを抽出(スクレイピング)することにします。

気象データ検索ページ

URL

先ほどの説明にあった過去の気象データ検索ページはここです。

・過去の気象データ検索 – http://www.data.jma.go.jp/obd/stats/etrn/index.php

このページで、

  1. 地点の選択 → 都道府県「大阪」、地点「大阪」
  2. 年月日の選択 → 「2010年」、「11月」
  3. データの種類 → 「2010年11月の日ごとの値を表示」

を選択すると、次のURLにジャンプして2010年11月の日別の気象データ一覧が表示されます。

http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=62&prec_ch=%91%E5%8D%E3%95%7B&block_no=47772&block_ch=%91%E5%8D%E3&year=2010&month=11&day=&elm=daily&view=

長いですね。このURLをBASE64デコードすると次のようになります。

http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=62&prec_ch=大阪府&block_no=47772&block_ch=大阪&year=2010&month=11&day=1&elm=daily&view=

都道府県名(prec_ch=大阪府)や、地点名(block_ch=大阪)って要るんでしょうか? また、月単位の表示なので、日付(day=1)も無意味っぽいですよね? 「地点コード」「年」「月」だけで検索条件は十分な気がします。
ということで、「地点コード」「年」「月」だけ引数に指定し、他は全て削除してみました。

http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?block_no=47772&year=2010&month=11

これでも最初のURLと同じ検索結果を得ることが出来ました。

HTMLの構造

スクレイピングするために、検索結果のページの構造を確認します。

下の図のように、目的のデータはテーブルの中にあります。

SS_www_data_jma_go_jp

検索結果のページにはテーブルが複数ありますが、気象データが格納してあるテーブルはクラス指定(class="data2_s") されてます。

<table class="data2_s" summary="大阪 2010年11月">
<caption class="m" >大阪 2010年11月 <span id="screen">(日ごとの値) 主な要素</span></caption>
<tr class="mtx"><th rowspan="4">日</th>...</tr>
<tr class="mtx"><th>現地</th><th colspan="1">海面</th></tr>
<tr class="mtx"><th rowspan="2">平均</th>...</tr>
<tr class="mtx"><th>1時間</th>...</tr>
<tr class="mtx" ...><td ...><div ...><a ...>1</a></div></td>...</tr>
<tr class="mtx" ...><td ...><div ...><a ...>2</a></div></td>...</tr>

クラス付きでtableタグを検索し、ヘッダ(4行)スキップすれば、気象データに辿り着きます。

そして、各レコードの2列目に降水量17列目に日照時間があります。

データを取得する

URL、及びページ構造が分かったので、実際に気象データ(HTMLページ)をダウンロード&スクレイピングするPythonスクリプトを作ってみます。

HTMLパース用に Beautifulsoup と pyquery の2つのライブラリを使ってみて、両者の違いも確認します。

Beautifulsoup

まずは Beautifulsoup から試してみます。

参考

Beautifulsoup – http://www.crummy.com/software/BeautifulSoup/documentation.html

インストール

Ubuntuの場合、apt-get で簡単にインストール出来ます

$ sudo apt-get python-beautifulsoup
スクリプト

作成したスクリプトはこれです。

#!/usr/bin/env python
# coding: UTF-8
#
# @see http://www.crummy.com/software/BeautifulSoup/documentation.html
#
import os
import urllib2
from BeautifulSoup import BeautifulSoup

def str2float(str):
    try:
        return float(str)
    except:
       return 0.0 

if __name__ == "__main__":
    url = 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?block_no=47772&year=2010&month=11'

    # サーバーから気象データのページを取得
    html = urllib2.urlopen(url).read()

    soup = BeautifulSoup(html)

    trs = soup.find('table', { 'class' : 'data2_s' })

    list = []

    # 1レコードづつ処理する
    for tr in trs.findAll('tr')[4:]:
        tds = tr.findAll('td')

        if tds[1].string == None:   # その月がまだ終わってない場合、途中でデータがなくなる
            break;

        dic = {}
        dic['day']              = str(tds[0].find('a').string)   # 日付
        dic['precipitation']    = str2float(tds[3].string)       # 降水量
        dic['temperature.avg']  = str2float(tds[6].string)       # 気温 - 平均
        dic['temperature.high'] = str2float(tds[7].string)       # 気温 - 最高
        dic['temperature.low']  = str2float(tds[8].string)       # 気温 - 最低
        dic['sunshine duration']= str2float(tds[16].string)      # 日照時間

        list.append(dic)

    # 最後に結果を表示する
    for dic in list:
        print dic

まぁ、読めば分かる程度の簡単なスクリプトです。

pyquery

次にpyquery です。

参考

pyquery – http://packages.python.org/pyquery/api.html

インストール

Ubuntuの場合、apt-get で簡単にインストール出来ます

$ sudo apt-get python-pyquery

pyquery は依存関係が、 pyquery → lxml → (libxml, libxslt, zlib) となっているので、Ubuntu以外にインストールする場合、環境毎にインストール方法を確認して下さい。

スクリプト

Beautifulsoup版と同じ事をしてます。

#!/usr/bin/env python
# coding: UTF-8
#
# @see http://packages.python.org/pyquery/api.html
#
import os
from pyquery import PyQuery

def str2float(str):
    try:
        return float(str)
    except:
       return 0.0 

if __name__ == "__main__":
    url = 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?block_no=47772&year=2010&month=11'

    # サーバーから気象データのページを取得
    d = PyQuery(url)

    list = []

    # 1レコードづつ処理する
    for tr in d(".data2_s > tr")[4:]:   # ここのセレクトは jQuery っぽい
        tds = PyQuery(tr)("td")

        if tds.eq(1).text() == '':
            break;

        dic = {}
        dic['day']              = tds.eq(0).text()             # 日付
        dic['precipitation']    = str2float(tds.eq(3).text())  # 降水量
        dic['temperature.avg']  = str2float(tds.eq(6).text())  # 気温 - 平均
        dic['temperature.high'] = str2float(tds.eq(7).text())  # 気温 - 最高
        dic['temperature.low']  = str2float(tds.eq(8).text())  # 気温 - 最低
        dic['sunshine duration']= str2float(tds.eq(16).text()) # 日照時間

        list.append(dic)

    for dic in list:
        print dic

Beautifulsoup版 と大き違いはありませんが、jQuery に慣れてる人にとっては、セレクタの使い方が少し楽かもしれません。

Beautifulsoup .vs. pyquery

どちらかというと pyquery の方が使いやすそう、 という印象を受けました。 (jQueryに手を出したせいもあると思いますが)

ただし、pyquery は libxml など Cで書かれたライブラリに依存しているため、GAE で使えません。 ということで、Beautifulsoup を使う事になりそうです。

最後に

とうとう、気象庁のデータ(ページ)にアクセスしてしまいました。

気象庁の測定データは測定地点毎に測定項目が異なり、大阪で「降水量」と「日照時間」の両方が揃っている測定地点は「大阪市内」しかありません。 そこから自分の畑(高槻市上牧)まで距離があるのが気になります。 (むしろ京都の方が近いかも…)

通り雨や夕立まで正確に把握するには、自分で測定機械を設置するのかないかも知れませんが、それはそれで大変だし…

やはり自宅近くに畑を確保するのが一番手堅いかな。

1 comment to 気象データを取得する – 気象庁編

  • こんにちは.気象庁の気象データをダウンロードする方法を検索していてたどり着きました.htmlを解析してテーブルからデータを取得する方法が分からないため,EXCELのWEBクエリをVBAに組み込んで取得する方法で凌いでいます.勉強になります.