5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TwitterAPIの上限までTweetを取得する|つぶやきをWordcloudで可視化①

Last updated at Posted at 2021-07-13

私事ではありますが、2020年5月にコーギーという中型犬をお迎えしました。
愛犬のブログを運営してますので、見てもらえると嬉しいです。

corgi_komugi

「コーギー関連のツイートをwordcloudで可視化したい!」と思い立ち、以下の4項目を実施しました。

  1. TwitterAPIでツイートを取得 ← 今回
  2. 正規表現を用いてツイートを整形
  3. SudachiPyで形態素単位に分割
  4. WordCloudで可視化

一連のコードと様々なアウトプットの表示

今回は、「TwitterAPIでツイートを取得」に関して説明していきます。

2021年12月30日

コードを一部修正しました。

対象者

  • TwitterAPIのsearch apiでツイートを取得するために、コードを書きたい人
  • TwitterAPIで取得したツイートを、pandasのデータフレームに変換したい人
  • TwitterAPIのsearch apiのリクエストの上限に困っている人

なお、consumer_key,consumer_secret,access_token,access_secret の4つは、すでに取得できている前提で話を進めます。

ざっくりとした要件定義

Input ... 「Twitter検索のためのクエリ」と「APIキー各種」
Output ... 以下の6つを列に含む、17,500ツイートのDataFrame

Outputに含まれる要素は、「ツイート番号」「ユーザーネーム」「ツイート時刻」「ツイートのテキスト」「いいねの数」「リツイートの数」になります。

2021-07-12_22h36_16.png

コード

コード全体

import tweepy
import pandas as pd
import datetime

# Setting 280 characters in a column
pd.set_option("display.max_colwidth", 280)


def get_api_value(consumer_key,consumer_secret,access_token,access_secret):
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    api = tweepy.API(auth)
    return api


def collect_tweet_data(q, api):
    '''
    ツイッターAPIを使用してデータを収集し、リストを作成する関数
    15分で180リクエストという制限があり、理論上は18,000ツイートが取得可能だが、
    たまに180リクエストで18,000ツイート取得できずエラーが発生するため、
    17500ツイートを取得するよう指定
    '''
    
    tweet_data = []

    for tweet in tweepy.Cursor(api.search_tweets, q=q, result_type='recent', count=100).items(17500):
        tweet_data.append([tweet.id_str,
                           tweet.user.screen_name,
                           tweet.created_at+datetime.timedelta(hours=9),
                           tweet.text.replace('\n',''),
                           tweet.favorite_count,tweet.retweet_count])
                
    return tweet_data

def create_tweets_df(q,api):
    tweet_data = collect_tweet_data(q=q,api=api)
    # 取得する列名を定義する
    columns_name=["TW_NO","USER_NAME","TW_TIME","TW_TEXT","FAV","RT"]
    df=pd.DataFrame(tweet_data,columns=columns_name)
    return df

# 自身で取得した値を代入してください。
consumer_key = 'xxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxx'

api=get_api_value(consumer_key,consumer_secret,access_token,access_secret)

q = f"#コーギー OR コーギー exclude:retweets -filter:replies"
df = create_tweets_df(q, api)

コードの解説

まず、事前に取得したキーから、apiにアクセスできるようにします。

def get_api_value(consumer_key,consumer_secret,access_token,access_secret):
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    api = tweepy.API(auth)
    return api

次に、リストでツイートのデータを取得します。

api.searchは15分間で180リクエストを送信することが可能です。
count=100とすることで1リクエストあたり100ツイートを取得できるため、最大で18,000ツイートを1度に取得できます。
しかし、18,000ツイート取得しようとすると180リクエストでは取得できずにエラーを吐いてしまうこともあるので、17,500ツイートの取得にしました。

また、api.searchではjsonフォイルを取得できるため、jsonファイルから必要な情報を抜き出し、リストに加えていきます。

def collect_tweet_data(q, api):
    '''
    ツイッターAPIを使用してデータを収集し、リストを作成する関数
    15分で180リクエストという制限があり、理論上は18,000ツイートが取得可能だが、
    たまに180リクエストで18,000ツイート取得できずエラーが発生するため、
    17500ツイートを取得するよう指定
    '''
    
    tweet_data = []

    for tweet in tweepy.Cursor(api.search_tweets, q=q, result_type='recent', count=100).items(17500):
        tweet_data.append([tweet.id_str,
                           tweet.user.screen_name,
                           tweet.created_at+datetime.timedelta(hours=9),
                           tweet.text.replace('\n',''),
                           tweet.favorite_count,tweet.retweet_count])
                
    return tweet_data

残りのリクエスト数が気になる場合は、こちらのコードで確認できます。

#input
print("API.search")
print(api.rate_limit_status()["resources"]["search"]["/search/tweets"])
#output
API.search
{'limit': 180, 'remaining': 170, 'reset': 1626095196}

これは、上限が180リクエストで、残りが170という意味になります。


最後に、リストのデータをDataFrameに格納します。

def create_tweets_df(q,api):
    tweet_data = collect_tweet_data(q=q,api=api)
    # 取得する列名を定義する
    columns_name=["TW_NO","USER_NAME","TW_TIME","TW_TEXT","FAV","RT"]
    df=pd.DataFrame(tweet_data,columns=columns_name)
    return df

これら3つの関数を用いて各種apiキーとクエリを以下のように入力すると、ツイートの情報が含まれたDataFrameを取得できます。
# 自身で取得した値を代入してください。
consumer_key = 'xxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxx'

api=get_api_value(consumer_key,consumer_secret,access_token,access_secret)

q = f"#コーギー exclude:retweets -filter:replies"
df = create_tweets_df(q, api)

outputは以下の通りです。

2021-07-12_22h36_16.png

##まとめ
この記事では、TwitterAPIでツイートを取得するコードを見ていきました。

次は、正規表現を用いてツイートの形を整えたいと思います。
こちらの記事で説明してますので、興味があれば見てもらえると嬉しいです。

corgi_komugi

##参考文献
twitterのデータ探索に関わるtweepyの基本機能の解説
【2021年7月執筆】Twitterでのsearch APIの制約について

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?