2010年10月18日月曜日

TwitterのSearch APIでgeocodeを指定する場合の注意点

TwitterのREST型Search APIでは、geocodeをパラメータに含めて、ある地点の近くのツイートを取得することができる。いわゆるnearby検索だ。しかし、実際に使ってみると問題が多々ある。


1. geoがnullなツイートがほとんど

検索結果に含まれるツイートは、ほとんど(95%以上)geo要素がnullで、位置情報が含まれていないものばかり。

では、どうやって位置情報がプロットできるツイート数を増やすか。

まずは、プロフィールに入力されている住所をジオコードしたり、「iPhone:35.xxx, 132.xxx」などの文字列を自分でパースして緯度経度を取得したりする方法が考えられる。手間だが、これを行えば、100件中10件ほどは位置情報がプロットできるツイートになる。

次に、検索結果は最大約1500件取得できるので、1ページあたり最大100件で、ページナンバーの値を1から15まで変えながら、つまり15回リクエストを発行すれば、位置情報がプロットできるツイート数を増やせるだろう。しかし、この場合はrate limiting(IPベースのリクエスト制限回数)をオーバーしないか、注意が必要だ。


2. 検索結果が必ずしも指定した条件に合致していない

検索条件にgeocode及び半径 N km と指定しても、指定条件に当てはまりそうにないツイートが検索結果に入ってくる。検索対象が日本のどこかの場合は、現住所に日本と書かれているユーザのツイートも検索結果に含むというのが、Twitter側の仕様のようだ。


3. 検索結果の並び順が指定できない

ツイート日の降順に検索結果は並んでいる。指定したgeocodeに近い順には並んでいないので、そのようなリストを作りたかったら自分でソートする必要がある。


4. 検索結果が安定しない

同じクエリーを投げても、検索するたびに検索結果が変わる。なぜだかは分からない。


結論としては、「TwitterのSearch APIで、指定した緯度経度から半径 N km内のツイートを全て取得する」 ことは、簡単ではないということだ。

rate limitingを上回らないように気をつけながら、独自のパーサーなども絡ませて位置情報をプロットできるツイート数を増やして、使っていくことになる。

rate limitingを気にしたくなければStreaming APIを使う手もあるが、それも決してバラ色の解決策ではないのだ。
明日に向かって昇龍拳: TwitterのStreaming APIでlocationsを指定する場合の注意点