えんじにゃーず・ハイ

主にエンジニアや技術情報についてつらつら書き連ねるブログです

TwitterAPIで期間指定してツイートを取得する

TwitterAPIを利用したデータ収集

お仕事でTwitterAPIを使用することになった。最初は手軽なRubyで実装しようかと思ったけど、あまり工数を掛けずにさくっと作って欲しいという要望から、言語として使い慣れているJavaで作成することにした。

Qiitaにも投稿したのだけれども、備忘録としてもう少し詳しくブログにも記述しておく。

簡単な要件

  • あるキーワードでTwitterAPIを検索する
  • 特定の期間内で検索する
  • 対象件数は多くなりそう

つまり過去の検索となるため、TwitterStreamAPIでなく、TwitterSearchAPIを使用する。

JavaでTwitterAPIといえば、みんな大好きhttp://twitter4j.org/ja/index.htmlの出番。

1.キーワードで検索

TwitterSearchAPIとTwitterStreamAPIがあるが、今回は過去のツイートが対象なのでTwitterSearchAPIを使用する。

Twitter#search()にqueryを指定すればOK。

2.特定の期間内で検索

sinceとuntilに期間を設定する。ただ、同じ日付を指定すると何も取得できない。sinceを対象日、untilを対象日+1日にするなどの工夫が必要。

3.件数が多くなる場合

TwitterAPIでは1リクエストで100件までしか取得できない。そのためQueryResult#nextQuery()が取得できた場合は引き続きAPIを投げて取得する。

APIリクエストを多く発行すると15分間のAPI制限が掛かる。Twitter#search()実行時にTwitterExceptionがスローされるのでそれをハンドリングして15分スリープさせると良い。

実行してみる

実行してみると、取得できるツイートはsinceに指定した日付の09:00からunitlに指定した日付の09:00までが取得できる。違う、そうじゃない。

00:00〜23:59までを取得したい。+9時間と言えばUTCJSTの時差。タイムゾーンを指定できればいいのだがTwitterAPIのドキュメントを読んでも指定できそうな箇所は無かった。

色々サイトを巡ってみると同じように嵌っている人もいた。ただ、とあるサイトではsinceとuntilに年月日だけでなく日付とタイムゾーンを指定して検索できるという情報が見つかった。 (サイトを失念してしまったのが心残り)

YYYY-MM-DD_hh:mm:ss_ZZZ

このフォーマットで日付指定してみる。

  • since = 2016-08-26_00:00:00_JST
  • until = 2016-08-26_23:59:59_JST

これで想定通り、一日分のツイートを取得することができた。

問題点

動作確認している時に発生した問題点。

明らかに途中で検索結果が終了した

ツイートが集中している時間帯あたりでAPIから取得できなくなってしまう時があった。酷い時には15分程度のツイートしか取得できない時も。

その場合は最後のツイートの日付をuntilに設定しなおして再度APIを投げる仕組みを作ることで自動化した。

実行時間が長い

人気のキーワードを設定するとツイート件数も膨大になり、その分APIリクエストも多くなるためAPI制限に引っかかりやすくなります。

そのため、一日放置しっぱなし状態になる時も。まあこれは仕方ないですね。

queryに指定するワードを慎重に選定する

ハッシュタグはスペースで区切られているから良いが、ただの単語ではツイートが引っかからない。

例えば「#IoT」は引っかかるが「IoT」だと引っかからないという現象が発生する。

原因として、queryに設定するワードは単語で区切られていないとマッチしないのでは。英語であれば基本的に各単語はスペースで区切られるが、日本語の場合は文中にてスペースで区切られることはない。

その点、ハッシュタグハッシュタグとして認識させるために各タグをスペースで区切る。だから検索の精度が高い。

Twitterを使用したデータを収集する場合はこの点も検討しておいた方が良いでしょう。

...まあ、今更TwitterAPIですか?と言われると、まあ、そうなんですが...。

総括

TwitterAPIを使用したのはずいぶん昔にAndroidTwitterクライアントを作った時以来ですが、面白かったです。