今回はTwitterで過去全期間のツイートを対象にした検索が可能な「Search Tweets: Full-Archive API」をPythonを使って叩く方法についてまとめておきます。
基本的に過去全期間のツイートが検索できる「Search Tweets: Full-Archive API」はPremium区分のAPIなので課金(149$/月)しないと使うことができませんが、v1.1のAPIであれば少しだけ使用することができます。
ツイッターAPIの種類やツイート検索APIの種類・使い分けについては過去記事参照↓
Twitterで過去ツイートを収集するためのAPIの種類と使い分けについて
Contents
SandboxでFull-Archive APIをPythonで使ってみる
SandboxのFull-Archive APIを有効化する
https://developer.twitter.com/en/account/environments にアクセスします。v1.1であれば以下のような画面が表示されています。
これで適当なdev名を入れて有効化します、(このdev名は後で必要になります)
ちなみにsandbox時の「Full-Archive API」「30days-search API」それぞれのアクセスリソースについては以下で確認できます。
Search Tweets:Full-Archive APIの仕様
公式ドキュメント↓
まずはリクエストのヘッダーに乗せるパラメーターについては以下参照:
基本的にはパラメーターに乗せるのはこの4つだと思います。
パラメーター | 概要 |
---|---|
query | 検索クエリ |
maxResults | 検索上限数(sandboxはmax100、premiumは500) |
next | ネクストページトークン |
fromDate | 開始期間(例:201901311500) |
toDate | 終了期間(例:201901311500) |
そして、queryに載せるTwitterの検索クエリのオペレーターについては下記参照
https://developer.twitter.com/en/docs/twitter-api/premium/search-api/guides/operators
詳しくはドキュメントに書いてありますが、オペレータを用いることで特定のアカウントのツイートのみやリツイートの除外、特定の国や地域に絞ったツイートなど、検索条件を付けたツイート検索が可能になります。
メモ:自分が過去に使ったオペレーターによる検索クエリ
例) 特定のアカウント(@hogehoge) の過去の全てのツイートを検索したい場合
keyword = 'hogehoge from:hogehoge' # リツイート・リプライ全てを含む keyword = 'twitter.com/hogehoge/status/ from:hogehoge -rt' # ツイートのみを取得 keyword = 'hogehoge -rt' # ツイートのみを取得
検索結果がmaxで指定した検索上限数以上の場合はAPIのレスポンスにnextpagetokenが発行されているので、それをパラメーターに組み込むことで続きの結果を取得することが可能です。
PythonでFull-Archive APIを叩くサンプルコード
サンプルコードは↓のようになります。
import json from requests_oauthlib import OAuth1Session import pandas as pd import traceback import time # v1.1のAPI鍵(v2のものはNG) CK ='xxx' CS ='xxx' AT ='xxx' ATS ='xxx' twitter = OAuth1Session(CK, CS, AT, ATS) url = 'https://api.twitter.com/1.1/tweets/search/fullarchive/<devname>.json' # Enedpointへ渡すパラメーター keyword = 'コロナ ワクチン' num = 0 params ={ 'query' : keyword , # 検索キーワード 'maxResults': 100 , # 取得するtweet数 'fromDate' : 201901311500, 'toDate' : 202208121200 } test_data = [] req = twitter.get(url, params = params) if req.status_code == 200: res = json.loads(req.text) test = res['results'][0] print(test['created_at']) for tweet in res['results']: account = tweet['user']['screen_name'] tweet_id = tweet['id'] try: text_ = tweet['full_text'] except: text_ = tweet['text'] # print('@'+account, tweet['created_at'], f'https://twitter.com/{account}/status/{tweet_id}', text_) test_data.append(['@'+account, tweet['created_at'], f'https://twitter.com/{account}/status/{tweet_id}', text_]) else: print("Failed: %d" % req.status_code) print(req.text) # データフレームに変換 test_data2 = pd.DataFrame(test_data, columns=["account", "date",'source', "tweet"]) # CSVに出力 test_data2.to_csv('sample_tweet.csv', encoding='shift-jis',errors='ignore')
2ぺージ目以降のデータが欲しい場合は以下のようにネクストページトークンを載せます。
params ={ 'query' : keyword , # 検索キーワード 'maxResults': 100 , # 取得するtweet数 'next':res['next'], 'fromDate' : 201901311500, 'toDate' : 202208121200 }
※ ここの変数res[‘next’]はサンプルコードの変数resを想定しています。
コメント
[…] 参照:【Python】TwitterのAPIを使って過去全期間のツイートをスクレイピング […]