跳到正文

如何收集政治类 Twitter 数据用于研究

收集政治类 Twitter 数据,需要一份官员账号的关注名单,再加一条有文档记录的选举或议题搜索,然后通过 API 定时拉取这两类数据;官方 X API 每 1,000 条帖子收费 $5.00。

  • 更新于
  • 发布于
  • 阅读约 12 分钟

简短回答: 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 是 REST API:带上密钥发一次请求就返回干净的 JSON,不需要在浏览器里运行任何东西,也不需要 X 账号。它自 2022 年起一直在生产环境运行,累计处理请求超 60 亿次,而且 X 有任何变动,都由我们负责修复,所以跨越整个选举之夜的采集不会中途出错。它从不要求你的 X 登录信息,因此你自己的账号不会有任何风险。

#建立政治人物账号关注名单

关注名单就是你的研究要跟踪的账号清单,以数字用户 ID 保存。名单要从已经有人核实过的公开来源出发,而不是靠搜索蓝标账号:2023 年以后,蓝标只是付费订阅,不能证明账号是官方账号。

步骤 来源或 Sorsa API 接口 1 列出账号 来自公开文件的 505 个国会账号 legislators-social-media.yaml 仅官方账号 2 固定数字 ID 用户名会变,用户 ID 不会 GET /info-batch 每次请求 100 份资料 3 读取关注列表信息流 每小时一次,读到上次保存的推文为止 GET /list-tweets 一个信息流最多 5,000 个账号 4 存储并复查 保存每条推文首次出现的时间, 记录不再返回的推文 POST /tweet-info-bulk 每次请求 100 个已存 ID
关注名单分四步运行:列名单、解析、读取、重新核对。最后一步把删帖变成数据。

对美国国会,开放数据项目 unitedstates/congress-legislators(在新标签页打开) 维护着一份议员官方社交媒体账号的文件。2026 年 11 月 2 日,它列出了 505 个 X 账号名,其中 408 个带有数字 ID,最近一次更新是 2026 年 10 月 24 日。该项目只收录官方的、由纳税人供养的账号,不收竞选账号和个人账号,而研究官方沟通恰恰需要这种区分。许多国家的议会会在自己的开放数据网站上公布议员账号,研究其他国家时可以从那里入手。

账号名会变,数字 ID 不会。用 GET /info-batch 把每个账号名解析成 ID,每次请求 100 个账号,然后把 ID 作为关注名单的主键保存。下面的脚本读取国会文件,为每位议员保存一行资料。

Python
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 搜索运算符列表。

Terminal
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"
  }'
Response200 OK
{
  "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%。

政治类推文占比,按类型 转发 44% 引用推文 42% 回复 26% 原创推文 8% 0% 25% 50%
按推文类型划分的政治内容占比,美国成年人,2020 年 5 月至 2021 年 5 月。过滤转发,就会去掉讨论中政治色彩最浓的部分。

如果研究的是人们用自己的话说了什么,就在查询里加上 -filter:retweets。如果研究的是什么在传播,就保留转发,并通过每条转发的 retweeted_status 读取原帖。两种选择都站得住脚,但听凭运气不行。

#保留一份删帖记录

作者删除帖子之后,没有任何 API 还能返回它,Sorsa API 不行,官方 X API 也不行,所以政治人物删帖的唯一记录,就是你最先保存下来的那一份。如果关注名单在每条帖子第一次出现时就存下了它,你已经有了这份记录;接下来要补上的,是发现帖子被删的办法。

用 POST /tweet-info-bulk 重新核对你保存的 ID,每次请求 100 个。某条帖子不再返回,说明它被删除了,或者它的账号被封禁或设为受保护;把这个 ID 连同你发现的时间记录下来。每天重新核对 10 万条已保存的帖子,需要 1,000 次请求,$1.40 起。

Python
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 参考核对过;请求和响应是基于它、用演示账号构造的,费用则是根据公布的费率算出来的。

Sorsa API 团队撰写。 我们开发和运营 Sorsa API,这是只读的 Twitter/X API 与爬虫,2022 年起运行于生产环境(前身为 TweetScout API),累计处理请求超 60 亿次。 关于 Sorsa API

更新内容
  • 全文重写。官方 X API 的价格、300 万条上限、11 月 22 日起的作者资料计费以及开发者协议,均已在 X 自己的页面上重新核对。新增:基于公开来源的国会议员名单、用 Python 和 Node.js 编写的每小时 List 动态采集脚本、月度费用计算器、删帖日志、带真实查询的均衡选举搜索,以及 Pew 关于转发的数据和研究规则。旧的费用表和无法验证的采集示例已删除。
  • 首次发布。