どうもイトサル(@itosaru)です。

Twitter APIで1000を超えるデータを取得・処理したいです。
どうすればいいでしょうか。
Twitter APIの1回のリクエストで取得できる上限数は決まっています。
例えばフォロワー数3000のユーザーでフォロワーのIDを取得したいとしましょう。
その際にget_users_followersのメソッドを使いますが、max_resultsで指定できる最大数は「1000」までです。

1000を超えるそれ以降のデータを取得したい場合はリターンデータに含まれるnext_tokenを使う必要があります。
この記事ではそのnext_tokenの使い方について説明していきます。
next_tokenとは次のページのアドレスのようなもの
そもそもnext_tokenとは何かというと見出しに書いた通り次のページのアドレスのようなものです。
とその前にmax_resultについて誤解がないように説明をしておきます。
max_resultは1回のリクエストで取得できるデータの上限数です。
ノートを例にするとわかりやすいかもしれません。
ノートにはいろいろなサイズがあり、1つのノートの中ではページの行数が決まっていますよね。

このノートの行数をどうするか?の指定がmax_resultです。
max_resultはオプションで指定しない場合は標準で100行で設定されリクエストが実行されます。
1回のリクエストで取得するデータ数がmax_resultで指定したデータ数以下であれば問題ありません。
しかしそれ以上のデータについては次のページにデータを書き込んでいく必要があるわけです。
この次のページのアドレスはどこなの?というのをTwitter API上で判別するものがnext_tokenです。

このnext_tokenは次のページがあればリターンデータの中にmetaデータとして出力されます。
言い換えると最終ページに到達した場合はnext_tokenは出力されません。
next_tokenを使ったサンプルコード
next_tokenを使ったサンプルコードを書きました。
このサンプルはわたくしイトサルのフォロワーさんのIDを取得するサンプルです。
現時点で私のフォロワー数は109なのでmax_resultsは「100」で設定し、next_tokenが1回発行されるようにしています。

import tweepy
print("★Tweepy_next_token")
# Twitter Deverloper Portalで取得したAPIキーをコーテション('')の間にそれぞれ入れる
API_KEY = 'API Key'
API_KEY_SECRET = 'API Key Secret'
# Twitter Deverloper Portalで取得したベアラートークンをコーテション('')の間に入れる
BEARER_TOKEN = 'Bearer Token'
# Twitter Deverloper Portalで生成したアクセストークンをコーテション('')の間にそれぞれ入れる
ACCESS_TOKEN = 'Access Token'
ACCSESS_TOKEN_SECRET = 'Access Token Secret'
#下のコードはいじらない
#https://docs.tweepy.org/en/stable/client.html
client = tweepy.Client(bearer_token = BEARER_TOKEN, consumer_key = API_KEY, consumer_secret = API_KEY_SECRET, access_token = ACCESS_TOKEN, access_token_secret = ACCSESS_TOKEN_SECRET)
#フォロワーのid格納用リスト
followers_list = []
#自分のidを取得して格納する
my_id = client.get_me().data.id
first_flg = True
while True:
#1回目のリクエストと2回目以降のリクエストパラメータが違うためフラグ管理
print("first_flg: " + str(first_flg))
if first_flg == True:
#1回目リクエスト
followers = client.get_users_followers(id=my_id, max_results="100")
#初回フラグを落とす
first_flg = False
else:
#2回目移行リクエスト
followers = client.get_users_followers(id=my_id, max_results="100", pagination_token=next_token)
#フォロワーIDをリストに格納
followers_data = followers.data
for i in range(len(followers_data)):
followers_list.append(followers_data[i].id)
try:
next_token = followers.meta['next_token']
print("next_token: " + next_token)
except KeyError:
#next_tokenが取得できない(最後のリクエスト)の場合はループ終了
print("最後のページに到達しました")
break
print("フォロワー数: " + str(len(followers_list)))
for no, id in enumerate(followers_list):
print("No" + str(no) + ": " + str(id))
input()
このプログラムについて解説します。
- 事前準備
フォロワーidを格納するリストの作成、初回リクエスト判定フラグの作成 - 初回リクエストの場合はnext_tokenを設定せずにリクエストを実行
- リターンデータのフォロワーidをリストに格納する
- リターンデータにnext_tokenが入っていれば、そのnext_tokenをpagination_tokenの引数として使って再度リクエストを実行
- 3と4の処理をnext_tokenがあるまで無限ループする
next_tokenがあるかどうかはリクエスト前ではわからないので、無限ループでnext_tokenがなければbreakするようにしています。
また、next_tokenの格納はnext_tokenがない(最終ページ)になった場合に変とエラーになるため、tryで処理するようにしています。
このプログラムを実行した結果がこちらです。(一応next_tokenとフォロワーさんのidは一部隠しておきました)

画面上のフォロワー数とAPIで取得したフォロワー数が一致しているのでうまく処理できていそうです!
まとめ
今回はnext_tokenを使った大量データの取得処理について説明しました。
改めて今回の内容を振り返ります。
- max_result:1回のリクエストで取得できる上限数(ノートの行数)
- next_token:次のページを取得するためのアドレス
Twitter APIで大量データを取得したい場合はこの2つを使ってくださいね!
Pythonの勉強におすすめな本
Pythonについて勉強したい!という方は
Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ
の本がおすすめです。
前ページがカラー印刷で、かわいらしいどうぶつ2人の会話形式で読みやすいです。
内容はPythonの特徴からはじまり、プログラミングの方法、そして簡単な人工知能を作るまでを解説してくれます。
またこの本の続編である、「Python2年生」も発売されているので合わせてどうぞ!
- Python2年生 データ分析のしくみ 体験してわかる!会話でまなべる!
- Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!
コメント