Python 获取推特数据 2026:不写爬虫的三种方法
用 Python 获取推特(X)推文的三种方法:官方 API 要花多少钱、twscrape 这类爬虫库为什么总失效,以及实测能运行的代码:搜索、翻页、导出 CSV。
Tarun Khatri
发布于 · 更新于 · 阅读约 7 分钟 · Read in English
用 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])
整篇教程的路线:
- 拿到 Key注册,复制 Key,设置 WEIR_API_KEY。
- 搜索推文用查询语句或筛选字段调用 POST /v1/x/search。
- 读取一个账号GET /v1/x/users/{user}/posts。
- 用 cursor 翻页把 meta.nextCursor 原样传回,直到它为 null。
- 保存为 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 积分。
这需要 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 条。
参考来源
均为英文页面:
- X API 按量计费价格(2026 年 10 月 19 日核对):https://docs.x.com/x-api/getting-started/pricing
- X API 搜索介绍:https://docs.x.com/x-api/posts/search/introduction
- X API 搜索运算符:https://docs.x.com/x-api/posts/search/integrate/operators
- X 服务条款(2026 年 10 月 9 日生效):https://x.com/en/tos
- PyPI 上的 Tweepy(4.17.0,2026 年 7 月):https://pypi.org/project/tweepy/
- PyPI 上的 XDK,X 的 Python SDK:https://pypi.org/project/xdk/
- PyPI 上的 snscrape(最后发布于 2023 年 6 月):https://pypi.org/project/snscrape/
- snscrape 第 996 号问题(2023 年 6 月 30 日提出):https://github.com/JustAnotherArchivist/snscrape/issues/996
- PyPI 上的 twikit(2.3.3,2025 年 2 月):https://pypi.org/project/twikit/
- twikit 第 425 号问题:https://github.com/d60/twikit/issues/425
- PyPI 上的 twscrape(0.20.1,2026 年 8 月):https://pypi.org/project/twscrape/
- twscrape 说明文档:https://github.com/vladkens/twscrape
- Weir 计费与档位:https://docs.weirapp.io/billing
- Weir 分页:https://docs.weirapp.io/pagination