WEIR

Python 获取推特数据 2026:不写爬虫的三种方法

用 Python 获取推特(X)推文的三种方法:官方 API 要花多少钱、twscrape 这类爬虫库为什么总失效,以及实测能运行的代码:搜索、翻页、导出 CSV。


发布于 · 更新于 · 阅读约 7 分钟 · Read in English

封面图:15 行 Python 读推文

用 Python 获取推文有三种办法:X 官方 API、爬虫库,或者用 requests 调用托管的 REST API。

这篇写给要在脚本里或 CSV 里拿到 X(推特)推文的开发者。你会看到每种办法要花多少钱、有多容易坏,以及第三种办法能直接运行的代码。示例里的 API 是我们做的 Weir,看我们的观点时请记住这一点。

粘贴这段,先看到第一批推文:

import os, requests

r = requests.post(
    "https://api.weirapp.io/v1/x/search",
    headers={"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}"},
    json={"query": "python", "language": "en", "limit": 20},
    timeout=60,
)
for post in r.json()["data"]:
    print(post["author"]["username"], post["text"][:80])

整篇教程的路线:

  1. 拿到 Key注册,复制 Key,设置 WEIR_API_KEY。
  2. 搜索推文用查询语句或筛选字段调用 POST /v1/x/search。
  3. 读取一个账号GET /v1/x/users/{user}/posts。
  4. 用 cursor 翻页把 meta.nextCursor 原样传回,直到它为 null。
  5. 保存为 CSV用 csv.DictWriter 把每条推文写成一行。

2026 年用 Python 获取推文的三种方法

每种方法都是在花钱和稳定之间做取舍。截至 2026 年 10 月的对比:

方法 你需要 读取推文的成本 主要风险
X 官方 API 开发者账号和积分 每条 $0.005 量大了很贵
twscrape、twikit 你自己的 X 账号 不花钱 随时可能失效
Weir REST API 一个 API Key 每千条 1,050 积分 第三方,不是 X

这一节讲前两种,后面的步骤用第三种。

用 Tweepy 调用 X 官方 API

X 的 API 按量计费:先买积分,每读一条推文扣 $0.005。X 的价格页面规定,这类套餐每月最多读取 300 万条推文。

同一个 UTC 日内重复读取同一条推文,只收一次费。

最近推文搜索覆盖过去 7 天,每次请求最多 100 条。全量历史搜索能查到 2006 年,每次最多返回 500 条。

Tweepy 是老牌的 Python 客户端,仍在维护,版本 4.17.0。一个最简单的最近推文搜索:

import os, tweepy

client = tweepy.Client(bearer_token=os.environ["X_BEARER_TOKEN"])
response = client.search_recent_tweets(
    query="python lang:en -is:retweet",
    max_results=100,
    tweet_fields=["created_at", "public_metrics"],
)
for tweet in response.data or []:
    print(tweet.id, tweet.public_metrics["like_count"])

X 也发布了自己的 Python SDK xdk,不想用社区库的话可以用它。

账很好算。一次 100 条的请求要 50 美分,所以 1 万条推文要 $50。换来的是 X 官方的条款、写入权限,以及每次 500 条的历史搜索。

v2 API 有自己的一套查询语法。它会拒绝 min_faves: 并返回 400,要改用 min_likes:。两套语法的对照见我们的推特高级搜索语法实测。

爬虫库:twscrape、twikit、snscrape

这些库调用的是 x.com 网页版自己用的内部接口。2026 年 10 月 19 日,我们在 GitHub 和 PyPI 上查了它们的状态:

  • snscrape 最后一次发布是 2023 年 6 月。它的 #996 号问题“所有推特抓取都失败了”至今没有关闭。
  • twikit 最后发布的是 2025 年 2 月的 2.3.3。未关闭的问题里有一个从 2026 年 4 月开始的 KeyError。
  • twscrape 还在更新,版本 0.20.1。它的说明写明“需要已授权的 X 账号”。

它们有同一个弱点:X 一改内部接口,它们就会失效,直到维护者跟上,而风险由你的账号承担。

X 的服务条款也写明,未经 X 明确的书面许可,你“不能抓取服务内容”。本文不构成法律建议。

第 1 步:拿到 Key,准备环境

免费注册,无需绑卡,在 API keys 里创建一个 Key,然后安装 requests:

pip install requests
export WEIR_API_KEY="weir_live_..."

用一个共享的 session,把认证请求头放在一处:

import os, time, requests

API = "https://api.weirapp.io"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['WEIR_API_KEY']}"

第 2 步:用 Python 搜索推文

搜索接口是 POST /v1/x/search,请求体是 JSON。在 query 里写 X 的搜索语法,或者用 fromUsers、minLikes、since 这样的字段,Weir 会替你把它们转换成运算符:

response = session.post(f"{API}/v1/x/search", json={
    "fromUsers": ["XDevelopers"],
    "minLikes": 500,
    "onlyOriginal": True,  # 不要回复
    "since": "2026-08-01T00:00:00Z",
    "limit": 20,
}, timeout=60)
response.raise_for_status()

for post in response.json()["data"]:
    print(post["createdAt"][:10], post["likeCount"], post["id"])
print("credits:", response.headers["x-credits-charged"])

我们在 10 月 19 日用 limit: 2 运行了它,返回两条推文,扣了 3 积分。其中一条,删减后如下:

{
  "id": "2107953725071626260",
  "url": "https://x.com/XDevelopers/status/2107953725071626260",
  "createdAt": "2026-10-07T21:58:26.000Z",
  "author": { "username": "XDevelopers", "followersCount": 698067 },
  "likeCount": 758,
  "retweetCount": 45,
  "viewCount": 31280
}

字段名沿用 X 自己的叫法。

id 要当字符串保存,因为 X 的 ID 太大,浮点数存不下。计数为 null 表示 X 没有提供,不是零。

第 3 步:读取一个账号的推文

一个账号的时间线是 GET /v1/x/users/{user}/posts。{user} 可以是用户名,也可以是数字 ID,limit 最大 20:

response = session.get(f"{API}/v1/x/users/XDevelopers/posts",
                       params={"limit": 20}, timeout=60)
response.raise_for_status()
timeline = response.json()["data"]

它按时间倒序返回推文和转推,置顶推文排在最前。我们运行时,@XDevelopers 2 月的置顶推文排在第一:

{
  "id": "2019881223666233717",
  "text": "Officially launching X API Pay-Per-Use ...",
  "createdAt": "2026-02-06T21:09:45.000Z",
  "likeCount": 5595
}

回复在 /v1/x/users/{user}/replies。受保护或不存在的账号返回 404。要查时间线够不到的更早推文,看如何下载某个用户的全部推文(英文)。

第 4 步:用 cursor 翻页

每个列表响应都带有 meta.nextCursor。原样传回去就能拿到下一页,只有 null 表示结束。

搜索接口在请求体里传 cursor,GET 接口在查询参数里传。

def search_pages(body, max_pages=10):
    cursor = None
    for _ in range(max_pages):
        payload = {**body, "cursor": cursor} if cursor else body
        r = session.post(f"{API}/v1/x/search", json=payload, timeout=60)
        if r.status_code == 429:  # 太快了:等一会儿再重试
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        r.raise_for_status()  # 402 表示积分用完:停止
        page = r.json()
        yield from page["data"]
        cursor = page["meta"]["nextCursor"]
        if not cursor:
            return

这个循环做对了三件事:

  • 有翻页上限。 max_pages 防止宽泛的查询一直翻页、一直计费。
  • 429 和 402 不一样。 429 等 Retry-After 之后就好;402 需要充值。
  • 请求体保持不变。 cursor 和它的请求绑定,筛选条件变了会返回 400。

无论 limit 设多大,X 每页搜索大约只给 20 条。

第 5 步:把推文保存为 CSV

DictWriter 加上 extrasaction="ignore",只保留你指定的列,其余丢掉:

import csv

FIELDS = ["id", "createdAt", "username", "text", "likeCount", "viewCount", "url"]
query = {"query": "python", "language": "en", "minLikes": 50, "onlyOriginal": True}

with open("posts.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=FIELDS, extrasaction="ignore")
    writer.writeheader()
    for post in search_pages(query, max_pages=5):
        writer.writerow({**post, "username": post["author"]["username"]})

保留 encoding="utf-8",因为推文里到处是表情和中文。

Excel 会把长 ID 显示成科学计数法。那只是显示方式,CSV 里每一位数字都在。

获取 1 万条推文要花多少钱?

一次搜索调用扣 1 积分,每条推文再扣 1 积分,所以一页 20 条是 21 积分。

读取 1 万条推文
X 官方 API$50
Weir,$5 套餐约 $2.10

这需要 500 页,也就是 10,500 积分。$5 的套餐有 25,000 积分,永不过期。

每月 5,000 免费积分够读大约 238 整页,也就是 4,760 条推文。

什么时候不适合用 Weir

  • 你要发推,或者代表用户操作。 只有 X 官方 API 能写入。
  • 你需要和 X 本身签合同, 或者公司要求第一方数据。
  • 每次历史请求要 500 条推文。 X 的全量历史搜索每次返回更多。
  • 你只追求最大量。 有些第三方按条更便宜,见推特 API 替代方案。

常见问题

现在还能用 Python 免费获取推文吗?

部分可以。X 官方 API 对新应用没有免费套餐。爬虫库不花钱,但要用你自己的账号,而且经常失效。Weir 每月送 5,000 免费积分,大约能读 4,760 条推文。

用推特爬虫库会被封号吗?

有风险。twscrape 的说明写明需要已授权的 X 账号,X 一改接口库就失效,风险由你的账号承担。X 的服务条款也禁止未经书面许可的抓取。

Tweepy 在 2026 年还能用吗?

能。Tweepy 仍在维护,版本 4.17.0,支持 X API v2。但你仍要按 X 的价格付费,每读一条推文 $0.005,还需要一个有积分的开发者账号的 Bearer Token。

一次请求能拿到多少条推文?

在 Weir 上,无论 limit 设多少,每页搜索大约 20 条。X 的最近推文搜索每次最多 100 条,全量历史搜索最多 500 条。

参考来源

均为英文页面: