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を使わずそのまま作っているサイトだったので、いろいろと苦労があった。表として、一日分のデータとしてまとまっていないので、一日ごとのデータを取得不能。とはいえ、レイアウトは綺麗なので特定のタグを一括して取得して、それを後から整形するという戦略を取る。
データの取得編
ポイント
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の内容を入れるようにする。
Ralwer ミクシーにアクセスする。
https://gist.github.com/4023418
ミクシーにアクセスして情報を取ってくるサンプル。入力ファイルは、ミクシーのコミュニティのURL一覧。この一覧と対応させた形で、画像のURLを取ってくる。
ポイント
作業フォルダの指定
ファイルの指定を簡単にするために[SetWorkFolder]で作業フォルダの指定をする。この場合、マイドキュメントに「ORF2012」というフォルダを指定している。存在しないときは新たに作る。これ以降、ファイル名を指定した時、そこにファイルが出来る。今までは、EXEが存在したところにファイルが溢れかえることになったが、そういうことがなくなった。
ミクシーにログインする
[LoginClient]を使いミクシーにログインする。この情報はログインページのHTMLを読んでやる。[LoginClient.LoginPostVals]でフォームに書いてあるパラメータを入れる。ミクシーの場合これでいい。
Rawler起動時にフォーム入力
@@をつなげると、ここは起動時にフォームが立ち上がり、そこで入力できるようにしてある。そのため、パスワードを直書きしなくてすむ。ここでは、@@name と@@passwdで名前とパスワードを起動時に入力できるようになっている。
URLのパラメータを取得する
[GetUrlParameter]はURLの中にあるパラメータの値を取得する。要は、動的なページによくある、?以降の文字の羅列から必要な情報を取得する。この場合は、「id」のパラメータを取得している。
ほかは、範囲を指定してそこの画像を取得する、それのデータを書き込むといったRawlerの得意作業。
Rawler 一覧ページから名前と画像を取得する。
ソース https://gist.github.com/4000687
一覧のページから飛んで、画像を欲しいという話があったので作成。一分くらいで完了する。
ポイント
複数のファイルの読み込み
[Iterator]をつかい、複数のURLを指定。[Texts]のところで[TextValue]を指定する。数が少なければ、カンマ区切りにして[Document]に入れて、それを[Split]してもいいと思う。
多段ページ読み込み
Rawlerの得意技、Page→(範囲指定)→Links→Page での多段ページ読み込み。
画像の取得とファイル名設定。
画像取得は、ImageLinks→DawonLoadの流れ。今回はファイルの名前を変えたいので、[SaveNameTree]から作成。とはいえ、直前のテキストは画像のURLなので、ページ全体を対象にするために、GetPageHtmlで最も近い[Page]からHTMLを取得して、それから処理をしている。
あと、作っている時にぼけていたのだけど、[NextDataRow]を入れておかないと、期待通りの振る舞いをしてくれないので、忘れずに入れる。
Rawler ブログからのデータ取得
- Rawlerソースコード https://github.com/kiichi54321/Rawler
- wiki http://web.sfc.keio.ac.jp/~kiichi/wiki/index.php?Rawler
今回のRawlerサンプル https://gist.github.com/3980898
アメブロからのデータ取得用に作ったもの。NameUrlList.tsvにページ一覧のリストを作って置く。フィールドはURLとName。URLにはブログの一覧ページのURLをいれる。文字コードはUTF8。ブログのテキストと、コメント、画像まで取得する。
ポイント
- 複数のデータを保存する。
これは、ブログのテキストと、コメント、画像のデータを取るため、ひとつのデータベースで言うテーブルではなく、複数のテーブルを使う必要があったので、複数のデータテーブルを使っている。一つのファイルで表現しようとすると、冗長になる。データベースで言う正規化を行う必要がある。
使い方は単純、複数の[FileSave]を置き、FileSaveMode="Append"にする。これは追加書き込みをできるようにする仕組みである。ファイル名も必ず指定する。[DataWrite]は、最も近い上流の[FileSave]にしか反応しないことを注意する。
- 動的な解析対象のURLの作成
はじめの方の、[Iterator.SourceTree]で読み込むページを動的に作成している。ファイルから、一覧ページのURLを取得し、そのURLからアクセスし、その内容を解析して使うべきURLのリストを作っている。[IteratorSourceAddText]を使うことで、ItIteratorにテキストを送ることができる。この場合、繰り返しでURLのリストを作るので、必ず、IteratorSourceClearでソースリストを空っぽにしておかないと行けない。
- 一度だけ取得する[PageOnce]
[PageOnce]はページを読んだ時、一度しか行わないことを指定する。Rawlerのページング機能は強力だが、ブログの記事のようにページング外のものを欲しい時もあるのでこの命令を追加した。 [PageOnce]は直前の[Page]を参照して、初めてのページの時に実行され、[NextPage]からのページングの時には実行されない。
- 画像の保存
画像の取得は、[ImageLinks]→[DownLoad]の流れで取得。保存。この例では、画像の保存するフォルダを動的にするために、[DownLoad.FolderNameTree]を使っている。
Rawler 指定した単語群の言葉が文章にどれだけ含まれているか数え上げる。
- Rawlerソースコード https://github.com/kiichi54321/Rawler
- wiki http://web.sfc.keio.ac.jp/~kiichi/wiki/index.php?Rawler
文章中に含まれている顔文字の数を数えるのに使ったRawlerソース
https://gist.github.com/3980609
これを起動すると、対象ファイル、顔文字一覧ファイルを指定すると、実行される。
対象ファイルは、ScreenNameというフィールドが必要。顔文字一覧ファイルは、ただの改行区切りのテキスト。ともに、エンコードはUTF8にしておく。
ポイントは、
- カウント処理
CountAddでのカウントするデータをCountDataに送りカウントするデータをためる。CountAdd.GroupTree で、グループ化する変数を決定している。
- <m:WordsCount> 命令
親のテキストで<m:WordsCount.SouceIterator>で指定された言葉群に含まれている単語があれば、その単語を返す。複数その言葉が存在していれば、その分、複数返す。今のところ、低速ですね・・・。
- <m:WordsCount.SouceIterator>
>WordsCountで反応させる単語を指定している。中身は、Iteratorとなっており、ファイルを読み込むという処理をしている。
しかし、よく考えると、WordsCountという名前はおかしいよな・・・。
3.11.14.46 ツイッターのRTで振り返る3.11 というツールを公開しました。
震災から、ほぼ一年たったので、ちょうどよい機会なので、前に作ったものを公開します。
去年の11月のSFCのORF(オープンリサーチフォーラム)で出したものだけど、もともとWebで見れるようにしてあって、僕の怠慢で公開しそびれていたものです。
3.11.14.46 ツイッターのRTで振り返る3.11
クリックするとツールに飛びます。
これは、震災が起きた、2011年3月11日~13日に間にRTをたくさんされたものを上から一万件を取ってきて、それを10分刻みにまとめて、それを指定秒数で表示しているものです。よくRTされているものと言うことで、踏み込んだ解釈をすれば、多くの人がなにかしら見たベーシックなTLということになると思います。SilverLightなのでWebブラウザでみれます。少し待ってスタートボタンを押してください。
その10分間に多くの種類のRTがされる時は、ものすごくはやくツイートが流れていきます。震災直後はすごいことになっています。ちなみにツイートにマウスをのせると止まるので、読みたい時はのせて止めるといいと思います。
時間がたつごとにトピックは変わっていきます。震災直後、帰宅難民、安否確認サービス、原発、注意の呼びかけ、はげまし、電力供給不足などなど変わっていきます。横のトレンドの欄は、その時刻のRTを形態素解析して言葉として頻度の多いもの順に並べています。早く流れていいてもその時のトピックはおおよそわかると思います。
ツイッターは、震災では無力だったなどの議論がありますが、このパッションは大事にした方がいいことだと思います。みていると、必死さは伝わってくる。さすがに被災者の体験したことと比べたら、お遊びみたいなものなのかもしれませんが。
また、同じ大学の研究室の人が作ったものに、
があります。これは、震災時のツイートに含まれている地名(駅名)をヒートマップにしたものです。ジオタグをつかっていないので、その人がそこにいるという保証はありません。10分刻みで、話題になっている地名を可視化した感じです。僕的には、近くの江の島ヤバイというツイートがちゃんと出ているのが印象的でした。
ちなみに、僕のツールに関しては、ちょこちょこ不具合がありますし(時間制御関係)、いきなり10Mもの画像データを読み込むので、重たいかと思います。能力の低いPCでは辛いかもしれません。申し訳ないですね。