【Twitter API v2】next tokenを使って大量データを処理する

プログラミング

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

Twitter APIで1000を超えるデータを取得・処理したいです。
どうすればいいでしょうか。

Twitter APIの1回のリクエストで取得できる上限数は決まっています。

例えばフォロワー数3000のユーザーでフォロワーのIDを取得したいとしましょう。

その際にget_users_followersのメソッドを使いますが、max_resultsで指定できる最大数は「1000」までです。

Twitter Developer Platformより抜粋

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()

このプログラムについて解説します。

  1. 事前準備
    フォロワーidを格納するリストの作成、初回リクエスト判定フラグの作成
  2. 初回リクエストの場合はnext_tokenを設定せずにリクエストを実行
  3. リターンデータのフォロワーidをリストに格納する
  4. リターンデータにnext_tokenが入っていれば、そのnext_tokenをpagination_tokenの引数として使って再度リクエストを実行
  5. 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年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!

 

コメント

タイトルとURLをコピーしました