批量下载推特推文:导出某人的全部推文到 CSV(2026)
批量下载推特推文有两条路:自己的账号申请 X 数据存档,别人的公开账号用 Python 按年份搜索,一直查到 2006 年,存成 CSV。附实测输出和费用。
Tarun Khatri
发布于 · 更新于 · 阅读约 7 分钟 · Read in English · 日本語で読む
批量下载推特推文,自己的账号用 X 数据存档,别人的公开账号就按年份搜索,存进 CSV。
这篇写给要把某个 X(推特)账号的全部推文放进表格的研究者、运营和开发者。你会看到存档的申请步骤、一个 Python 脚本和真实费用。示例里的 API 是我们做的 Weir,读我们的观点时请记住这一点。
这条命令导出一个账号一整年的推文:
curl --request POST \
--url https://api.weirapp.io/v1/x/search \
--header "Authorization: Bearer $WEIR_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"fromUsers":["jack"],"since":"2006-01-01T00:00:00Z","until":"2007-01-01T00:00:00Z","limit":20}'
整个流程:
- 先看是谁的推文自己的?X 数据存档比任何 API 都全。
- 拿到 Key注册,复制 Key,设置 WEIR_API_KEY。
- 搜索一年fromUsers 加上 since 和 until。
- 翻到最后一页把 meta.nextCursor 传回,直到它为 null。
- 逐年写进 CSV一个文件,每条推文一行。
第 1 步:下载自己的推文,用 X 数据存档
推文是你自己的,就不用 API。X 会免费给你的账号打包一份完整存档。
X 帮助中心列出的步骤:
- 打开“设置和隐私”,再点“你的账号”。
- 选“下载你的数据存档”,用验证码确认身份。
- 提交申请。X 说准备存档可能需要几天。
- 下载 ZIP,链接在 X 发来的邮件或推送里。
ZIP 里是 HTML 和 JSON 文件,还有一个“你的存档”页面,在电脑浏览器里打开就能看。它包括你的推文、媒体和私信。
想把推文变成表格,把 ZIP 拖进我们免费的推特存档查看器。它在浏览器里直接导出 CSV,不上传任何文件。
这个办法只对你登录的账号有效。要导出别人的推文,接着往下看。
第 2 步:拿到 Key,先搜一年的推文
免费注册,不用绑卡,在 API keys 里创建一个 Key,然后设置好:
pip install requests
export WEIR_API_KEY="weir_live_..."
Weir 的搜索用 fromUsers 指定账号,用 since 和 until 指定日期。since 包含当时,until 不包含。
import csv, os, sys, time, requests
API = "https://api.weirapp.io/v1/x/search"
HEADERS = {"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}"}
body = {"fromUsers": ["jack"], "since": "2006-01-01T00:00:00Z",
"until": "2007-01-01T00:00:00Z", "limit": 20}
r = requests.post(API, headers=HEADERS, json=body, timeout=60)
for post in r.json()["data"]:
print(post["createdAt"][:10], post["id"], post["text"][:60])
print("credits:", r.headers["x-credits-charged"])
搜索能查到 X 最早的那几天。2026 年 10 月 21 日,我们对 X 联合创始人 @jack 跑了这段代码,把 until 设为 2006 年 3 月 22 日。用 limit: 3,第二页里就是第 20 号推文:
{
"id": "20",
"text": "just setting up my twttr",
"url": "https://x.com/jack/status/20",
"createdAt": "2006-03-21T20:50:14.000Z",
"author": { "username": "jack", "followersCount": 12533336 },
"likeCount": 311641,
"retweetCount": 124594
}
这是 X 上第一条公开推文,返回的格式和今天的推文一模一样。
id 要按字符串保存,现在的推文 ID 太大,浮点数存不下。
第 3 步:用 cursor 把一年翻到底
X 每次大约给 20 条。每个响应都带 meta.nextCursor,原样传回去就是下一页。
只有 null 表示结束:
def year_of_posts(user, year, max_pages=200):
body = {"fromUsers": [user], "limit": 20, "since": f"{year}-01-01T00:00:00Z",
"until": f"{year + 1}-01-01T00:00:00Z"}
for _ in range(max_pages):
r = requests.post(API, headers=HEADERS, json=body, 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"]
body["cursor"] = page["meta"]["nextCursor"]
if not body["cursor"]:
return
我们翻 @jack 的那次,结尾和每次一样。第 20 号推文之后,下一次调用返回空:
{ "data": [], "meta": { "nextCursor": null } }
最后这次调用扣了 1 积分。三次调用加起来 7 积分,拿到 4 条推文。
第 4 步:导出某人的全部推文到一个 CSV
从今年往回循环每一年,每条推文写成一行。用 python all_tweets.py XDevelopers 运行:
FIELDS = ["id", "createdAt", "text", "likeCount", "retweetCount",
"replyCount", "viewCount", "url"]
user = sys.argv[1]
with open(f"{user}.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=FIELDS, extrasaction="ignore")
writer.writeheader()
for year in range(2026, 2005, -1): # 一直到 2006 年,X 的第一年
for post in year_of_posts(user, year):
writer.writerow(post)
file.flush() # 中途停了,已完成的年份也都保存着
把三段 Python 按顺序放进一个文件,就是完整的脚本。
账号注册之前的年份会返回空,每年扣 1 积分。extrasaction="ignore" 只保留你列出的列,其余丢掉。
搜索结果包括原创推文和回复。不要回复,就在请求体里加 "onlyOriginal": True。
截至 2026 年 10 月,搜索结果默认也包括转推。转推的 likeCount 是 0,真实计数在 retweetedPost 里。只要原创推文,就在 query 里加 -filter:nativeretweets。更多筛选写法见推特高级搜索语法大全。
推特 API 能导出一个用户的全部推文吗?
能,但不是通过时间线接口。X 的文档写明,用户推文时间线最多返回最近 3,200 条。很多老脚本卡在 3,200 条,原因就在这里。
X 的全量搜索没有这个上限。X 的搜索文档说,它能回溯到 2006 年 3 月,每次请求最多 500 条。
它向 X 的按量计费账号开放。截至 2026 年 10 月,每读一条推文 $0.005,所以 3,200 条要 $16。
用 Tweepy 调用官方 API 的代码,见用 Python 获取推特数据。
下载 3,200 条推文要多少钱?
在 Weir 上,一次搜索扣 1 积分,每条推文再扣 1 积分。满满一页 20 条是 21 积分。
3,200 条推文要翻 160 页,每年再加一次收尾调用,合计大约 3,400 积分。
这在 Weir 每月 5,000 免费积分之内,所以第一个这样的账号不花钱。更大的任务,用推特 API 费用计算器先估一下。
时间也要算进去:
免费档每分钟 30 个请求,一次搜索算 2 个。碰到上限时,脚本里处理 429 的那段会自动等待。
不写代码:让 AI 智能体帮你导出
在 Claude、Cherry Studio 或 Trae 里接上 Weir 之后,粘贴这段:
用 Weir 的 search_x 工具,查 @XDevelopers 在 2026-10-01 到 2026-10-20 之间发的原创推文,limit 设为 20,一直翻页到 nextCursor 为 null。整理成表格:日期、点赞数、链接、推文内容的中文概要。
智能体会自己翻页,把结果整理成表格。少量推文这样最快,几千条以上还是用上面的脚本。接法见推特 MCP 服务器。
导出失败怎么办?
- 返回
402,脚本停了:积分用完了,重试没用。等下个月的免费额度,或者买一个套餐。 - 翻到第二页返回
400:请求体变了。不带 cursor,把那一年从头再跑一遍。 - 脚本跑到一半停了:把文件里最后一个
id放进推文 ID 转日期,从那一年重新开始。 - Excel 把 ID 显示成 2.0E+18:那只是显示方式。导入时把
id列设为文本。
受保护的账号无法导出,它们的推文永远不会出现在搜索里。
X 的服务条款禁止未经 X 书面许可的抓取。Weir 只读公开数据,不能发推。你的项目是否符合适用的条款,需要你自己判断,本文不构成法律建议。
什么时候不适合用 Weir
- 是你自己的账号:数据存档免费、完整,连私信都有。
- 只看批量价格:TwitterAPI.io 标价每千条 $0.15,低于我们的付费价,还能发推和推送实时数据流。
- 你需要和 X 签合同:用官方 API 的全量搜索。
常见问题
能免费导出一个人的全部推文吗?
自己的账号可以,在 X 设置里申请数据存档。公开账号的话,Weir 每月 5,000 免费积分大约够导出 4,700 条推文。X 官方 API 读推文没有免费档。
不是我的推特账号,也能批量下载推文吗?
账号公开就可以。用 fromUsers 一年一年地搜,每一年都翻到底。受保护账号的推文只有被批准的关注者能看,任何 API 都拿不到。
为什么我的推特爬虫只能抓到 3,200 条?
因为它读的是用户时间线,X 的文档把它限制在最近 3,200 条。按日期搜索能走得更远:我们一直查到了 @jack 在 2006 年 3 月的第一条推文。
用 Python 怎么把推文导出成 CSV?
用 csv.DictWriter,加上 extrasaction="ignore" 和 encoding="utf-8"。每条推文写一行,每年结束时 flush 一次。第 4 步的脚本就是这么做的。
参考来源
以下均为英文页面。
- X 帮助中心,下载 X 数据存档(2026 年 10 月 21 日核对):https://help.x.com/en/managing-your-account/how-to-download-your-x-archive
- X API 时间线介绍,“Up to 3,200 most recent Posts”(2026 年 10 月 26 日核对):https://docs.x.com/x-api/posts/timelines/introduction
- X API 搜索介绍,全量存档回溯到 2006 年 3 月(2026 年 10 月 26 日核对):https://docs.x.com/x-api/posts/search/introduction
- X API 按量计费价格(2026 年 10 月 26 日核对):https://docs.x.com/x-api/getting-started/pricing
- X 服务条款(2026 年 10 月 21 日核对):https://x.com/en/tos
- TwitterAPI.io 价格(2026 年 10 月 26 日核对):https://twitterapi.io/pricing
- TwitterAPI.io 发推接口(2026 年 10 月 21 日核对):https://docs.twitterapi.io/api-reference/endpoint/create_tweet_v2
- TwitterAPI.io 实时流规则(2026 年 10 月 21 日核对):https://docs.twitterapi.io/api-reference/endpoint/add_webhook_rule
- Weir 搜索接口参考:https://docs.weirapp.io/reference/x/searchX
- Weir 计费与档位:https://docs.weirapp.io/billing
- Weir 分页:https://docs.weirapp.io/pagination
- 我们用 Weir 搜索 @jack 2006 年推文的调用,2026 年 10 月 21 日