Python twitter

【Python】TwitterのAPIを使って過去全期間のツイートをスクレイピング

この記事は約7分で読めます。

 

今回はTwitterで過去全期間のツイートを対象にした検索が可能な「Search Tweets: Full-Archive API」をPythonを使って叩く方法についてまとめておきます。

 

基本的に過去全期間のツイートが検索できる「Search Tweets: Full-Archive API」はPremium区分のAPIなので課金(149$/月)しないと使うことができませんが、v1.1のAPIであれば少しだけ使用することができます。

 

ツイッターAPIの種類やツイート検索APIの種類・使い分けについては過去記事参照↓

Twitterで過去ツイートを収集するためのAPIの種類と使い分けについて

 

スポンサーリンク
スポンサーリンク

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」それぞれのアクセスリソースについては以下で確認できます。

 

301 Moved Permanently

 

Search Tweets:Full-Archive APIの仕様

 

公式ドキュメント↓

Use Cases, Tutorials, & Documentation
Publish & analyze posts, optimize ads, & create unique customer experiences with the X API, X Ads API, & X Embeds.

 

まずはリクエストのヘッダーに乗せるパラメーターについては以下参照:

Use Cases, Tutorials, & Documentation
Publish & analyze posts, optimize ads, & create unique customer experiences with the X API, X Ads API, & X Embeds.

 

基本的にはパラメーターに乗せるのはこの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を想定しています。

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

  1. […] 参照:【Python】TwitterのAPIを使って過去全期間のツイートをスクレイピング […]

タイトルとURLをコピーしました