ある日のツイートを取得したい
特定のキーワードで、「特定の日のつぶやき」を取得する際に躓いたのでメモとして残しておきます。
使用しているTwitterAPIライブラリはTwitter4jです。
ですが、TwitterAPIの仕様のお話になるので言語は問いません。
一般的な取得方法
「特定のキーワード」で「過去」を検索するため、TwitterSearchAPIを使用します。
試してみましょう。「2016/08/26」に「#IoT」で呟かれたツイートを検索しようとすると下記のようなクエリになります。
- query = #IoT
- since = 2016-08-26
- until = 2016-08-27
実行結果
2016-08-26T09:02:02+09:00[Asia/Tokyo]
から
2016-08-27T08:54+09:00[Asia/Tokyo]
の24時間分取得できました。しかし、欲しいのは26日分のみで、27日のツイートは別で取得してほしい。
よく見ると09:00から09:00までの24時間を取得しているため、UTC時間の日付になっていると想定されます。
TwitterAPIのドキュメントにはタイムゾーンの指定ができるオプションはありませんでしたが、色々調べていたところsinceとuntilには年月日だけでなく、時間とタイムゾーンも指定できることがわかりました。
そのフォーマットがこちらです。
YYYY-MM-DD_hh:mm:ss_ZZZ
上記にならい、2016/08/26のツイートを検索してみましょう。
- since = 2016-08-26_00:00:00_JST
- until = 2016-08-26_23:59:59_JST
として指定すると。
実行結果
2016-08-26T00:04:05+09:00[Asia/Tokyo]
から
2016-08-26T23:37:12+09:00[Asia/Tokyo]
までの想定通りのツイートを取得することができました。
APIドキュメントに載っていない隠れ仕様のようです。同じ悩みを持たれている方の参考になれば。
上記で発生する別問題についての対処
一度のAPIアクセスで100件しか取れない
TwitterAPIのcountには最大100件までしか指定できません。
返却されるJSONのnext_resultsに以降の情報が含まれているので、それを利用して何度もクエリを発行しましょう。
件数が多すぎて途中でAPI制限に掛かってしまう
何度もAPIにアクセスしていると15分間のAPI制限が掛かります。
プログラムの中でAPI制限を検知したら15分スリープさせてあげましょう。
途中の時間で検索結果が終わってしまう
件数が多いせいなのか、それともAPIの気まぐれなのか24時間分取得できないことがあります。特にその時間帯にツイートが集中していると検索結果が途中で終わってしまう現象が発生しました。
その場合はuntilに最後のツイートの時間を指定して再度クエリを投げれば続けて取得できます。
上記の問題はプログラム内部で自動化しましょう
API制限で15分待ったり、検索結果がぷちぷち切れて手動で対応するのは大変です。
プログラム内でうまくハンドリングしてあげると放置しているだけでデータ収集ができます
その他
日単位で取得すれば7日前までしか取得できない制限を突破できます
untilには7日より前の日付を指定しても取得することができませんが、sinceとuntilで1日ずつ取得すれば7日より前の過去も取得できます。
キーワードの精度は単語で区切られている必要がある
今回の例では「#IoT」とハッシュタグ検索しましたが「IoT」で検索するとぐっと検索結果が減ります。理由は、単語単位で区切られていないからです。
英語では必ず単語単位(スペース)で区切られます。しかし日本語では「IoTで未来を変える」など、スペースで区切られません。ハッシュタグであれば必ずスペースで区切られるため、検索の精度が高くなります。
よって、日本語でsearchAPIを使用する場合はハッシュタグで検索することを念頭に置いておくと幸せになれます