Twitterの検索APIを利用することで、Twitterに投稿されるツイートを検索し、ツイート本文、いいね数などに加えて、ツイートに添付される画像やURLなどを取得できます。 Twitterの検索APIを利用するにはAPIや得られるデータの仕様を把握しておく必要があります。 本記事では、検索APIの主な仕様およびツイートに添付されている画像データやURLなどへのアクセス方法を紹介します。

目次

APIの利用設定

事前にAPIの登録申請をします。 その後、自分のアプリ一覧のページから、アプリをクリックしてkeyやtokenを確認します。

Twitter APIの利用に必要なkeyやtokenのページ Twitter APIの利用に必要なkeyやtokenのページ

利用する環境

本記事ではPython 3.7.3を用いています。 また事前にインストールが必要なライブラリは以下のとおりです。

requests==2.21.0
requests-oauthlib==1.2.0

ツイートの検索

モード

Twitter APIでツイートを取得する際は、モードを指定できます。 モードはツイートの字数に関係します。 何も指定しないと、Twitter APIで取得できるツイートは最大で先頭から140字までとなります。

extendedモード

モードをextendedにすると、140字以上のツイートも、先頭から140字ではなく、そのままの内容を取得できます。 extendedモードでツイートを取得するにはURLにtweet_mode=extendedを追記します1。 extendedモードでツイートを取得した場合はツイート本文はtextではなくfull_textになることに注意が必要です。

extendedモードでツイートを検索するにはたとえば以下のように指定します。

from requests_oauthlib import OAuth1Session

url = 'https://api.twitter.com/1.1/search/tweets.json'

params = {
    'q': '<クエリ>',
    'tweet_mode': 'extended',
}

client = OAuth1Session(
    api_key,
    api_secret_key,
    access_token,
    access_token_secret)

res = client.get(url, params=params)

<クエリ>には実際に検索したい単語としてください。検索したい単語が複数ある場合は、 <単語1> OR <単語2> OR <単語3>…のようにORで結合します。

他の検索パラメータはStandard search API — Twitter Developersを参照してください。

APIの利用制限

検索APIでは15分で180回までのリクエストが可能です 2。 その他のAPIの制限はこちらを参照してください。 利用制限までツイートの検索を繰り返すには、以下のようにgetメソッドで取得したHTTPのステータスコードが4293になるまでwhile文で処理するようにします。

while True:
    res = client.get(url, params=params)

    if res.status_code == 200:
        data = json.loads(res.text)

        # dataを取得したあとの処理

    elif res.status_code == 429:
        break

以降では # dataを取得したあとの処理 で具体的にツイートの情報を取得するサンプルコードを紹介します。

ツイート本文の取得

tweets = data['statuses']
for tweet in tweets:
    print(tweet['full_text'])

いいね数、リツイート数の取得

tweets = data['statuses']
for tweet in tweets:
    print(tweet['favorite_count'])  # いいね数
    print(tweet['retweet_count'])  # リツイート数

ハッシュタグの取得

tweets = data['statuses']
for tweet in tweets:
    for hashtag in tweet['entities']['hashtags']:
        print(hashtag)

URLの取得

tweets = data['statuses']
for tweet in tweets:
    for url in tweet['entities']['urls']:
        url = url['expanded_url']

画像の取得・保存

Twitterでは最大で4枚の画像を添付してツイートを投稿できます。 entitiesが最初の1枚のみを対象とするのに対して、extended_entitiesはすべての画像を対象とします 4 (extended_entitiesは上述のextendedモードとは関係なく、取得したツイートに付与されます)。

import requests

tweets = data['statuses']
for tweet in tweets:
    if 'extended_entities' in tweet:
        for d in tweet['extended_entities']['media']:
            media_type = d['type']
            url = d['media_url']

            if media_type == 'photo':
                out_file = os.path.basename(url)
                with open(out_file, 'wb') as f:
                    response = requests.get(url)
                    f.write(response.content)

おわり

本記事ではTwitter APIを利用してツイートを取得し、必要な情報を取得する方法をPythonのサンプルコード付きで紹介しました。

最後に、定期的に収集したツイートをGoogleスプレッドシートに自動で蓄積する方法についても紹介していますので、よろしければこちらの記事も合わせてご覧ください。

【無料でデータ収集】Herokuで収集したツイートをスプレッドシートに蓄積する


現場で使える!Python自然言語処理入門 (AI & TECHNOLOGY) [ 赤石 雅典 ]


  1. https://developer.twitter.com/en/docs/tweets/tweet-updates ↩︎

  2. application-only authにすることによってリクエストの上限を増やすことも可能です。 https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/application-only ↩︎

  3. https://developer.twitter.com/ja/docs/basics/rate-limiting ↩︎

  4. https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/extended-entities-object ↩︎


関連記事






最近の記事