如何收集政治类 Twitter 数据用于研究
收集政治类 Twitter 数据,需要一份官员账号的关注名单,再加一条有文档记录的选举或议题搜索,然后通过 API 定时拉取这两类数据;官方 X API 每 1,000 条帖子收费 $5.00。
简短回答: X 对学术研究的免费接入在 2023 年已经终止,如今研究类采集都要按读取量付费:官方 X API 每条帖子收费 $0.005,每月最多 300 万条。要采集政治人物的时间线和选举讨论,可以用 Sorsa API,一款 Twitter(X)API 与爬虫:每 1,000 条推文 $0.07 起,并附 100 次免费请求供你上手。
- 接口
POST /search-tweets- 每页条数
- 每次请求约 20 条推文
- 价格
- 每 1,000 条 $0.07 起
#能收集哪些政治类 Twitter 数据
目前能收集的 X 政治数据有三类:官员自己发的帖子,公众围绕某次选举或某个议题的发言,以及人们对官员帖子的回应。这些数据都是公开的,带时间戳,并且能对应到作者,所以 X 至今仍是政治传播研究的标准数据源。
- 官员自己的帖子。 包括立法者、部长、政党、政府机构和候选人。数据量小而干净:一个国家级立法机构只有几百个账号,每月发帖几万条。
- 选举和议题讨论。 公众带着候选人姓名、某项法案、某个话题标签或某场辩论发出的所有帖子。小到地方选举的几千条,大到全国大选的数百万条。
- 回应。 官员声明下面的回复和引用帖子,能看出一条信息传达到了什么效果。
有些数据任何 API 都拿不到:作者已删除的帖子、受保护的账号、私信,以及谁点赞了一条帖子的名单。旧的研究数据集也补不上这个缺口。它们大多以推文 ID 列表的形式发布,因为平台规则允许分享 ID,却不允许分享正文,而一条已删除推文的 ID 现在什么也查不到。研究者在 2023 年失去了免费渠道,后来是什么取代了它,可以看谁能检索 Twitter 档案的来龙去脉。
所以 2026 年做政治研究,要自己采集数据:研究进行中的竞选,从今天起向前采集;研究已经结束的竞选,则回溯档案,档案最早可追溯到 2006 年 3 月。
#用 Sorsa API 收集政治推文
收集政治推文,可以用 Sorsa API:一个 API 密钥就能读取官员的时间线和选举讨论,每 1,000 条推文 $0.07 起,所有套餐统一每秒 20 次请求,不需要 X 开发者账号,也不用 OAuth。同样的读取,官方 X API 每 1,000 条帖子收费 $5.00,每月最多 300 万条。
每一类政治数据都有对应的接口。每个接口在每条推文里都附带作者的完整资料,不另外收费。
| 政治数据 | Sorsa API 接口 | 每次请求 | 每 1,000 条起 |
|---|---|---|---|
| 一份官员名单,合并成一条动态 | GET /list-tweets(在新标签页打开) | 约 20 条推文 | $0.07 |
| 某位官员的完整时间线 | 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 |
一份官员名单,合并成一条动态
- Sorsa API 接口
GET /list-tweets(在新标签页打开)- 每次请求
- 约 20 条推文
- 每 1,000 条起
- $0.07
某位官员的完整时间线
- Sorsa API 接口
POST /user-tweets(在新标签页打开)- 每次请求
- 约 20 条推文
- 每 1,000 条起
- $0.07
按查询词和日期检索的选举或议题讨论
- Sorsa API 接口
POST /search-tweets(在新标签页打开)- 每次请求
- 约 20 条推文
- 每 1,000 条起
- $0.07
官员某条帖子下的回复
- Sorsa API 接口
POST /comments(在新标签页打开)- 每次请求
- 约 20 条回复
- 每 1,000 条起
- $0.07
名单上每个账号的资料
- Sorsa API 接口
GET /info-batch(在新标签页打开)- 每次请求
- 最多 100 份资料
- 每 1,000 条起
- $0.014
已有帖子,按 ID 重新核对
- Sorsa API 接口
POST /tweet-info-bulk(在新标签页打开)- 每次请求
- 最多 100 条推文
- 每 1,000 条起
- $0.014
Sorsa API 是 REST API:带上密钥发一次请求就返回干净的 JSON,不需要在浏览器里运行任何东西,也不需要 X 账号。它自 2022 年起一直在生产环境运行,累计处理请求超 60 亿次,而且 X 有任何变动,都由我们负责修复,所以跨越整个选举之夜的采集不会中途出错。它从不要求你的 X 登录信息,因此你自己的账号不会有任何风险。
#建立政治人物账号关注名单
关注名单就是你的研究要跟踪的账号清单,以数字用户 ID 保存。名单要从已经有人核实过的公开来源出发,而不是靠搜索蓝标账号:2023 年以后,蓝标只是付费订阅,不能证明账号是官方账号。
对美国国会,开放数据项目 unitedstates/congress-legislators(在新标签页打开) 维护着一份议员官方社交媒体账号的文件。2026 年 11 月 2 日,它列出了 505 个 X 账号名,其中 408 个带有数字 ID,最近一次更新是 2026 年 10 月 24 日。该项目只收录官方的、由纳税人供养的账号,不收竞选账号和个人账号,而研究官方沟通恰恰需要这种区分。许多国家的议会会在自己的开放数据网站上公布议员账号,研究其他国家时可以从那里入手。
账号名会变,数字 ID 不会。用 GET /info-batch 把每个账号名解析成 ID,每次请求 100 个账号,然后把 ID 作为关注名单的主键保存。下面的脚本读取国会文件,为每位议员保存一行资料。
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")
6 次请求就能覆盖全部 505 个账号名。返回结果里缺失的账号,是在名单更新之后被改名、被封禁或被设为受保护的;请手动检查一遍并修正文件。
#采集名单中的每一条帖子
要采集一份名单发布的每一条帖子,把这些账号放进一个公开的 X 列表,再用 GET /list-tweets 读取:一条动态就包含所有成员的帖子,按时间从新到旧排列,每次请求约 20 条。一个 X 列表最多容纳 5,000 个账号,足够任何一个国家级立法机构使用,列表指南里讲了怎样通过 API 读取 X 列表。
按计划定时检查这条动态,只往回翻页,直到遇到已保存的帖子为止。这样,对一份 505 个账号的国会名单做每小时检查,无论这一小时是冷清还是热闹,都只需要几次请求。
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 表示一秒内超过了 20 次请求,所以脚本会等一秒再重试。推文 ID 随时间递增,因此靠比较 ID 就能找到最后一条已保存的帖子。
关注名单中的账号数
每个账号每天发帖数
你查看信息流的频率
约 61K 条帖子/月 来自 505 个账号,每小时检查一次
$303
官方 X API
每条帖子 $0.005
每月,仅含帖子
低至 $5.04
Sorsa API
一个 List 信息流,每次请求约 20 条帖子
每月,含作者
不到 1 秒 完成一次检查(Sorsa API,每秒 20 次请求),每次对应约 84 条新帖子。
设置关注名单的规模、账号发帖的频率和你查看的频率,就能看到两种 API 一个月的采集费用。
如果要一次性拉取某位官员的全部历史,用该账号的用户 ID 调用 POST /user-tweets,从最新的帖子一路往回翻页到最早的帖子;下载某用户的全部推文这篇指南讲了怎样把这些数据导出为 CSV。
#通过搜索收集选举和议题讨论
选举和议题讨论靠搜索查询来收集:候选人和政党的名字、这场竞选的话题标签、议题的关键短语、一种语言和一个日期窗口,一起发送给 POST /search-tweets,再用 next_cursor 翻页。查询词就是研究设计本身,所以要在采集之前写好,并随研究结果一同公布。
查询要保持均衡。只搜一方的话题标签,测量的就只是这一方,所以要用同样的方式、同样的运算符列出竞选中的每位候选人和每个政党。较长的时间段用 since: 和 until: 切成一天或一周的窗口,这样某个窗口失败时可以单独重跑。完整语法见 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,直到响应里不再带它为止。每页约 20 条推文,条数并不固定,所以要数帖子,不要数页数。
采集前先决定如何处理转发
转发所含的政治内容远多于原创帖子,所以去掉转发会改变数据集所反映的内容。Pew Research Center 对美国成年人一年推文的研究发现,44% 的转发和 42% 的引用帖子属于政治内容,而回复中这一比例是 26%,原创推文只有 8%。
如果研究的是人们用自己的话说了什么,就在查询里加上 -filter:retweets。如果研究的是什么在传播,就保留转发,并通过每条转发的 retweeted_status 读取原帖。两种选择都站得住脚,但听凭运气不行。
#保留一份删帖记录
作者删除帖子之后,没有任何 API 还能返回它,Sorsa API 不行,官方 X API 也不行,所以政治人物删帖的唯一记录,就是你最先保存下来的那一份。如果关注名单在每条帖子第一次出现时就存下了它,你已经有了这份记录;接下来要补上的,是发现帖子被删的办法。
用 POST /tweet-info-bulk 重新核对你保存的 ID,每次请求 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 倍。下面的卡片按你的研究规模对比两家 API。
官方 X API
$5,000
100 万条政治推文
每条帖子 $0.005
Sorsa API
$70 起
100 万条政治推文
每 1,000 条 $0.07 起
便宜 71 倍
三个典型的研究任务,能看出差距落在哪里。官方 X API 的数字只按帖子计算,价格取自 X 的按量付费价格表(在新标签页打开)。
| 研究任务 | 推文数 | Sorsa API | 官方 X API |
|---|---|---|---|
| 一个月的国会帖子,505 个账号每个每天 4 条,每小时检查一次 | 6.1 万 | $5.04 起 | $303 |
| 一场辩论之夜,所有候选人的姓名和话题标签 | 20 万 | $14 起 | $1,000 |
| 十周的竞选讨论 | 1,000 万 | $700 起 | 超过每月 300 万条的上限:需要 Enterprise,每月 $4.2 万以上 |
一个月的国会帖子,505 个账号每个每天 4 条,每小时检查一次
- 推文数
- 6.1 万
- Sorsa API
- $5.04 起
- 官方 X API
- $303
一场辩论之夜,所有候选人的姓名和话题标签
- 推文数
- 20 万
- Sorsa API
- $14 起
- 官方 X API
- $1,000
十周的竞选讨论
- 推文数
- 1,000 万
- Sorsa API
- $700 起
- 官方 X API
- 超过每月 300 万条的上限:需要 Enterprise,每月 $4.2 万以上
须知
从 2026 年 11 月 22 日起,官方 X API 还会对随帖子一起返回的每个作者资料另行计费,每个 $0.010,这是 X 开发者团队在 10 月 23 日宣布(在新标签页打开)的。搜索结果来自成千上万个不同的作者,所以在那里读取选举讨论,每 1,000 条帖子最高可能花到 $15.00。Sorsa API 已把每位作者包含在推文里。
官方 X API 的按量付费方案,每个计费周期最多读取 300 万条帖子,所以一场全国性的竞选几周就会超出,再往上一档是 Enterprise 合同,每月约 $4.2 万起。在第一次读取之前,它还要求有获批的开发者账号、项目和应用,以及 OAuth 令牌。
#让政治研究站得住脚的规则
政治类 Twitter 数据衡量的是网络上的讨论,而不是民意,下面这些规则能让研究始终限定在数据能说明的范围内。
- X 用户不等于选民。 在 Pew 的研究中,50 岁及以上的成年人占美国成年用户的 24%,却写下了他们 78% 的政治推文。数量只能说明谁在 X 上发言,不能当作民调。
- 机器人和协同账号会抬高政治话题的热度。 计数之前先过滤它们,并报告你剔除了多少;Twitter 机器人识别指南列出了识别信号。
- 查询词决定结果。 公布确切的查询词、时间窗口、所用接口和采集日期,别人才能重建你的数据集。
- 研究帖子和公职人员,不要研究选民个人。 只做整体层面的讨论度量,对普通用户的引用要克制。推断个人的政治观点,在研究伦理上是禁区,而且 X 自己的开发者协议(在新标签页打开)也禁止按政治倾向给人建立画像。
须知
政治数据是用来理解政治的,不是用来引导选民的。把政治类采集限定在研究、新闻报道和问责工作的范围内:不做选民档案,不做定向名单,也不向根据帖子挑出来的人群推送信息。
给模型做语料标注、去重和划分,对政治推文与其他推文并无不同,构建用于机器学习的 Twitter 数据集这篇指南讲了这些。对语气和立场打分,则是 Twitter 情感分析的主题。
#用 100 次免费请求开始你的政治数据采集
收集政治类 Twitter 数据,从 Sorsa API 开始:一个 API 密钥就能用上关注名单动态、时间线和选举搜索,每 1,000 条推文 $0.07 起,所有套餐统一每秒 20 次请求。100 次免费请求大约能返回 2,000 条帖子,无需绑卡,永不过期。先拉取一周的官员帖子或你关注的竞选,检查查询词,再安排好定时任务。高校团队还可以使用机构邮箱申请 Sorsa API 的学术研究接入。
#常见问题
我现在还能从 Twitter 获取政治数据用于研究吗?
可以。免费的学术接入在 2023 年终止了,但公开的政治类帖子仍然可以通过 API 采集。官方 X API 每条帖子收费 $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 密钥,不需要开发者账号,所有套餐统一每秒 20 次请求,没有每月 300 万条的上限,并且每位作者的资料随推文返回,不另外收费。它是只读的,所以绝不会动你的 X 账号。
能拿到政治人物已删除的推文吗?
没有任何 API 能返回作者已删除的推文,Sorsa API 也不例外。已删除的帖子只存在于有人事先保存过的地方:新闻机构的档案、网页存档快照或你自己的采集库。要研究删帖,就在关注名单的每条帖子刚出现时存下来,再用 Sorsa API 的 POST /tweet-info-bulk 重新核对已保存的 ID,每次请求 100 个,把不再返回的记录下来。
在哪里能找到国会议员的 Twitter 账号名单?
开放数据项目 unitedstates/congress-legislators 在它的 legislators-social-media.yaml 文件里维护着一份。2026 年 11 月 2 日,它列出了现任议员的 505 个 X 账号名,其中 408 个带有数字用户 ID,并且只包含官方账号,不含竞选账号。用 Sorsa API 的 GET /info-batch 把账号名解析成 ID,每次请求 100 个,并保存 ID,因为账号名会变。
Twitter 数据能预测选举结果吗?
单靠它不行。X 用户并不是选民的样本:在 Pew Research Center 的研究中,50 岁及以上的成年人写下了美国成年人 78% 的政治推文,却只占用户的 24%。帖子数量和情感倾向衡量的是网络讨论,这对研究议程设置、竞选活动和舆论反应有用,但只靠它们做的预测,成绩一直不佳。
欧盟的研究者可以根据 DSA 获取 X 的数据吗?
可以,依据《数字服务法》(DSA)第 40 条。经审核的研究者可以通过本国的数字服务协调员,向 X 这样的超大型平台申请数据,用于研究欧盟范围内的系统性风险,其中包括对选举和公共讨论的风险。欧盟的数据访问门户自 2025 年 10 月 29 日起接受申请。审批需要时间,所以许多团队同时先通过 API 采集公开帖子。
#我们如何核实
2026 年 11 月 2 日,我们阅读了 X 的按量付费价格表、日期为 2026 年 4 月 27 日的开发者协议,以及 2026 年 10 月 23 日关于计费扩展的通知;这里所有官方 X API 的价格和规则都来自这些页面。同一天,我们下载了 unitedstates/congress-legislators 的社交媒体文件并统计了其中的账号数,还阅读了 Pew Research Center 2022 年的报告和欧盟委员会的 DSA 数据访问常见问题。每个 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)