日記

まじめなブログにしたい・・・

Rawler 天気データの取得

ツール http://web.sfc.keio.ac.jp/~kiichi/soft/rawler/publish.htm

ソース https://gist.github.com/4202943

実行のやり方:ツールを起動して、ソースをコピペしてRun。

 

お天気のデータを取得する必要に迫られてお天気データ取得。

http://www.weather-eye.com/weatherchart/

というお天気データサイトがあったので、ここから取得します。

一年分の大阪の天気が必要だったので、http://www.weather-eye.com/weatherchart/src/1201_47772.htm ここを起点にページ送りをすることで、一年分のデータの取得を狙います。

対象のサイトが古いサイトだったので、見た目をCSSを使わずそのまま作っているサイトだったので、いろいろと苦労があった。表として、一日分のデータとしてまとまっていないので、一日ごとのデータを取得不能。とはいえ、レイアウトは綺麗なので特定のタグを一括して取得して、それを後から整形するという戦略を取る。

そのため、今回は2段構えでいきます。一段目は、データの取得、2段目は、データの整形です。

データの取得編

ポイント

QuerySkipExtend

一気に取得すると、一日分の午前午後の天気のデータが取れるので、これを偶数奇数で分けたい。このために、QuerySkipExtendを作った。これは、割り算をした時に、余りがいくつであるかを調べて、指定した余りであれば、それを採用していく。そのため、「<QuerySkipExtend Remainder="1" Quotient="2">」の設定だと、奇数が、「<QuerySkipExtend Remainder="0" Quotient="2">」の設定だと偶数にあるものを取得できる。

QueryAddCounter

日付を追加するために作った。とはいえ、これは、リストに対して、先頭に数字を入れて行く事で、カウンターにしている。そのため、「くもり,雨,はれ,雨,」というデータが、「1:くもり,2:雨,3:はれ,4:雨,」に変換される。

データ整形編

DataとChangeCurrentDataRow

Dataに拡張を施した。FileNameの指定で、処理が終わるタイミングでファイル保存が発生するようにした。そのためただ保存するという目的においては、FileSaveとおなじになった。しかし、Dataの保存はすべてのデータがため切ったあと行われるため、大きいデータの場合、それまでメモリーを食い、途中までの取得が保存されないため不利である。一方、FileSaveは逐次書き込みを行えるため、巨大なデータの保存用であるという位置づけになった。

このような変更にしたのは、Dataの一列分を格納しているDataRowへのランダムアクセスを可能にするためである。今までの仕組みでは、新しいデータを追加していくことができても、すでにあるデータに戻って、それに対してのデータの追加はできなかった。この変更により、データを読んでいく中で、自由にデータの組み替えができるようになった。

このDataRowへの移動には、ChangeCurrentDataRowを使う。親のテキストをKeyとして、そのKeyのDataRowに移動する。Keyに該当するものがないときは、新たに生成する。

ここでは、年月と日の文字列を合成させて、新たな文字列を作り、それをKeyとし、日付ごとのデータの作成を可能にしている。

繰り返しの処理への変換

はじめは、午前、午後、最低気温、最高気温ごとにツリーを4つ作ってみたが、さすがに冗長なので、繰り返しを使ってまとめてみた。繰り返しは、IteratorとGetCurrentIteratorの組み合わせで使う。動的な変数を扱うために、TreeにGetCurrentIteratorの内容を入れるようにする。