【Python】Twitter APIを利用してツイートを検索(画像、いいね、リツイートの取得も)
Twitterの検索APIを利用することで、Twitterに投稿されるツイートを検索し、ツイート本文、いいね数などに加えて、ツイートに添付される画像やURLなどを取得できます。 Twitterの検索APIを利用するにはAPIや得られるデータの仕様を把握しておく必要があります。 本記事では、検索APIの主な仕様およびツイートに添付されている画像データやURLなどへのアクセス方法を紹介します。
目次
APIの利用設定
事前に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のステータスコードが429
3になるまで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) [ 赤石 雅典 ]
-
https://developer.twitter.com/en/docs/tweets/tweet-updates ↩︎
-
application-only authにすることによってリクエストの上限を増やすことも可能です。 https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/application-only ↩︎
-
https://developer.twitter.com/ja/docs/basics/rate-limiting ↩︎
-
https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/extended-entities-object ↩︎