Twitter API v1.1のリアルタイムのツイート収集が使えなくなったので、API v2に移行した。PythonライブラリのTweepyとTwitter API v2でリアルタイムにツイート収集する方法をまとめておく。
環境
WSL2(Ubuntu20.04)。
1 2 3 4 5 6 7 8 9 | $ lsb_release -dr Description: Ubuntu 20.04.5 LTS Release: 20.04 $ python3 -V Python 3.8.10 $ pip3 show tweepy Name: tweepy Version: 4.12.1 ... |
Twitter API のBearer Tokenの取得
Twitter API v2でリアルタイムにツイートを収集するために、Twitterの開発者サイトでBearer Tokenを取得しておく。開発者サイトのProjects & Apps > Overviewの画面で、対象アプリの[Keys and tokens](鍵のアイコン)を開く。この画面でBearer Tokenを生成できる。
Tweepyでリアルタイムツイート取得
TweepyでTwitter API v2を使ってリアルタイムにツイートを収集するには、StreamingClientクラスを使う。v1.1のとき(Tweepy4でリアルタイムツイートを取得する)と同様に、このクラスを継承したクラスを作成する。以下のコードでは、Twitter API v2のsampleメソッドを使って、リアルタイムに1%のツイートを出力する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import tweepy # Twitter APIの認証情報 # Twitterの開発者向けページで取得したBearer Tokenを使う BEARER_TOKEN = 'Bearer Token' class TwStream(tweepy.StreamingClient): def on_tweet( self , tweet): print ( '-------------------------' ) print (tweet.data) def main(): twstream = TwStream(BEARER_TOKEN) twstream.sample() if __name__ = = '__main__' : main() |
ただ、このコードで取得できるのはツイートのIDやテキストのみで、取得できるデータはv1.1のときと違ってかなり限定されている。v2では、取得する情報を指定する必要がある。
APIで取得対象のデータを指定する
Twitter API v2では、ExpansionsとFieldsを指定することで、さまざまなデータを取得できる。以下のコードでは、ExpansionsとTweetフィールド、Userフィールドを指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import tweepy # Twitter APIの認証情報 # Twitterの開発者向けページで取得したBearer Tokenを使う BEARER_TOKEN = 'Bearer Token' class TwStream(tweepy.StreamingClient): def on_tweet( self , tweet): print ( '-------------------------' ) print (tweet.data) def main(): twstream = TwStream(BEARER_TOKEN) # 取得するExpansions expansions = [ 'author_id' , 'referenced_tweets.id' , 'attachments.media_keys' ] # 取得するTweetフィールド tweet_fields = [ 'author_id' , 'created_at' , 'attachments' , 'lang' , 'public_metrics' ] # 取得するUserフィールド user_fields = [ 'created_at' , 'description' , 'location' , 'verified' ] twstream.sample(expansions = expansions, tweet_fields = tweet_fields, user_fields = user_fields) if __name__ = = '__main__' : main() |
上記のように取得データを指定できるが、v1.1のように言語の指定ができない。このままだと、英語やさまざまな言語のツイートが混ざって取得される。filterメソッドを使うと言語の指定ができるが、filterメソッドでは取得できるツイート数に制限があるので、大量のツイートを収集したい場合には使えない。日本語で絞りたい場合は次のようなコードになる。取得したTweetオブジェクトのlangフィールドを参照して、日本語(ja)のみに限定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import tweepy # Twitter APIの認証情報 # Twitterの開発者向けページで取得したBearer Tokenを使う BEARER_TOKEN = 'Bearer Token' class TwStream(tweepy.StreamingClient): def on_tweet( self , tweet): if tweet.lang = = 'ja' : print ( '-------------------------' ) print (tweet.data) def main(): twstream = TwStream(BEARER_TOKEN) # 取得するExpansions expansions = [ 'author_id' , 'referenced_tweets.id' , 'attachments.media_keys' ] # 取得するTweetフィールド tweet_fields = [ 'author_id' , 'created_at' , 'attachments' , 'lang' , 'public_metrics' ] # 取得するUserフィールド user_fields = [ 'created_at' , 'description' , 'location' , 'verified' ] twstream.sample(expansions = expansions, tweet_fields = tweet_fields, user_fields = user_fields) if __name__ = = '__main__' : main() |
0 件のコメント:
コメントを投稿