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つのステップがあります。

  1. StreamListener を継承するクラスを作成する

  2. そのクラスを使用して、 Stream オブジェクトを作成する

  3. Stream を使用してTwitter APIに接続します

ステップ1:StreamListenerの作成

この単純なstream listenerはstatus textを出力します。Tweepyの StreamListeneron_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 を参照してください。