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

不可視点

search guy at cookpad.com

twitter検索のクロール方法について

twitter検索はpublic_timelineをスクレイピングする方法でポストを収集していました。
これはうまくいっていたのですが3月のはじめにAPIによるアクセスに続いて通常ページもキャッシュされるようになり、ポストの取得がとびとびになってしまいました。影響はかなり出てしまい、回収率は1/10程度に落ち込んでしまいました。

代替策

TwitterはData mining feedという600ほどのポストを一度でもらえるAPIを提供していてポストを多く集めたい人はそれを使うようにというアナウンスをしています。しかしこれもキャッシュが効いているようですからそれほど改善しないのではないかと思い試していません。
また、既に事実上日本語のみを検索対象にするサービスになっているので日本語ユーザーのポストだけもらえればいいかと思い、日本語ユーザー(7万人前後)をRSSで取得する方法を考えましたが、APIホワイトリストに入ることが必須となります。申請は認められたのですがなぜかAPI呼び出し回数の上限が更新されず、問い合わせても返答がありませんでした。そこでsearch.twitter.comを代用して実験してみました。回収率はおおむね良好でしたがsearch.twitter.comは数値は明記されていませんが一定時間に何度もアクセスするとデータを取得させてもらえなくなります。
Twitter向けの検索サービスはリアルタイム性が高いことが一つの特徴ですから、なるべく速く日本語ユーザー全員を巡回することを目指したいので、この方法でsearch.twitter.comに合わせてのんびりデータを取得するのは無理があるかなと思い本番投入はしていません。
巡回先の数を7万人と書きましたが、直近では、public_timelineを用いる方法がうまくいっていた2月中を含む、2009の2月〜3月中旬における日本語ユニークユーザー数は5.3万人だったのでもう少し少なくはなりそうです。search.twitter.comの上限は1IPあたり、1秒に一回だと少し多すぎるようでした。

Gnip

そこで違う方法をさがしていました。今はGnipというサービスを使う方法が有望であると考えています。

TwitterTwitter searchはGnipにpublisherとして参加しています。そこでGnipから提供されるポストの一覧とスクレイピングでほぼリアルタイムに近い水準でもれなく回収できることが期待できます。
実際に試してみたのですがあまり芳しくない状況です。

Gnipにおいてtwitterの情報が1時間程度遅れてくる問題は知られています。ところがよく見てみると遅れてくるだけではなく、遅延がある上限を超えると1時間分のデータを飛ばして再開しているように見えます。この現象は定期的に起こります。
私はGnipの1分前のデータを1分おきに取得しています。

(認証が必要)https://api-v21.gnip.com/gnip/publishers/twitter/notification/200903291058.xml

SELECT id as twitter_status_id,time as tweet_time, gnip as gnip_time, (gnip-time) as gap_in_sec 
FROM test_2009b 
ORDER BY test_2009b.time desc, gnip desc
LIMIT 30;

スクリーンショット(GMT+9:00):

このため、twitter検索でこの方法を使う場合、現状では最低でも20分程度経過しないとポストが検索可能になりません。(最大で70分程度)
さらに1時間分きっちり抜ける瞬間が一日に何度もあります。また、10分程度にわたってポストが追加されないこともあります。

このような問題を考慮しても24時間で28日(土)20時〜29日(日)20時までの14.3万の書き込みを拾えますので現状より断然網羅率が高まります。

その他の方法と組み合わせることで回収率をあげることは可能ですが、いきなり古いポストが結果に現れたりといった現象が想定されます。短い時間の間に同じクエリに対して違う結果を返すことになってしまうでしょう。
多くの利用方法においてこれは大きな問題とはならないと考えますが、定期的に機械的にアクセスするAPIでの利用では問題となる場合もありえると思いますので当面はGnipのみを利用する方法で様子をみてみようと考えています。

APIを利用されている方はどのような解決方法が望ましいかアイデアがありましたらお知らせください。
またはTwitterからデータを引っ張る方法についてご存知の方はお聞かせください。