政治関連のTwitterデータを研究用に収集する方法
政治関連のTwitterデータを集めるには、公職者アカウントのウォッチリストと、選挙や争点ごとに記録した検索条件を用意し、APIで定期的に取得します。公式X APIの料金は1,000件あたり$5.00です。
要点: Xの無料の学術向けアクセスは2023年に終了しました。現在の研究用収集は読み取りごとの従量課金で、公式X APIは1投稿あたり$0.005、月間300万投稿が上限です。政治家のタイムラインや選挙をめぐる議論の収集には、Twitter(X)API兼スクレイピングツールであるSorsa APIが使えます。ツイートは1,000件あたり$0.07からで、まずは100回分の無料リクエストで試せます。
- エンドポイント
POST /search-tweets- 1ページの件数
- 1リクエストあたり約20ツイート
- 料金
- 1,000件あたり$0.07から
#収集できる政治関連のTwitterデータ
現在、Xの政治関連データとして収集できるのは3種類です。公職者の投稿、選挙や争点についての一般の発言、そして公職者の投稿に対する反応です。いずれも公開されていて、時刻と投稿者が記録されています。そのため、Xは政治コミュニケーション研究の標準的なデータ源であり続けています。
- 公職者本人の投稿。 議員、大臣、政党、官公庁、候補者のアカウントです。件数が少なく整ったデータで、一国の議会なら数百アカウント、月に数万件の投稿規模です。
- 選挙や争点をめぐる議論。 候補者名、法案、ハッシュタグ、討論会に触れた一般の投稿すべてです。地方選なら数千件、国政選挙なら数百万件に達します。
- 反応。 公職者の発言に付いたリプライや引用投稿で、メッセージがどう受け止められたかが分かります。
どのAPIでも手が届かないデータもあります。投稿者が削除した投稿、非公開アカウント、ダイレクトメッセージ、いいねしたユーザーの一覧です。過去の研究用データセットでも、この欠落は埋められません。多くはツイートIDの一覧として公開されていました。プラットフォームの規約でIDの共有は認められても本文の共有は認められなかったためで、削除されたツイートのIDは今では何も返しません。研究者は2023年に無料の入手経路を失いました。その後に何が代わったかは、Twitterのアーカイブを検索できたのは誰かの経緯で解説しています。
そのため2026年の政治研究では、自分でデータを集めることになります。進行中の選挙戦なら今日から先に向けて、過去の選挙ならアーカイブをさかのぼって収集します。アーカイブは2006年3月まで届きます。
#Sorsa APIで政治関連ツイートを収集する
政治関連ツイートの収集には、Sorsa APIが使えます。APIキー1つで、公職者のタイムラインと選挙をめぐる議論を1,000ツイートあたり$0.07から読み取れます。全プラン毎秒20リクエストで、Xの開発者アカウントもOAuthも不要です。同じ読み取りに対して、公式X APIは1,000投稿あたり$5.00かかり、月間300万投稿で頭打ちになります。
政治データの種類ごとに、対応するエンドポイントがあります。どのエンドポイントも、各ツイートの中に投稿者のプロフィール全体を追加料金なしで含めて返します。
| 政治データ | Sorsa APIのエンドポイント | 1リクエストあたり | 1,000件あたり(最安) |
|---|---|---|---|
| 公職者のウォッチリストを1つのフィードで | GET /list-tweets(新しいタブで開きます) | 約20ツイート | $0.07 |
| 公職者1人の全タイムライン | POST /user-tweets(新しいタブで開きます) | 約20ツイート | $0.07 |
| クエリと日付で絞る、選挙や争点の議論 | POST /search-tweets(新しいタブで開きます) | 約20ツイート | $0.07 |
| 公職者の投稿に付いたリプライ | POST /comments(新しいタブで開きます) | 約20件のリプライ | $0.07 |
| リスト内の全アカウントのプロフィール | GET /info-batch(新しいタブで開きます) | 最大100プロフィール | $0.014 |
| 保存済みの投稿をIDで再確認 | POST /tweet-info-bulk(新しいタブで開きます) | 最大100ツイート | $0.014 |
公職者のウォッチリストを1つのフィードで
- Sorsa APIのエンドポイント
GET /list-tweets(新しいタブで開きます)- 1リクエストあたり
- 約20ツイート
- 1,000件あたり(最安)
- $0.07
公職者1人の全タイムライン
- Sorsa APIのエンドポイント
POST /user-tweets(新しいタブで開きます)- 1リクエストあたり
- 約20ツイート
- 1,000件あたり(最安)
- $0.07
クエリと日付で絞る、選挙や争点の議論
- Sorsa APIのエンドポイント
POST /search-tweets(新しいタブで開きます)- 1リクエストあたり
- 約20ツイート
- 1,000件あたり(最安)
- $0.07
公職者の投稿に付いたリプライ
- Sorsa APIのエンドポイント
POST /comments(新しいタブで開きます)- 1リクエストあたり
- 約20件のリプライ
- 1,000件あたり(最安)
- $0.07
リスト内の全アカウントのプロフィール
- Sorsa APIのエンドポイント
GET /info-batch(新しいタブで開きます)- 1リクエストあたり
- 最大100プロフィール
- 1,000件あたり(最安)
- $0.014
保存済みの投稿をIDで再確認
- Sorsa APIのエンドポイント
POST /tweet-info-bulk(新しいタブで開きます)- 1リクエストあたり
- 最大100ツイート
- 1,000件あたり(最安)
- $0.014
Sorsa APIはRESTのAPIです。キーを付けてリクエストを1回送るだけで整ったJSONが返り、ブラウザで動かすものも、Xアカウントも要りません。2022年から本番環境で稼働し、累計60億リクエスト以上を処理しています。Xに変更があってもSorsa側で修正するため、開票日の夜にまたがる収集でも途中で止まりません。Xのログイン情報を求めることはなく、ご自身のアカウントにリスクはありません。
#政治家アカウントのウォッチリストを作る
ウォッチリストとは、研究で追跡するアカウントの一覧で、数値のユーザーIDで保管します。作り始めるときは、青いチェックマークで探すのではなく、すでに誰かが確認した公開情報から出発してください。2023年以降、チェックマークは有料サブスクリプションの印であり、公式アカウントである証明ではありません。
米国連邦議会であれば、オープンデータのプロジェクトunitedstates/congress-legislators(新しいタブで開きます)に、議員の公式SNSアカウントを記したファイルがあります。2026年11月2日時点で、Xのハンドルが505件載っており、うち408件に数値IDが付いています。最終更新は2026年10月24日です。このプロジェクトが受け付けるのは、公費で運営される公式アカウントだけで、選挙運動用や個人のアカウントは含まれません。公式な発信を扱う研究に必要なのは、まさにこの区別です。他の国でも、多くの議会が議員のアカウントを自前のオープンデータサイトで公開しているので、そこから始めてください。
ハンドルは変わりますが、数値IDは変わりません。GET /info-batch で、1リクエストあたり100アカウントずつ、すべてのハンドルを一度だけIDに変換し、そのIDをウォッチリストのキーとして保管します。下のスクリプトは連邦議会のファイルを読み込み、議員1人につきプロフィールを1行ずつ保存します。
import csv
import requests
import yaml # pip install pyyaml requests
URL = "https://api.sorsa.io/v3/info-batch"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
SRC = ("https://raw.githubusercontent.com/unitedstates/"
"congress-legislators/main/legislators-social-media.yaml")
members = yaml.safe_load(requests.get(SRC, timeout=30).text)
handles = [m["social"]["twitter"] for m in members
if m["social"].get("twitter")]
rows = []
for i in range(0, len(handles), 100): # 100 handles per request
r = requests.get(URL, headers=HEADERS, timeout=30,
params={"usernames": handles[i:i + 100]})
r.raise_for_status()
rows += r.json().get("users", [])
with open("watchlist.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["id", "username", "display_name", "followers"])
for u in rows:
w.writerow([u["id"], u["username"], u["display_name"],
u["followers_count"]])
print(len(rows), "accounts saved")
505件のハンドルは6リクエストで処理できます。結果に含まれなかったアカウントは、リストの更新後に名前が変わったか、凍結されたか、非公開になったものです。一度手作業で確認し、ファイルを修正してください。
#ウォッチリストの全投稿を収集する
ウォッチリストが発信する全投稿を集めるには、アカウントを公開Xリストにまとめ、GET /list-tweets で読み取ります。1つのフィードに全メンバーの投稿が新しい順に並び、1リクエストあたり約20件です。Xリストには最大5,000アカウントを登録できるので、どの国の議会でも収まります。Xリストの読み取り方は、リストのガイドAPIでXリストを読み取る方法で紹介しています。
フィードは定期的に確認し、すでに保存した投稿に行き当たったところでページの取得を止めます。そうすれば、505アカウントの連邦議会リストを1時間ごとに確認しても、その時間帯が静かでも忙しくても、リクエストは数回で済みます。
import json
import time
from datetime import datetime, timezone
import requests
URL = "https://api.sorsa.io/v3/list-tweets"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
LIST_ID = "1720000000000000001" # your public X List of officials
def check(last_id):
"""Fetch posts newer than last_id, newest first."""
params, new = {"list_id": LIST_ID}, []
while True:
r = requests.get(URL, headers=HEADERS, params=params, timeout=30)
if r.status_code == 429: # over 20 requests a second
time.sleep(1)
continue
r.raise_for_status()
page = r.json()
for t in page.get("tweets", []):
if int(t["id"]) <= last_id:
return new # reached the last saved post
new.append(t)
if not page.get("next_cursor"):
return new
params["next_cursor"] = page["next_cursor"]
last_id = 0 # store this between runs
while True:
seen = datetime.now(timezone.utc).isoformat()
posts = check(last_id)
with open("posts.jsonl", "a", encoding="utf-8") as f:
for t in posts:
f.write(json.dumps({"first_seen": seen, **t}) + "\n")
if posts:
last_id = max(int(t["id"]) for t in posts)
print(seen, len(posts), "new posts")
time.sleep(3600) # one check an hour
403が返るのは、キーがない、キーが誤っている、またはリクエストを使い切った場合です。429は1秒間に20リクエストを超えたことを示すため、スクリプトは1秒待ってからもう一度リクエストします。ツイートIDは時間とともに大きくなるので、IDを比較すれば保存済みの最後の投稿を見つけられます。
ウォッチリストのアカウント数
各アカウントの1日の投稿数
フィードを確認する頻度
月に約61Kポスト 505アカウントから、1時間ごとに確認
$303
公式X API
1ポストあたり$0.005
月額、ポストのみ
最安 $5.04
Sorsa API
リストのフィード1本、1リクエストあたり約20ポスト
月額、投稿者情報込み
1秒未満 Sorsa APIでの1回の確認あたり(毎秒20リクエスト)、毎回約84件の新しいポストを取得します。
ウォッチリストの規模、アカウントの投稿頻度、確認する頻度を設定すると、両方のAPIで1か月に収集した場合の結果が表示されます。
公職者1人の全履歴を一度に取得するには、そのアカウントのユーザーIDを指定して POST /user-tweets を呼び、最新の投稿から最古の投稿までページを順にさかのぼります。CSVへのエクスポートは、ユーザーの全ツイートをダウンロードする方法のガイドで解説しています。
#検索で選挙・争点をめぐる議論を収集する
選挙や争点をめぐる議論は、検索クエリで収集します。候補者名や政党名、選挙戦のハッシュタグ、争点のキーフレーズ、言語、期間を指定して POST /search-tweets に送り、next_cursor でページをたどります。クエリは研究デザインそのものです。収集の前に書き上げ、結果と一緒に公開してください。
クエリはバランスを取ります。一方の陣営のハッシュタグだけで検索すれば、測れるのはその陣営だけです。選挙戦に出ているすべての候補者と政党を、同じ書き方、同じ演算子で指定してください。長い期間は since: と until: で1日または1週間の窓に区切ると、失敗した窓だけを単独で再実行できます。構文の全体は、Twitterの検索演算子の一覧にあります。
curl -X POST "https://api.sorsa.io/v3/search-tweets" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "(#Measure7 OR \"Measure 7\") since:2026-10-20 until:2026-10-21",
"order": "latest"
}'
{
"tweets": [
{
"id": "1981234567890123456",
"full_text": "Measure 7 forum tonight: each side got 5 questions.",
"created_at": "2026-10-20T23:41:07Z",
"lang": "en",
"likes_count": 57,
"retweet_count": 14,
"reply_count": 9,
"quote_count": 3,
"is_reply": false,
"is_quote_status": false,
"user": {
"id": "1590000000000000042",
"username": "county_civics_desk_demo",
"display_name": "County Civics Desk",
"followers_count": 8213
}
}
],
"next_cursor": "DAADDAABCgABG4lN0iWAJ8kKAAIbiUY1qZvwRg"
}
次のページは、同じボディに next_cursor を加えて送ります。カーソルが含まれないレスポンスが返ったら止めてください。1ページは約20ツイートで件数にばらつきがあるため、数えるのはページではなく投稿です。
収集の前にリツイートの扱いを決める
政治的な内容は、元の投稿よりリツイートのほうがはるかに多く含みます。そのため、リツイートを外すとデータセットの内容が変わります。Pew Research Centerが米国の成人による1年分のツイートを調べたところ、政治的な内容だったのはリツイートの44%、引用投稿の42%で、リプライは26%、元のツイートは8%でした。
人々が自分の言葉で何を語るかを調べる研究なら、クエリに -filter:retweets を加えます。何が拡散するかを調べる研究なら、リツイートを残し、各リツイートの retweeted_status から元の投稿を読み取ります。どちらの選び方でも構いませんが、成り行きに任せるのは避けてください。
#削除された投稿の記録を残す
投稿者が削除した投稿は、どのAPIも返しません。Sorsa APIも公式X APIも同じです。そのため、政治家の削除済み投稿の記録は、自分が最初に保存したものしかありません。ウォッチリストの投稿を初めて見た時点ですべて保存していれば、その記録はすでに手元にあります。次に必要なのは、削除に気づく仕組みです。
保存したIDは、POST /tweet-info-bulk で1リクエストあたり100件ずつ再確認します。返ってこなくなった投稿は、削除されたか、アカウントが凍結または非公開になったということです。そのIDを、気づいた時刻とともに記録してください。保存した10万件の投稿を毎日再確認する場合、リクエストは1,000回で、$1.40からです。
import requests
URL = "https://api.sorsa.io/v3/tweet-info-bulk"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
def missing(ids):
"""Return the saved IDs that no longer come back."""
gone = []
for i in range(0, len(ids), 100): # 100 IDs per request
batch = ids[i:i + 100]
r = requests.post(URL, headers=HEADERS, timeout=30,
json={"tweet_links": batch})
r.raise_for_status()
back = {t["id"] for t in r.json().get("tweets", [])}
gone += [x for x in batch if x not in back]
return gone
削除された投稿は、政治関連の収集で最も慎重に扱うべき部分です。報告するときは件数とパターンにとどめてください。引用するのは、投稿者が公職者で、投稿が公務に関わるものだった場合に限ります。報道機関が政治家の削除済み投稿をアーカイブしてきたのと同じ扱いです。
#政治関連の収集にかかる費用
Sorsa APIで政治関連のデータを集める費用は、検索、タイムライン、リストのフィードのいずれも1,000ツイートあたり$0.07からです。公式X APIは1,000投稿あたり$5.00なので、約70分の1のコストです。下のカードで、研究の規模に合わせて両APIを比較できます。
公式X API
$5,000
政治関連ツイート100万件の場合
1投稿$0.005
Sorsa API
$70から
政治関連ツイート100万件の場合
1,000件あたり$0.07から
71分の1のコスト
典型的な研究作業を3つ挙げると、差がどこに出るかが分かります。公式X APIの金額は投稿のみを対象とし、Xの従量課金の料金表(新しいタブで開きます)の価格で計算しています。
| 研究作業 | ツイート数 | Sorsa API | 公式X API |
|---|---|---|---|
| 連邦議会の1か月分の投稿(505アカウント、1日4件ずつ、1時間ごとに確認) | 6.1万 | $5.04から | $303 |
| 討論会の夜1回分(全候補者の名前とハッシュタグ) | 20万 | $14から | $1,000 |
| 選挙戦の議論10週間分 | 1,000万 | $700から | 月間300万件の上限を超過:Enterprise、月$42K以上 |
連邦議会の1か月分の投稿(505アカウント、1日4件ずつ、1時間ごとに確認)
- ツイート数
- 6.1万
- Sorsa API
- $5.04から
- 公式X API
- $303
討論会の夜1回分(全候補者の名前とハッシュタグ)
- ツイート数
- 20万
- Sorsa API
- $14から
- 公式X API
- $1,000
選挙戦の議論10週間分
- ツイート数
- 1,000万
- Sorsa API
- $700から
- 公式X API
- 月間300万件の上限を超過:Enterprise、月$42K以上
知っておきたいこと
2026年11月22日から、公式X APIは投稿と一緒に返される投稿者プロフィールにも、1件あたり$0.010を課金します。Xの開発者チームが10月23日に発表(新しいタブで開きます)しました。検索結果には数多くの異なる投稿者が含まれるため、そこで読み取った選挙の議論には、1,000投稿あたり最大$15.00かかる場合があります。Sorsa APIは、すべての投稿者をツイートに含めて返します。
公式X APIの従量課金プランは、課金サイクルあたり300万投稿の読み取りが上限です。全国規模の選挙戦なら数週間で上限に達し、その先はEnterprise契約で、月約$42,000からになります。最初の1回を読み取る前に、承認された開発者アカウント、プロジェクトとアプリ、OAuthトークンも必要です。
#政治研究の信頼性を保つためのルール
政治関連のTwitterデータが測るのはオンライン上の議論であり、世論ではありません。次のルールは、研究をデータが示せる範囲にとどめるためのものです。
- Xのユーザーは有権者全体ではありません。 Pewの調査では、50歳以上の成人は米国の成人ユーザーの24%でしたが、政治関連のツイートの78%を書いていました。件数は、Xで誰が発言しているかを測る指標として扱い、世論調査の代わりにはしないでください。
- ボットや協調アカウントは、政治的な話題の数字を押し上げます。 集計の前に除外し、何を除いたかを報告してください。見分けるシグナルは、Twitterのボット検出のガイドにまとめています。
- クエリが結果を決めます。 他の人があなたのデータセットを再現できるよう、実際のクエリ、期間の窓、エンドポイント、収集日を公開してください。
- 研究の対象は投稿と公職者であり、有権者ではありません。 議論は集計して測り、一般ユーザーの引用は控えめにします。個人の政治的見解を推定することは、研究倫理で禁じられています。Xの開発者規約(新しいタブで開きます)も、政治的な立場による個人のプロファイリングを禁じています。
知っておきたいこと
政治データは政治を理解するためのもので、有権者を誘導するためのものではありません。政治関連の収集は、研究、報道、説明責任を問う取り組みにとどめてください。有権者名簿の利用、ターゲティングリストの作成、投稿をもとに選んだ人へのメッセージ配信は行わないでください。
コーパスのラベル付け、重複排除、モデル用の分割は、政治関連のツイートでも他のツイートと変わりません。手順は機械学習用のTwitterデータセットの作り方で解説しています。トーンやスタンスのスコアリングは、Twitterの感情分析が扱うテーマです。
#100回分の無料リクエストで政治関連の収集を始める
政治関連のTwitterデータを集めるなら、Sorsa APIから始めましょう。ウォッチリストのフィード、タイムライン、選挙の検索を、APIキー1つ、1,000ツイートあたり$0.07から、全プラン毎秒20リクエストで利用できます。100回分の無料リクエストで約2,000件の投稿を取得でき、カードも有効期限も不要です。まず公職者か選挙戦の1週間分を取得してクエリを確かめ、そのあとで残りをスケジュール実行に移してください。大学のチームは、大学のメールアドレスでSorsa APIの学術研究向けアクセスにも申請できます。
#よくある質問
研究用に、Twitterの政治関連データは今も入手できますか?
はい。無料の学術向けアクセスは2023年に終了しましたが、公開されている政治関連の投稿は、APIで引き続き収集できます。公式X APIの料金は1投稿あたり$0.005で、月間300万投稿が上限です。Sorsa APIなら同じ公開投稿を1,000件あたり$0.07から読み取れ、予算を組む前に100回分の無料リクエストで研究を試せます。ツイートIDを集めた公開データセットもありますが、削除された投稿はそこからは返ってきません。
政治関連のTwitterデータに最適なAPIはどれですか?
政治関連のTwitterデータには、Sorsa APIが適しています。政治家のタイムライン、Xリストのフィード、選挙の検索を1,000ツイートあたり$0.07から読み取れます(公式X APIは$5.00)。APIキー1つで開発者アカウントは不要、全プラン毎秒20リクエストで、月間300万件の上限もなく、各投稿者のプロフィールも追加料金なしで返ります。読み取り専用なので、ご自身のXアカウントに触れることはありません。
政治家が削除したツイートは入手できますか?
投稿者が削除したツイートは、Sorsa APIを含め、どのAPIも返しません。削除された投稿が残るのは、先に誰かが保存した場所だけです。報道機関のアーカイブ、ウェブアーカイブのスナップショット、自分の収集データがそれに当たります。削除を研究するには、ウォッチリストの投稿を現れた時点ですべて保存し、そのIDをSorsa APIの POST /tweet-info-bulk で1リクエストあたり100件ずつ再確認して、返ってこなくなったものを記録します。
連邦議会議員のTwitterアカウントの一覧は、どこで見つかりますか?
オープンデータのプロジェクトunitedstates/congress-legislatorsが、legislators-social-media.yamlというファイルで一覧を公開しています。2026年11月2日時点で、現職議員のXハンドルが505件載っており、うち408件に数値のユーザーIDが付いています。公式アカウントのみで、選挙運動用のアカウントは含まれません。ハンドルはSorsa APIの GET /info-batch で1リクエストあたり100件ずつIDに変換し、IDを保管してください。ハンドルは変わるためです。
Twitterのデータで選挙結果を予測できますか?
それだけでは予測できません。Xのユーザーは有権者の標本ではないからです。Pew Research Centerの調査では、50歳以上の成人は米国の成人ユーザーの24%にすぎないのに、政治関連ツイートの78%を書いていました。投稿数や感情のスコアが測るのはオンライン上の議論です。議題、選挙運動、反応の研究には役立ちますが、それだけを根拠にした予測の実績は芳しくありません。
EUの研究者は、DSAに基づいてXのデータを入手できますか?
はい。デジタルサービス法(DSA)の第40条に基づいて可能です。審査を受けた研究者は、Xのような超大規模プラットフォームのデータを、各国のデジタルサービス調整官を通じて請求できます。対象はEUにおけるシステミックリスクの研究で、選挙や市民的言論へのリスクも含まれます。EUのデータアクセス用ポータルは、2025年10月29日から申請を受け付けています。承認には時間がかかるため、その間にAPIで公開投稿の収集を始めるチームも多くあります。
#検証の方法
2026年11月2日に、Xの従量課金の料金表、2026年4月27日付の開発者規約、2026年10月23日付の課金拡大のお知らせを読みました。この記事に出てくる公式X APIの料金とルールは、すべてそこから引用しています。同じ日に、unitedstates/congress-legislatorsのSNSファイルをダウンロードしてアカウント数を数え、Pew Research Centerの2022年のレポートと、欧州委員会のDSAデータアクセスに関するFAQも読みました。Sorsa APIの各エンドポイント、パラメーター、ページサイズは、公開中のAPIリファレンスと照らして確認しています。リクエストとレスポンスはそれをもとにデモアカウントで作成し、費用は公開料金から計算した数字です。
出典
- X API pay-per-usage pricing(新しいタブで開きます)
- X Developers: PPU expansions update (Oct 23, 2026)(新しいタブで開きます)
- X Developer Agreement (April 27, 2026)(新しいタブで開きます)
- unitedstates/congress-legislators: legislators-social-media.yaml(新しいタブで開きます)
- Pew Research Center: Politics on Twitter (June 16, 2022)(新しいタブで開きます)
- European Commission: FAQs on DSA data access for researchers(新しいタブで開きます)
- Sorsa API docs: Lists and Communities(新しいタブで開きます)
- Sorsa API reference (OpenAPI)