2026 年怎么爬取 Twitter(X):哪些行得通,哪些会失效
2026 年爬取 Twitter(X)有五种办法:自动化操作未登录的浏览器、在 X 账号上运行开源库、付费使用托管的爬取工具、调用每 1,000 条帖子 $5.00 的官方 X API,或者调用 Twitter/X 数据 API。
简短回答: 未登录时,x.com 只显示单条帖子和账号主页最前面的几条帖子,而且 X 在 12 个月里把内部搜索的查询 ID(query ID)改了 37 次,爬取代码因此失效。想采集帖子又不拿 X 账号冒险,用 Sorsa API:POST /search-tweets 每次请求返回约 20 条帖子,每 1,000 条 $0.07 起,另有 100 次免费请求,无需绑卡。
- 接口
POST /search-tweets- 每页条数
- 每次请求约 20 条帖子
- 价格
- 每 1,000 条 $0.07 起
#2026 年还能爬取 Twitter 吗?
能,但不登录账号的话,能碰到的 X 内容很少。2026 年 11 月 2 日,我们在桌面浏览器里以未登录状态打开 x.com,记下了每类页面返回的内容。
| x.com 上的页面 | 返回的内容 |
|---|---|
| 单条帖子 | 正文、计数和最前面的几条回复,都已包含在 HTML 里 |
| 账号主页 | 页头和前 9 条帖子,之后是登录墙 |
| 搜索结果 | 跳转到登录页 |
| 粉丝或关注列表 | 跳转到登录页 |
| 在服务器上用默认配置的无头浏览器打开单条帖子 | 第一次请求就返回 HTTP 403 |
单条帖子
- 返回的内容
- 正文、计数和最前面的几条回复,都已包含在 HTML 里
账号主页
- 返回的内容
- 页头和前 9 条帖子,之后是登录墙
搜索结果
- 返回的内容
- 跳转到登录页
粉丝或关注列表
- 返回的内容
- 跳转到登录页
在服务器上用默认配置的无头浏览器打开单条帖子
- 返回的内容
- 第一次请求就返回 HTTP 403
要爬取其余内容,就得用一个已登录的 X 账号,而风险都压在这个账号上。这样一来,获取 X 公开数据有五种办法:
-
用 Playwright 或 Puppeteer 自动化操作未登录的浏览器:只能拿到单条帖子和主页顶部,仅此而已。
-
在 X 账号上运行 twscrape 或 Scweet 这类开源库:能搜索、读时间线和粉丝,但账号池里的每个账号都有被锁定的风险。
-
托管的爬取工具:替你完成采集,按结果数计费。
-
官方 X API:先要开发者账号和应用,再从预付余额里按每 1,000 条帖子 $5.00 扣费。
-
Twitter/X 数据 API:用一个密钥就以 JSON 返回公开帖子,不会让任何 X 账号陷入风险。
下面逐一介绍这些办法。第五种放在最前面,因为它步骤最少;如果你想保存单个账号的全部帖子,请看下载用户的全部推文。
#不用爬虫、不用 X 账号获取 X 数据
要采集公开帖子、用户资料和粉丝,用 Sorsa API,一款 Twitter(X)API 与爬虫:你的代码在 ApiKey 请求头里带上一个密钥就能拿到 JSON,搜索每次请求返回约 20 条结果,每 1,000 条 $0.07 起;按 ID 查询推文每次请求 100 条,每 1,000 条 $0.014 起。
不用驱动浏览器,不用追踪查询 ID,也不用登录 X。Sorsa API 从不索要你的 X 登录信息或 Cookie,因此你的任何账号都不会有风险。所有套餐都是每秒 20 次请求,搜索可回溯到 2006 年,并支持 X 高级搜索的各种操作符。
-
获取密钥。注册后,在控制台复制你的 API 密钥。新账号送 100 次免费请求,无需绑卡。
-
**搜索帖子。**把任意 X 搜索语句发给
POST /search-tweets(在新标签页打开);from:、since:、lang:、带引号的短语和话题标签都能用。终端 curl -X POST "https://api.sorsa.io/v3/search-tweets" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "\"open data\" lang:en since:2026-10-01", "order": "latest"}'响应200 OK { "tweets": [ { "id": "1984210773912846356", "full_text": "New city data sets today: bus delays, tree cover, permits.", "created_at": "2026-10-30T14:05:11Z", "lang": "en", "likes_count": 48, "retweet_count": 9, "reply_count": 4, "quote_count": 1, "view_count": 5210, "user": { "id": "1590385166022184961", "username": "opendata_weekly_news", "display_name": "Open Data Weekly", "followers_count": 12400, "verified": false } } ], "next_cursor": "DAADDAABCgABG4dR6Xr2YQo" } -
**沿着 cursor 翻页。**每个响应都带有
next_cursor,指向下一页结果;把它放回请求体再发一次,直到返回为空。import os import requests URL = "https://api.sorsa.io/v3/search-tweets" KEY = os.environ.get("SORSA_API_KEY", "YOUR_API_KEY") def search(query, max_pages=50): body = {"query": query, "order": "latest"} for _ in range(max_pages): r = requests.post(URL, json=body, headers={"ApiKey": KEY}, timeout=30) r.raise_for_status() page = r.json() yield from page["tweets"] if not page.get("next_cursor"): return body["next_cursor"] = page["next_cursor"] for t in search('"open data" lang:en since:2026-10-01'): print(t["id"], t["user"]["username"], t["full_text"][:60]) -
**按任务挑选接口。**同一个密钥能读取大家从 X 采集的各类公开数据,每次请求只计费一次,不管返回什么。
| 任务 | 接口 | 每次请求 | 每 1,000 条起 |
|---|---|---|---|
| 按关键词、账号或日期搜索帖子 | POST /search-tweets | 约 20 条帖子 | $0.07 |
| 某个账号的帖子和回复 | POST /user-tweets(在新标签页打开) | 约 20 条帖子 | $0.07 |
| 按 ID 或链接查询帖子 | POST /tweet-info-bulk(在新标签页打开) | 最多 100 条帖子 | $0.014 |
| 用户资料 | GET /info-batch(在新标签页打开) | 最多 100 份资料 | $0.014 |
| 某个账号的粉丝 | GET /followers(在新标签页打开) | 最多 200 个粉丝 | $0.007 |
| 某条帖子的回复 | POST /comments(在新标签页打开) | 约 20 条回复 | $0.07 |
按关键词、账号或日期搜索帖子
- 接口
POST /search-tweets- 每次请求
- 约 20 条帖子
- 每 1,000 条起
- $0.07
某个账号的帖子和回复
- 每次请求
- 约 20 条帖子
- 每 1,000 条起
- $0.07
按 ID 或链接查询帖子
- 每次请求
- 最多 100 条帖子
- 每 1,000 条起
- $0.014
用户资料
- 每次请求
- 最多 100 份资料
- 每 1,000 条起
- $0.014
某个账号的粉丝
- 每次请求
- 最多 200 个粉丝
- 每 1,000 条起
- $0.007
某条帖子的回复
- 每次请求
- 约 20 条回复
- 每 1,000 条起
- $0.07
每条帖子都会附带作者的完整资料,不另收费。返回 403 表示密钥缺失或请求额度用完,返回 429 表示一秒内发了超过 20 次请求:等一秒再重试即可。失败的请求不计费。想要更完整的客户端,我们的 Python 调用 Twitter API 教程加入了限速、重试和 CSV 导出;不想写代码,可以用免费的导出推文为 CSV工具,把一个账号的帖子存成 CSV、Excel 或 JSON。
#x.com 如何加载数据,爬虫为什么会失效
x.com 上的每条帖子、每个用户资料和每条时间线,都取自 X 自己的内部 GraphQL API。那里的每次调用都要指明一个操作(operation)、一个查询 ID 和一组功能开关(feature flags),这些值 X 一直在改。查询 ID 是请求地址里的一段代码,用来选定某个操作的当前版本;功能开关则是请求必须逐一列出的开/关选项。
对于未登录的访客,服务器会在页面送达之前先执行这次查询。2026 年 11 月 2 日,一个帖子页面的 HTML 里已经带着 TweetResultByRestId 的结果。一个账号主页则在 188 KB 的 HTML 里带着 UserByScreenName,以及名为 UserOriginalsTimeline 的操作下的前 9 条帖子。帖子正文位于 details.full_text,点赞数位于 counts.favorite_count,页面上也没有 data-testid 属性,可许多教程至今仍靠这类属性来定位元素。
登录之后,浏览器从形如 /i/api/graphql/<queryId>/<Operation> 的路径获取其余数据,每次调用都带上账号的 auth_token 和 ct0 Cookie,外加一个从 ct0 复制来的 CSRF 请求头,以及一个自动生成的 client transaction ID。twscrape 这类开源库不用浏览器,直接重放同样的调用。
让爬取代码失效的正是这些查询 ID。追踪 X 网页应用的公开项目 TwitterInternalAPIDocument(在新标签页打开) 会在 X 的 GraphQL 定义每次变化时保存一份。在它从 2025 年 11 月 6 日到 2026 年 10 月 31 日的 112 个快照里,搜索背后的操作 SearchTimeline 的查询 ID 一共变了 37 次。
这相当于大约每 10 天变一次,仅 2026 年 10 月就变了四次。同一年里,UserTweets 变了 38 次,TweetResultByRestId 变了 34 次,如今每次搜索调用都要带上 40 个功能开关。把这些值写死的代码会一直失效,直到有人去更新它;twscrape 甚至专门为这种情况准备了一个错误 GqlFeaturesOutdatedError,当 X 要求开启某项该库无法启用的功能时就会抛出。
#用 Playwright 或 Puppeteer 爬取公开帖子
用 Playwright(Python)或 Puppeteer(Node.js)做浏览器自动化,读到的是未登录访客能看到的内容:每次页面加载一条帖子,或者账号主页最前面的几条帖子。
-
**安装驱动。**Python 运行
pip install playwright和playwright install chromium,Node.js 运行npm install puppeteer。 -
**打开可见的浏览器窗口。**在我们的测试中,服务器上默认配置的无头浏览器从 x.com 拿到的是 HTTP 403,同一网络连接下的普通浏览器窗口则能正常打开页面。
-
**读取渲染后的帖子。**页面上没有
data-testid这类钩子,所以要等article元素出现,再取它的文本。from playwright.sync_api import sync_playwright POST = "https://x.com/XDevelopers/status/2019881223666233717" with sync_playwright() as p: browser = p.chromium.launch(headless=False) # headless got HTTP 403 page = browser.new_page() page.goto(POST) post = page.locator("article").first post.wait_for() print(post.inner_text()) browser.close() -
**到登录墙为止。**搜索、粉丝列表以及主页前几条帖子之后的内容都会跳转到登录页,所以这种办法没法再往下翻页。
输出的是人眼看到的那种帖子:名字、用户名、正文、时间,以及缩写成 5.6K 这类标签、不附带任何账号名单的计数,全都挤在一整块文本里,要你自己拆分。这只够处理几条你本可以手动打开的帖子。每多加载一个页面,就多一次被封、遇上页面改版或弹出登录提示的机会,所以需要数据量的项目最终都会转向已登录的开源库或 API。
#在 X 账号上用 Python 开源库爬取 Twitter
twscrape 和 Scweet 这类开源库跳过浏览器,直接用已登录 X 账号的 Cookie 调用 X 的内部 GraphQL API,因此能用搜索、时间线和粉丝列表。
-
**用一个备用 X 账号。**Scweet 的 README(在新标签页打开) 要求使用专用账号,绝不要用你的个人账号,因为 X 可以锁定任何被它标记的账号。
-
**复制它的 Cookie。**在 x.com 登录,打开浏览器的开发者工具,从该网站的 Cookie 里复制
auth_token和ct0。 -
添加账号并搜索。twscrape(在新标签页打开) 把账号和会话保存在一个本地 SQLite 文件里,并返回解析好的帖子。
Python import asyncio from twscrape import API, gather COOKIES = "auth_token=xxx; ct0=yyy" async def main(): api = API() # accounts and sessions go to accounts.db await api.pool.add_account_cookies("spare_account", COOKIES) query = "from:XDevelopers lang:en" posts = await gather(api.search(query, limit=40)) for post in posts: print(post.id, post.user.username, post.rawContent[:60]) asyncio.run(main()) -
**要上量,就加账号和代理。**twscrape 按账号和操作分别跟踪速率限制,把被限流的账号搁置到额度重置,再换用下一个账号。账号时间线最多只能读到约 3,200 条帖子。
须知
auth_tokenCookie 的作用相当于密码:任何人拿到它,在会话结束前都能以该账号的身份登录。别把它写进代码、代码仓库或共享笔记本,也绝不要把个人账号的 Cookie 放进脚本。
2024 年之前的大多数开源库已经不能用了。2026 年 11 月 2 日,仍在维护的两个都需要 X 账号:
| 开源库 | 最近更新 | 状态 |
|---|---|---|
| twscrape | 0.20.1,2026-08-25 | 仍在维护;运行在已登录的 X 账号上 |
| Scweet | 5.8.2,2026-10-22 | 仍在维护;靠 auth_token Cookie 运行 |
| twikit | 2.3.3,2025-02-07 | 20 个月没有发布新版本;160 个未解决的 issue |
| snscrape | 2023-06-22 | Twitter 模块自 2023 年 6 月 30 日起失效(在新标签页打开) |
| Twint | 2023-02-23 | 已在 GitHub 归档 |
twscrape
- 最近更新
- 0.20.1,2026-08-25
- 状态
- 仍在维护;运行在已登录的 X 账号上
Scweet
- 最近更新
- 5.8.2,2026-10-22
- 状态
- 仍在维护;靠
auth_tokenCookie 运行
twikit
- 最近更新
- 2.3.3,2025-02-07
- 状态
- 20 个月没有发布新版本;160 个未解决的 issue
snscrape
- 最近更新
- 2023-06-22
- 状态
- Twitter 模块自 2023 年 6 月 30 日起失效(在新标签页打开)
Twint
- 最近更新
- 2023-02-23
- 状态
- 已在 GitHub 归档
托管的爬取工具
免代码的爬取服务把采集藏在一张表单后面替你完成,按结果数计费,被封和失效的麻烦由它们承担,但它们的修复总是落后于 X 的改动。推特爬虫工具对比逐个工具做了介绍。
#通过官方 X API 读取帖子
官方 X API 把公开帖子当作预付额度的读取来出售:每条帖子 $0.005,每个用户或粉丝 $0.010,按量付费每月最多读取 300 万条帖子,详见其价格页面(在新标签页打开)。
从 2026 年 11 月 22 日起,X 还会按同样的费率,对随帖子一起返回的作者资料和媒体计费(见 X 的通知(在新标签页打开)),所以连作者一起读取一条帖子要花 $0.015。
-
**创建开发者应用。**用一个 X 账号登录 console.x.com,接受开发者协议,创建应用并复制它的 Bearer token。我们的如何获取 Twitter API 密钥指南会一步步带你点过去。
-
**购买额度。**每次读取都从预付余额里扣费,余额用完请求就会失败。
-
**搜索近期帖子。**近期搜索覆盖最近 7 天,每次请求最多 100 条帖子;回溯到 2006 年的全量归档搜索只对按量付费账号开放。
终端 curl -G "https://api.x.com/2/tweets/search/recent" \ -H "Authorization: Bearer $X_BEARER_TOKEN" \ --data-urlencode "query=from:XDevelopers -is:retweet" \ --data-urlencode "max_results=100"
这是 X 自己的路线,也是这里唯一还能发帖的办法。每 1,000 条帖子 $5.00,读取一百万条搜索结果要 $5,000,300 万条的上限则会让当月的读取到此为止;我们的 X API 价格拆解列出了每一项费率。
#爬取 Twitter 每 1,000 条帖子要花多少钱
每 1,000 条帖子,官方 X API 收费 $5.00,Sorsa API 搜索 $0.07 起、按 ID 查询 $0.014 起;爬取类办法不收费,花的是 X 账号、代理和修复的工时。
官方 X API
$5,000
采集 100 万 条帖子
每条帖子 $0.005
Sorsa API
$70 起
采集 100 万 条帖子
搜索每 1,000 条 $0.07 起
如果每天都要采集帖子,用 Sorsa API:一百万条搜索结果 $70 起,而官方 X API 要 $5,000,速度是每秒 20 次请求,约合每秒 400 条结果,还没有 X 账号会丢。
区分这几种办法有四个标准:每 1,000 条帖子的价格、X 账号是否有风险、能触及多少 X 内容,以及什么会让它失效。
| 办法 | 每 1,000 条帖子 | X 账号是否有风险 | 能触及 | 失效的时机 |
|---|---|---|---|---|
| Sorsa API | 搜索 $0.07 起,按 ID $0.014 起 | 无 | 回溯到 2006 年的搜索、时间线、按 ID 查帖子、用户资料、粉丝、回复 | 响应结构稳定,你的代码保持不变 |
| 官方 X API | $5.00,带作者最高 $15.00 | 开发者账号 | 搜索、时间线、查询;每月 300 万条帖子 | X 改价格或规则 |
| 在 X 账号上运行的开源库 | 不收费;花账号和代理 | 账号池里的每个账号 | 搜索、时间线、粉丝 | 查询 ID 或功能开关一变 |
| 未登录的浏览器 | 不收费 | 无 | 一条帖子、主页最前面的几条帖子 | 页面改版或被封 |
| 托管的爬取工具 | 由各工具自行定价 | 取决于工具 | 它的浏览器或账号能触及的内容 | 工具的修复落后于 X |
Sorsa API
- 每 1,000 条帖子
- 搜索 $0.07 起,按 ID $0.014 起
- X 账号是否有风险
- 无
- 能触及
- 回溯到 2006 年的搜索、时间线、按 ID 查帖子、用户资料、粉丝、回复
- 失效的时机
- 响应结构稳定,你的代码保持不变
官方 X API
- 每 1,000 条帖子
- $5.00,带作者最高 $15.00
- X 账号是否有风险
- 开发者账号
- 能触及
- 搜索、时间线、查询;每月 300 万条帖子
- 失效的时机
- X 改价格或规则
在 X 账号上运行的开源库
- 每 1,000 条帖子
- 不收费;花账号和代理
- X 账号是否有风险
- 账号池里的每个账号
- 能触及
- 搜索、时间线、粉丝
- 失效的时机
- 查询 ID 或功能开关一变
未登录的浏览器
- 每 1,000 条帖子
- 不收费
- X 账号是否有风险
- 无
- 能触及
- 一条帖子、主页最前面的几条帖子
- 失效的时机
- 页面改版或被封
托管的爬取工具
- 每 1,000 条帖子
- 由各工具自行定价
- X 账号是否有风险
- 取决于工具
- 能触及
- 它的浏览器或账号能触及的内容
- 失效的时机
- 工具的修复落后于 X
五种办法里,只有 Sorsa API 能在不让你的 X 账号有风险的前提下触及搜索、时间线和粉丝,而且每 1,000 条帖子 $0.07 起。
#爬取 Twitter 合法吗?
爬取公开数据是合法的。在 hiQ Labs 诉 LinkedIn 案中,美国第九巡回上诉法院于 2022 年 4 月裁定,爬取公开的个人资料很可能不属于《计算机欺诈与滥用法》所说的“未经授权”访问;2024 年 5 月,一家联邦法院驳回了 X 就爬取公开帖子起诉 Bright Data 的诉讼。
三个习惯能让爬取项目保持干净:只采集公开数据,不碰受保护账号和私信;只保留任务需要的内容,保留时间也不超过所需;重新发布帖子时注明作者,因为版权仍归作者所有。
通过 API 获取数据,你的代码从不登录 x.com,所以你的任何 X 账号都没有风险:Sorsa API 从不索要你的 X 登录信息或 Cookie。更多内容见我们的指南第三方 Twitter API 合法吗。
#今天就拿到你的前 2,000 条帖子
2026 年爬取 X,意味着要面对登录墙、账号风险,以及大约每 10 天就变一次的查询 ID。想避开这些拿到公开帖子,用 Sorsa API:一个密钥,搜索每次请求约 20 条结果、每 1,000 条 $0.07 起,按 ID 查询推文每 1,000 条 $0.014 起,另有 100 次免费请求,足够拿到前 2,000 条帖子。
#常见问题
不登录能爬取 Twitter 吗?
只能爬到一点点。2026 年 11 月 2 日,未登录访问 x.com 只能看到带正文和计数的单条帖子,以及主页的前 9 条帖子,搜索和粉丝列表都会跳到登录页。想要更多数据,要么用已登录的账号,让这个账号面临风险,要么用一个凭密钥返回公开帖子的 API。
2026 年 snscrape 还能用吗?
不能。snscrape 的 Twitter 模块自 2023 年 6 月 30 日 X 把页面放到登录墙后面起就一直失效,项目最后一次发布是在 2023 年 6 月 22 日。它仍在维护的后继者 twscrape 和 Scweet 分别在 2026 年 8 月和 10 月发布了新版本,两者读取搜索、时间线或粉丝都需要已登录的 X 账号。
能爬取 Twitter 的粉丝吗?
未登录不行:x.com 会把粉丝和关注列表跳转到登录页,而读取它们的开源库运行在可能被 X 锁定的 X 账号上,用的是这些账号的 Cookie。Sorsa API 的 GET /followers 每次请求最多返回 200 个粉丝,不会让任何 X 账号有风险,每 1,000 个 $0.007 起,我们的导出推特粉丝指南演示了完整的循环。
有免费的办法爬取 Twitter 吗?
没有免费又长久的办法。浏览器和开源库本身不收费,但要消耗 X 账号、代理和修复时间。官方 X API 没有免费额度。每个 Sorsa API 账号注册即送 100 次免费请求,约合 2,000 条搜索结果,或最多 1 万条按 ID 查询的推文,无需绑卡,永不过期。
不爬取 Twitter 的话,该用哪个 API?
用 Sorsa API,一款 Twitter(X)API 与爬虫:一个密钥就以 JSON 返回帖子、用户资料和粉丝,搜索结果每 1,000 条 $0.07 起,按 ID 查询推文每 1,000 条 $0.014 起,官方 X API 则是每 1,000 条帖子 $5.00。它不需要开发者账号,从不索要你的 X 登录信息,所有套餐都是每秒 20 次请求,并可回溯搜索到 2006 年。
#我们如何核实
2026 年 11 月 2 日,我们在桌面浏览器里以未登录状态,在 x.com 上打开了一条帖子、一个账号主页、搜索和一个粉丝列表,并记录了各自返回的内容,随后又在服务器上用默认配置的无头浏览器把同一条帖子和同一个主页各加载了一次。我们拉取了 TwitterInternalAPIDocument 追踪项目从 2025 年 11 月 6 日到 2026 年 10 月 31 日的全部 112 个快照,统计了每个操作的查询 ID 变更次数。我们阅读了 X 的 API 价格和搜索文档,以及 twscrape、Scweet、twikit 和 snscrape 的 README 与发布页面。这里的每个 Sorsa API 接口和字段都与线上 API 参考一致;官方 X API 的示例我们没有运行过。
来源
- X API pricing(在新标签页打开)
- X API search introduction(在新标签页打开)
- X Developer Community: PPU expansions update, October 23, 2026(在新标签页打开)
- TwitterInternalAPIDocument, the query ID tracker(在新标签页打开)
- twscrape README(在新标签页打开)
- Scweet README(在新标签页打开)
- snscrape issue 996: All Twitter scrapes are failing(在新标签页打开)
- Nitter README(在新标签页打开)
- Sorsa API reference: Search Tweets(在新标签页打开)