読者です 読者をやめる 読者になる 読者になる

学会名鑑をハックしてみる

今回のテーマ


学会名鑑というDBがあります。Web APIはありません。GETではなくPOSTというやり方で検索時のデータを渡しています。このDBから自由にデータを取り出して遊んでみようと思います。某所で地味に没ってしまった企画(?)ですが、せっかくなのでリードテックラボでそれを記録して書き留めておきたいと思います。

学会名鑑、てなに?


学会を調べることができるDBです。

http://gakkai.jst.go.jp/gakkai/control/toppage.jsp

検索窓に検索ワードを入れるタイプの検索と、「詳細な検索」ボタンを押すと詳細画面にフィールドを指定して検索する2種類の検索方法があります。詳細検索では以下のキーワードで検索できます。

  • 分野
  • 機関名(学会名)
  • 設立
  • 住所
  • 代表者
  • フリーワード

検索ウィンドウが空のまんまで検索できるので検索してみます。[1918件]とでましたね *1。たぶんおそらくこれがDBに収録されている学会の全部の数です。

どんなデータのやりとりをしているかを調べる


まずどんな仕組みでデータをやりとりしているかを調べます。今回Google Chromeを使ったやり方を書きます。まずChromeで「デベロッパーツール」を表示します。これを使うとブラウザの裏側でどんなデータがやり取りされているかを表示することができます。Firefoxをお使いの方はFirebugなどのアドオンをぜひお使いください。準備ができたら学会名鑑のHPにアクセスします。

f:id:haseharu:20120707170230p:plain

とりあえず検索して動かしてみる

学会名鑑のHPで「知識」を検索キーワードとして検索してみます。検索後のURLにまず注目します。

http://gakkai.jst.go.jp/gakkai/result

となっているので、検索語はURLに含まれていない(HTTP GETで渡されていない)ことに気がつくと思います。HTTP POSTというやり方でデータを渡しているのでChromeのデベロッパーツールのようなものでデータのやりとりを追っかけてみます。デベロッパーツールでは下記の場所(Network -> result -> Headers)を表示しておきます。

f:id:haseharu:20120707170037p:plain

すると「Form data」というところに

command_id:4
k_keyword:知識

と表示されているはずです。これが検索時にPOSTによってDB側に渡しているデータの一覧になります。あとは各種プログラムを使って機械的にこのデータを渡すことでDBの検索結果を得ることができます*2。検索結果画面のhtmlを取得し正規表現を使って学会名だけスクレイピングします。

サンプルプログラム

PHPを使ったサンプルプログラムを以下に示します。

プログラムの結果

うまく学会名だけ取り出せているのが分かると思います。

f:id:haseharu:20120707170355p:plain

さいごに


今回のような手法はけっこういろんなことに使えると思います。ただし、人間がブラウザを立ち上げてURLにアクセスして使うことを想定したサービスに対して機械的にアクセスしてデータを取り出すことになるのでサービス提供側では「そんな使い方意図してない」という状況になってしまいかねません。サービス提供側を困らせる可能性もありますので、個人的なツールとして作って個人的な範囲で試用してみるならまだしもそれ以上の使い方をするようであれば、サービス提供側に一度問い合わせていただくほうが無難でしょう。

かんそう


どんなところにどんなデータがあってそれを自分ならどんなふうにハンドリングして遊ぶか、そんなことばかり考えてウェブの世界をいつも眺めています。今回のデータハンドリングの方法はやや強引なやり方でもあり、Web APIによるデータ公開やLODの流れの中で今後下火になっていく手法だと思いますが、POSTで各種データを渡す堅いDBはそれなりに残っていくと思われるので覚えておくとそれなりに役立つんじゃないかとは思います。

*1:H24/7 現在

*2:実際にはk_keywordはURLエンコードされて渡されます