【Python】Twitter API V2 でツイートを取得する

準備

Twitter APIを使用するためにはTwitterアカウントと開発者アカウントの登録が必要です。https://developer.twitter.com/から登録申請を行います。

Twitter APIの利用用途などを英語で書く必要があります。Google翻訳やDeepL翻訳を使って書けば問題なく申請は通ると思います。

ツイート取得

ツイートを取得するためにSearch Tweetsを使いました。このAPIでは直近7日間のツイートを検索することができます。

「toeic」というキーワードを含むリツイートを除いたツイートを取得するPythonプログラムを以下のように作成してみました。検索したツイートはファイルへ出力します。

import requests
import pandas as pd
import emoji
import re

# 発行したBearer tokenを指定する
bearer_token = 'xxx'

# Twitter APIのURL
search_url = "https://api.twitter.com/2/tweets/search/recent"

# 検索クエリ
query_params = {'query': 'toeic -is:retweet', 'tweet.fields': 'author_id', 'max_results': 100}

def create_headers(bearer_token):
    headers = {"Authorization": "Bearer {}".format(bearer_token)}
    return headers

def connect_to_endpoint(url, headers, params):
    has_next = True
    c = 0
    result = []
    while has_next:
        response = requests.request("GET", search_url, headers=headers, params=params)
        if response.status_code != 200:
            raise Exception(response.status_code, response.text)

        response_body = response.json()
        result += response_body['data']

        rate_limit = response.headers['x-rate-limit-remaining']
        print('Rate limit remaining: ' + rate_limit)

        c = c + 1
        has_next = ('next_token' in response_body['meta'].keys() and c < 300)

        # next_tokenがある場合は検索クエリに追加
        if has_next:
            query_params['next_token'] = response_body['meta']['next_token']

    return result

# Pandasのデータフレームを使ってデータを加工
def create_data_frame(json_data):
    df = pd.DataFrame(json_data)

    # ツイート中のURLを削除
    df['text'] = df['text'].apply(lambda x: re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', '', x))
     # ツイート中の絵文字を削除
    df['text'] = df['text'].apply(lambda x: ''.join(c for c in x if c not in emoji.UNICODE_EMOJI))
    return df

# データフレーム中のツイートデータをCSVファイルへ出力、 indexは出力しない
def write_csv(data_frame):
    data_frame['text'].to_csv('toeic.csv', index = False) 

headers = create_headers(bearer_token)
json_response = connect_to_endpoint(search_url, headers, query_params)

data_frame = create_data_frame(json_response)
write_csv(data_frame)

1リクエストでは最大100件まで取得できます。検索結果が100件より多い場合はレスポンス中にnext_tokenというキー名でトークンが返されます。次の100件の結果を取得するためにはリクエストパラメータにnext_tokenを追加する必要があります。

参考情報