早明浦ダムの貯水量をデータベース化するための資料

緊急AdventCalendarに参加してみました!
U1TBのほうではCloud Foundry jp Advent Calendarに参加しているんですが、JB_Plusでは特になにもしていなかったので、思い切って参加してみることにしました。
そんなわけで7日目の記事です。

香川県民ならば誰もが気になる早明浦ダムの貯水率。
県民の多くはテレビや新聞で貯水率を知るわけですが、公式発表としてのデータをウェブで入手することができます。

それが国土交通省 水文水質データベース
ここでは、10分おきのダムの情報と、過去の1時間おきの情報を入手する事が可能です。
ここのデータをクローリングしてデータベース化しておけば、過去の貯水率や水不足の傾向などさまざまな分析ができることになりますね。

ところで、データもらっていっていいの?

過去にはlibrahack事件のような、開発者からみたらぞっとするような事件も起こっていますので、データのクローリングにはできる限りの注意を払わなければいけません。

なので、水文水質データベースの「利用上の注意」を確認したところ、以下のような記述がありました。

また、当ホームページは一般を対象としており、通常のブラウザで閲覧することを前提に情報を掲載しております。ツール等による、自動的なデータ収集等はサーバに負荷がかかり、情報提供できなくなる恐れがありますので原則としてご遠慮ください。ご理解・ご協力お願いします。

うーむ。基本的にはやめておくれという感じですね。ただ、「原則としてご遠慮ください」という表記をどう捉えれば良いのか、気になります。厳しい形で「データの収集は禁止」と言っているわけではないので、特段の事情があれば別枠で許可してくれる余地はありそうな表記とも捉えられます。
実際の所、サーバーの負荷が問題なのであれば、クローリングは1時間に1回にするなどきちんとした節制をもてば、大きな問題にはならないはず。サーバーに負荷をかけないよという約束の下に交渉すれば、もしかしたら許可してくれるかもしれない。

そう考えて、お問い合わせフォームから問合せてみました。

んで送信っと・・・

・・・おい、おい

そんなわけで、許可を取りたくてもそもそも受け入れ先が無いというのが現状です。以下に水文水質データベースのデータ取得方法を記述していきますが、それをどう使うかは自己責任でお願いします

データをクロールしよう!

水文水質データベースでは、以下の2パターンのデータを取得する事ができます。
・過去7日分の、10分おきデータ
・2002年以降すべての時間おきデータ

それぞれ「リアルタイムダム諸量」「任意期間ダム諸量」として、以下のリンクから閲覧できます。

http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0

http://www1.river.go.jp/cgi-bin/SrchDamData.exe?ID=1368080700010&KIND=1&PAGE=0

それぞれのリンク先で直接ダムのデータが閲覧できますね。
その他、datファイル形式でデータのダウンロードも行う事が可能です。
クロールして取得するデータは、このdat形式のほうが都合が良いでしょう。datの中身はカンマ区切りのCSVデータになっています。

datデータを取得するために

このdatデータを取得すればいいのは分かりましたが、じゃあどうやってDLすればいいんでしょう。

例えば今この執筆時点のリアルタイムdatデータURLは以下の通りです。

http://www1.river.go.jp/dat/dload/download/5313680807000102011120822889.dat

また、12/9~12/15の任意期間datデータは以下の通りです。

http://www1.river.go.jp/dat/dload/download/5113680807000102011120928460.dat

ただ厄介なのが、このURLがちょくちょく変わるんですね。
URLに規則性がないかどうか調べてみたのですが、なかなか難しそうです。

リアルタイムデータのdatファイル名
5113680807000102011120928460.dat
のうち、
[51][1368080700010][2011][12][09]28460.dat
プレフィックス:ダムコード:年:月:日 までは分かるのですが、最後の数字が何を意味するのかが分からない。

任意検索についても同じように末尾の数字の意味が分からない。
datファイルを直接URL指定で取ってくるのは諦めた方がよさそうです。

じゃあどうするの

というわけで、WebページをクロールしてリンクされているURLを取得する形にするのが、現時点ではベストといえそうです。

リアルタイムダム諸量だと

http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0

このページをGETして、取得できたHTMLから正規表現でdatファイルを取得します。

任意期間ダム諸量は

http://www1.river.go.jp/cgi-bin/DspDamData.exe?KIND=1&ID=1368080150020&BGNDATE=20110301&ENDDATE=20110330&KAWABOU=NO

このようなURLになっています。BGNDATEとENDDATEに、取得したい日付をパラメータとしてくっつければ取得できます。
ただ仕様上、最大31日分、つまり1ヶ月分しか取得できませんので、クロールしてデータベース化するのであれば、ループで回して月ごとのdatを取得することになるでしょう。

コードを書いてみる

というわけで実際にクロールするコードをRubyで書いていくわけですが、前述したように公式にクロールが認められていないため、完成版のコードは記載しませんん。一部だけ抜粋する感じで書いていきます。

クロールするにはRubyのopen-uriあたりを使うと便利です。

datファイルのURL取得はこんな感じで。

open(search_url){|f|
      url = "http://" + @domain + f.string.match(/¥/dat¥/dload¥/download¥/(.*).dat/)[0]
    }

serarch_urlに、リアルタイムダム諸量や任意期間ダム諸量のURLを突っ込む感じです。
リアルタイムのURLは前述したもの。
任意期間ダム諸量についてはこんな感じのを突っ込めば良いでしょう

def search_url(dam_id, begin_date, end_date)
    return "http://www1.river.go.jp/cgi-bin/DspDamData.exe?KIND=1&ID=#{dam_id}&BGNDATE=#{begin_date}&ENDDATE=#{end_date}&KAWABOU=NO"
end

過去データを一気にクロールする場合は、begin_dateとend_dateに入るものをループで回せばいいですね。

datファイル自体もopen_uriを使って簡単に取得できます。

    dat = OpenURI.open_uri(dat_url)

取得したdatファイルですが、カンマ区切りCSVファイルではありますが最初9行にコメントが入ってますので、読み込む際には9行を読み飛ばすようなコードを書いておくと良いでしょう。

実際クロールする際には、過去データをクロールするのは最初の1回だけで、普段利用するのはリアルタイムダム諸量です。ただデータ形式自体は同じなので、URLからdatを取ってくる部分や、データをパースしてDBに取り込むような部分は共通にしておいて、使うときに切り替える形にすると良いですね。

Comments:1

jaco 11-12-15 (木) 20:54

しまったシンタックスハイライト、このブログに入れてない・・・後でいれます。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://jaco.dotstyle.net/2011/12/%e6%97%a9%e6%98%8e%e6%b5%a6%e3%83%80%e3%83%a0%e3%81%ae%e8%b2%af%e6%b0%b4%e9%87%8f%e3%82%92%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e5%8c%96/trackback/
Listed below are links to weblogs that reference
早明浦ダムの貯水量をデータベース化するための資料 from JB_Plus
Search
Feeds
Meta

Return to page top