Tweepyでストリーミング¶
Tweepyは、認証、コネクション、セッションの作成と破棄、メッセージの読み取り、およびフィルタリングしたメッセージを処理することで、TwitterのストリーミングAPIを使用しやすくします。
このページは、初歩的な内容を提供することでTweepyでTwitterストリームを使い始めるのを助けることを目的としています。Tweepyストリーミングのいくつかの機能についてはここでは説明しません。Tweepyソースコードのstreaming.pyを参照してください。
Twitterのストリームにアクセスするには、APIの承認が必要です。認証に関するヘルプが必要な場合は、 認証に関するチュートリアル をご確認下さい。
サマリー¶
TwitterのストリーミングAPIは、Twitterメッセージをリアルタイムでダウンロードするために使用されます。大量のつぶやきを取得する場合や、サイトストリームやユーザーストリームを使用してライブフィードを作成する場合に便利です。詳しくは Twitter Streaming APIのドキュメント を参照してください。
ストリーミングAPIはREST APIとはかなり異なります。REST APIはTwitterからデータを pull するために使われますが、ストリーミングAPIは永続セッションにメッセージを pushes します。これによりストリーミングAPIは、REST APIを使用して実行できるよりも多くのデータをリアルタイムでダウンロードできます。
Tweepyでは、 tweepy.Stream のインスタンスがストリーミングセッションを確立し、StreamListener インスタンスにメッセージをルーティングします。stream listenerの on_data メソッドはすべてのメッセージを受信し、メッセージタイプに従って関数を呼び出します。デフォルトのStreamListenerは、最も一般的なtwitterメッセージを分類し、それらを適切に名前付きのメソッドにルーティングできますが、これらのメソッドはstubsだけです。
ストリーミングAPIの使用には3つのステップがあります。
- StreamListener を継承するクラスを作成する
- そのクラスを使用して、 Stream オブジェクトを作成する
- Stream を使用してTwitter APIに接続します
ステップ1:StreamListenerの作成¶
この単純なstream listenerはstatus textを出力します。Tweepyの StreamListener の on_data メソッドは、statusesから on_status メソッドへデータを便利に渡します。StreamListener を継承し、 on_status をオーバーライドするクラス MyStreamListener を作成します。:
import tweepy
#override tweepy.StreamListener to add logic to on_status
class MyStreamListener(tweepy.StreamListener):
def on_status(self, status):
print(status.text)
ステップ2:ストリームを作成する¶
ストリーミングするにはapiが必要です。apiオブジェクトを取得する方法については、 認証に関するチュートリアル を参照してください。APIとstatus listenerを取得すると、ストリームオブジェクトを作成できます。
myStreamListener = MyStreamListener()
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener)
ステップ3:ストリームを開始する¶
Tweepyからいくつかのtwitterストリームが利用可能です。ほとんどの場合、filter、user_stream、またはsitestreamが使用されます。さまざまなストリームの機能と制限の詳細については、 Twitter Streaming API Documentation を参照してください。
この例では、filter を使用して、 python という単語を含むすべてのツイートをストリーミングします。track パラメータは、ストリームする検索語の配列です。
myStream.filter(track=['python'])
ポインタ¶
非同期ストリーミング¶
ストリームは、接続が閉じられていなければ終了せず、スレッドをブロックします。Tweepyは、 filter で便利な async パラメータを提供しているので、ストリームは新しいスレッド上で実行されます。例えば以下のように:
myStream.filter(track=['python'], async=True)
エラーの処理¶
TwitterのストリーミングAPIを使用する場合、利用制限に注意する必要があります。クライアントが時間枠内でストリーミングAPIの接続回数を上回った場合、420エラーが発生します。クライアントが420エラーを受け入れた後に待機する時間は、試行が失敗するたびに指数関数的に増加します。
Tweepyの Stream Listener は on_error stubにエラーコードを渡します。デフォルトの実装はすべてのコードで False を返しますが、Twitter Streaming API Connecting Documentation で推奨されているバックオフストラテジーを使用して、一部またはすべてのコードに対してTweepyが再接続できるようにオーバーライドできます。
class MyStreamListener(tweepy.StreamListener):
def on_error(self, status_code):
if status_code == 420:
#returning False in on_error disconnects the stream
return False
# returning non-False reconnects the stream, with backoff.
Twitter APIのエラーコードの詳細については、 Twitter Response Codes Documentation を参照してください。