Twitter API v1.1のリアルタイムのツイート収集が使えなくなったので、API v2に移行した。PythonライブラリのTweepyとTwitter API v2でリアルタイムにツイート収集する方法をまとめておく。
環境
WSL2(Ubuntu20.04)。
$ 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%のツイートを出力する。
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フィールドを指定。
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)のみに限定する。
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 件のコメント:
コメントを投稿