# weibo api python：取微博数据三条路实测

> 用 Python 取微博数据三条路：开放平台每授权用户每天 100 次，开源脚本靠 Cookie，按次付费 API 跑完 7 步链一条 $0.0051。

- Canonical page: https://everyinfra.com/blog/weibo-api-python
- Published: 2026-11-12T01:08:00+08:00 · Fact-checked: 2026-11-12T00:40:00+08:00

我们在 2026 年 11 月 11 日 00:14–00:37（新加坡时间）用 Python 的 requests 跑了 4 次「热搜 → 话题搜索 → 帖子搜索 → 帖子详情 → 评论 → 评论回复 → 转发」7 步完整链，每次的请求最终都拿到了结果或者被如实退费，一条完整链扣费 $0.005142，耗时 19.37–33.94 秒。最值得写下来的发现不是价格，而是样本：四次实测里，按「评论最多」挑出来的那条帖子，正文里都没有我们搜的关键词；同一个词「流感」在 00:14 只回 12 条、跨度 7 天，到 00:46 回满 50 条、全部是最近 20 分钟发的。另外两条路我们按一手材料逐条核对：微博开放平台写明一个应用内单个授权用户每天只能请求 100 次，评论接口只返回授权用户自己的评论，并且禁止第三方在服务器端存储用户数据；GitHub 上常见的 weibo scraper 项目，自己在 README 里写明关键词搜索和转发要 Cookie，近 60 天的 issue 里还在报返回非 JSON 和结果不超过 500 条。

> **本文要点**
>
> - 4 次 7 步完整链共 28 个请求，扣费和目录单价逐条一致；空结果和 503 失败一律不扣费，一条完整链 $0.005142。
> - 每千条成本按真实返回算：热搜约 $0.011、帖子搜索约 $0.039、评论约 $0.043、转发约 $0.065、用户主页约 $0.081。
> - 按评论数挑帖子，4 次全部挑到正文不含关键词的帖子；先按正文过滤再排序，是这条链最该加的一行代码。
> - 微博开放平台：单授权用户每天 100 次、单 IP 每小时 15,000 次，禁止第三方服务器端存储用户数据；要做第三方数据分析业务，只能走商业数据 API 并签协议。
> - 热搜榜按公式计算、每分钟更新，做公共卫生时间线时只能当「平台此刻展示了什么」的记录，不能当「公众关心什么」的测量。

官方接口和开源脚本两部分只引用 open.weibo.com 原文、项目 README 和公开 issue；按次付费接口这部分，每个数字都来自我们自己的真实调用，脚本和原始返回都保存着，可以逐条复算。

![示意插图：七个半透明托盘斜着排成一列，用细箭头相连。第一个托盘是青绿色，上面是一列带火苗的榜单条，代表热搜；后面依次是一个井号话题标签、一只压在帖子上的放大镜、一张帖子卡片、一列评论气泡、一条评论分叉出几条小气泡，最后一个托盘上是一个循环箭头，代表转发。](https://everyinfra.com/articles/weibo-api-python/img-explain.webp)

本文完整链的七步，从热搜榜一路走到转发。

## 先说结论：三条路分别适合谁

三条路的适用人群几乎不重叠。下面这张表把每条路要准备的东西、能拿到的范围和主要风险放在一起，表里每一项在后文都有出处或实测记录。

| 维度 | 微博开放平台官方接口 | GitHub 开源脚本 | 按次付费数据接口（本文实测 EveryInfra） |
| --- | --- | --- | --- |
| 主体要求 | 建应用、审核；weibo-cli 要在微博 App 里刷脸做开发者认证 | 无 | 无，注册拿 API Key |
| 能读谁的数据 | 以授权用户为中心：评论接口只返回授权用户的评论，用户时间线只能查当前授权用户 | 公开页面能看到的，取决于有没有 Cookie | 公开的热搜、话题、帖子、评论、回复、转发、用户主页 |
| 关键词搜索 | 话题搜索是高级接口，只回最新 200 条；按条计费的商业数据 API 要联系商务 | README 写明关键词搜索要 Cookie，网页最多显示 50 页 | `weibo/search`、`weibo/topic_search` |
| 频次 | 单授权用户每天 100 次，单 IP 每小时 15,000 次 | 自己控制间隔，项目默认 8–15 秒一次 | 接口限速，429 不扣费 |
| 存储 | 禁止第三方服务器端存储用户数据 | 自己决定，后果自负 | 按你的用途和适用法律处理 |
| 费用 | 普通接口不收费；weibo-cli 积分包 ¥69 起；商业数据 API 无公开价 | 代码免费，成本在维护时间和账号 | 本文一条 7 步完整链 $0.005142 |

我们的判断是：如果你做的是自家微博账号的运营工具，要发帖、回评论、在应用里展示授权用户自己的数据，开放平台是唯一正当的选择，它带写权限，也最稳定。如果你是学生，要给一篇论文抓一个公开账号几百条微博，开源脚本足够，但要接受 Cookie 三个月左右就过期、随时可能被限制访问。如果你要按话题和热搜持续采集别人的公开内容，做新闻、舆情或者公共服务研究，又不想维护 Cookie，按次付费接口是投入最少的一条路。后面每一节分别给出依据。

## 第一条路：微博开放平台官方接口

很多教程把「微博 API」写成一个输入关键词就能查全站微博的接口，这和 open.weibo.com 上的文档不符。开放平台的大多数读接口都以 OAuth2 授权用户为中心：你的应用先让一个微博用户登录授权，拿到 access_token，然后读的是这个用户能看到、或者这个用户自己产生的数据。官方的[授权接口文档](https://open.weibo.com/wiki/Oauth2/access_token)在示例里给出的 access_token 有效期是 7200 秒，也就是两小时，过期要重新授权。

### 现在还能申请什么

我们逐页打开了几个最常被问到的接口。[评论列表接口 2/comments/show](https://open.weibo.com/wiki/2/comments/show) 的说明里写着只返回授权用户的评论，每页默认 50 条；也就是说，你拿不到一条热门微博下面所有陌生人的评论。[用户时间线接口 2/statuses/user_timeline](https://open.weibo.com/wiki/2/statuses/user_timeline) 要求 uid 必须是当前授权用户，最多只返回 5 条，使用官方 SDK 时是 10 条。[话题搜索接口 2/search/topics](https://open.weibo.com/wiki/2/search/topics) 属于高级接口，只搜带话题的微博，只返回最新的 200 条结果，每页最多 50 条。还在开放的普通接口里，[公共时间线 2/statuses/public_timeline](https://open.weibo.com/wiki/2/statuses/public_timeline) 返回的是平台挑出的最新公开微博，不能按关键词筛选。

高级接口要单独申请。[高级接口申请页](https://open.weibo.com/wiki/%E9%AB%98%E7%BA%A7%E6%8E%A5%E5%8F%A3%E7%94%B3%E8%AF%B7)写明，应用要先通过审核，提交申请后 3 个工作日内处理，而且页面上注明部分旧接口已经不再受理。我们没有替真实应用提交申请，所以审核能不能过、要多久，这里只引原文，不下结论。

### 频次和存储：每天 100 次，不能存到服务器

开放平台的[接口访问频次权限](https://open.weibo.com/wiki/%E6%8E%A5%E5%8F%A3%E8%AE%BF%E9%97%AE%E9%A2%91%E6%AC%A1%E6%9D%83%E9%99%90)页面最后更新于 2025 年 5 月 15 日，给出三个例子：一个应用内单个授权用户每天累计只能请求开放接口 100 次，一个 IP 每小时只能请求 15,000 次，发微博接口单授权用户每小时只能请求 30 次。同一页还写了两句对数据研究影响更大的话：平台反对在用户非主动触发的情况下，用服务器上的机器人程序抓取用户数据；开放平台禁止第三方在服务器端存储用户数据，缓存只能放在客户端。页面建议的刷新频率是 3–5 分钟一次。如果开放接口不够用，这一页让开发者去联系商业开放平台。

![截图：微博开放平台「接口访问频次权限」页。青绿色方框标出三行原文：一个应用内单授权用户每天累计只能请求微博开放接口 100 次；一个 IP 地址每小时只能请求 15000 次；发微博接口单授权用户每小时只能请求 30 次。第二个方框标出：微博开放平台禁止第三方服务器端存储用户数据，所以缓存只能放在客户端，不能上传到自己的服务器端。](https://everyinfra.com/articles/weibo-api-python/img-doc-weibo-ratelimit.webp)

开放平台的频次和存储限制，2026 年 11 月 11 日截取。 [微博开放平台「接口访问频次权限」](https://open.weibo.com/wiki/%E6%8E%A5%E5%8F%A3%E8%AE%BF%E9%97%AE%E9%A2%91%E6%AC%A1%E6%9D%83%E9%99%90)

[开发者协议](https://open.weibo.com/wiki/%E5%BC%80%E5%8F%91%E8%80%85%E5%8D%8F%E8%AE%AE)把这些限制写得更细。第 2.7.7 条要求通过开放平台取得的数据只能用于接入的应用本身；第 2.7.8 条写明，以为第三方收集、分析数据为业务的开发者，只能使用微博商业数据 API，并要签《商业数据服务合作协议》；第 2.5.15 条要求停止服务时删除全部数据；还有一条要求不得以政府舆情监测为由索取数据，除非能提供委托函原件。对一个做舆情或者行业研究的团队来说，这几条意味着：用普通开放接口做研究，从协议上就站不住。

### 商业数据 API：按条计费，没有公开价

[微博商业数据 API](https://openapi.sc.weibo.com/) 的首页列出三种计费方式：按条计费的数据额度（关键词、用户、签到等内容，包括原创、转发和评论），按查询次数计费，以及按权限计费；页面给的联系方式是一个商务邮箱。我们没有找到公开的价目表，也没有以客户身份去询价，所以本文不比较它和其他路的价格。能确定的是，它面向的是签了协议的企业客户，门槛在合同而不在技术。

### weibo-cli：2026 年的新入口

2026 年开放平台多了一个命令行工具。[weibo-cli 使用手册](https://open.weibo.com/cli/quickstart)写明：安装要 Node 18 以上，用 OAuth 登录；开发者认证要在微博 App 里刷脸；每个账号可以领一次 7 天免费体验，体验期只对白名单开放，读取类接口通常每个 5 次、写入类 3 次；正式使用买积分包，¥69 起，有效期 365 天；写入类 POST 接口每小时 60 次；用 AI 生成的内容发布时要声明。npm 上的 [@weibo-ai/weibo-cli](https://www.npmjs.com/package/@weibo-ai/weibo-cli) 包创建于 2026 年 5 月 25 日，最新版本 0.9.8 发布于 2026 年 9 月 22 日。新浪财经转载的 IT之家报道说它在 6 月 22 日上线，有 70 多个接口、支持 MCP。

![截图：weibo-cli 使用手册页。青绿色方框标出三处原文：免费体验期读取类接口通常每个 5 次、写入类 3 次；正式积分包 69 元起、有效期 365 天；写入类 POST 接口每小时 60 次。左侧目录里能看到 Skill 广场和 MCP 两个入口。](https://everyinfra.com/articles/weibo-api-python/img-doc-weibo-cli.webp)

weibo-cli 的体验额度和积分包价格，2026 年 11 月 11 日截取。 [微博开放平台 weibo-cli 使用手册](https://open.weibo.com/cli/quickstart)

weibo-cli 解决的是「授权用户自己用 AI 助手操作自己的微博」这件事，体验额度每个接口 5 次，显然不是给批量采集设计的。对 Python 用户来说，它也不是一个 Python 包：你可以在 Python 里用 subprocess 调它，但鉴权、刷脸认证和积分都绕不开。

| 你想做的事 | 开放平台对应接口 | 原文写的限制 |
| --- | --- | --- |
| 读一条热门微博下的全部评论 | 2/comments/show | 只返回授权用户的评论；每页默认 50 条 |
| 读某个公开账号的历史微博 | 2/statuses/user_timeline | uid 必须是当前授权用户；最多 5 条（SDK 10 条） |
| 按关键词搜微博 | 2/search/topics（高级） | 只搜话题，只回最新 200 条；要申请 |
| 大批量按关键词取数据 | 商业数据 API | 签协议，按条或按次计费，无公开价 |
| 用 AI 助手操作自己的账号 | weibo-cli | 刷脸认证；体验每接口 5 次；积分包 ¥69 起 |

## 第二条路：GitHub 上的开源脚本（weibo scraper）

搜「weibo scraper github」或者「微博评论爬虫」，排在前面的是几个维护多年的 Python 项目。我们在 2026 年 11 月 11 日 00:23（新加坡时间）用 GitHub 接口现读了它们的星标、最后推送时间和许可证，又逐个读了 README。下表只写 README 和接口返回里有的东西。

| 项目 | 星标 | 最后推送 | 许可证 | README 里关于登录的原文要点 |
| --- | --- | --- | --- | --- |
| [dataabc/weibo-crawler](https://github.com/dataabc/weibo-crawler) | 4,694 | 2026-11-06 | 未声明 | Cookie 可选；不加 Cookie 能拿到大部分微博，关键词搜索和转发必须加 |
| [dataabc/weiboSpider](https://github.com/dataabc/weiboSpider) | 9,750 | 2026-02-04 | 未声明 | 必须 Cookie，Cookie 大约三个月过期 |
| [dataabc/weibo-search](https://github.com/dataabc/weibo-search) | 2,339 | 2026-06-05 | 未声明 | 要 Cookie；一个搜索条件最多显示 50 页 |
| [nghuyong/WeiboSpider](https://github.com/nghuyong/WeiboSpider) | 4,127 | 2026-06-30 | MIT | 替换 weibo.com 的 Cookie 后运行 |
| [NanmiCoder/MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) | 70,803 | 2026-11-09 | 自定义，禁止商用 | 多平台，用浏览器登录 |
| [stay-leave/weibo-public-opinion-analysis](https://github.com/stay-leave/weibo-public-opinion-analysis) | 1,057 | 2026-10-24 | 未声明 | 舆情分析全流程，README 说一天大概能取十万条 |

### Cookie：可选、必须，还是三个月一换

dataabc/weibo-crawler 的 README 把加不加 Cookie 的区别写得很具体：微博数在 2,000 条以下的用户，不加 Cookie 能拿到用户信息和大部分微博；2,000 条以上的用户，不加 Cookie 只能拿到最近 2,000 条里的大部分。它举的例子是一个当时有 1,085 条微博的用户，不加 Cookie 拿到 1,026 条，约 94.56%。同一份 README 写明「关键词搜索必须设定 cookie」，抓转发也要加 Cookie。它的姊妹项目 weiboSpider 则在常见问题里提醒，Cookie 有期限，大约三个月，过期要重新复制。换句话说，凡是涉及搜索和转发这两步，开源路线都要一个登录过的账号。

我们读的六个 README 都没有单独介绍微博的访客系统，只讲 Cookie 怎么从浏览器开发者工具里复制。关于限速，weibo-crawler 的配置说明写着微博抓取的延迟默认 8–15 秒，评论请求间隔默认 1–2 秒；它还提示大批量抓取中途被限制时，可以按已抓条数算出中断页数，从那一页重新开始。

### 近 60 天的 issue：返回非 JSON、结果不超过 500 条

开源项目的真实状态要看 issue。weibo-crawler 的 [#653](https://github.com/dataabc/weibo-crawler/issues/653) 在 2026 年 9 月 26 日提出：用户说之前 5 个月都能正常运行，从 8 月中旬开始，抓完第一页若干条后就报「Expecting value」，也就是服务器返回的已经不是 JSON；按 10、20、40、80、160 秒退避重试都没用，换了新复制的 Cookie 也一样。weibo-search 的 [#590](https://github.com/dataabc/weibo-search/issues/590) 在 2026 年 10 月 13 日提出：所有关键词的结果都不超过 500 条，提问者怀疑是网页只显示 50 页。这和 weibo-search 自己 README 里的说法一致：结果多于 50 页不显示，所以它让你把时间切细，用 FURTHER_THRESHOLD 参数决定什么时候再细分。

另一方面，这些项目也在积极维护。weibo-crawler 在 2026 年 11 月 4 日提交、11 月 5 日合并了 [#658](https://github.com/dataabc/weibo-crawler/pull/658)，重构存档流程、补齐评论和状态核验；11 月 6 日又合并了 #659。MediaCrawler 在 11 月 4 日合并了一个修复（#1000）。维护活跃说明它们还能用，也说明平台那一侧一直在变，脚本要跟着改。

### robots.txt、许可证和两起判例

[weibo.com/robots.txt](https://weibo.com/robots.txt) 对所有未点名的爬虫写的是 Disallow /，只对点名的搜索引擎放行，点名的几家 AI 抓取程序只能访问站点地图和少数几个路径；文件头还声明了 ai-train=no。移动版 [m.weibo.cn/robots.txt](https://m.weibo.cn/robots.txt) 同样对所有爬虫 Disallow /。robots 规则本身不是法律，但在国内已经被法院当成经营者自主决定的一部分：[上海交通大学竞争法律与政策研究中心整理的字节跳动诉微博案](https://cclp.sjtu.edu.cn/Show.aspx?info_lb=672&info_id=5120&flag=648)中，北京市高级人民法院二审驳回了字节跳动的全部诉讼请求，认为微博通过 robots 协议限制特定爬虫属于经营自主权。更早的[新浪微博诉脉脉案](https://sciiip.gdufs.edu.cn/info/1028/1083.htm)（(2016)京73民终588号）确立了取用开放平台数据要同时取得用户授权和平台授权的「三重授权」规则，脉脉赔偿 200 万元。

许可证也要看。上表四个项目没有声明许可证，在 GitHub 的默认规则下，你没有复制和再分发它们代码的授权；MediaCrawler 的 README 写明仅供学习和参考，禁止商业用途。用开源脚本做公司业务之前，这一项和 Cookie 一样要先处理。

## 第三条路：按次付费接口，用 Python 跑完整链

第三条路不用你自己维护 Cookie、签名和页面解析，你的 Python 代码只发 HTTP 请求、收 JSON。我们用 EveryInfra 的 `POST /api/v1/social`，平台填 weibo，换 action 就能调不同能力。开工前先免费读一次目录 `GET /api/v1/social/catalog?platform=weibo`，确认每个能力的参数、单价和 `available`：2026 年 11 月 11 日 00:13（新加坡时间）读到的单价是 `weibo/trending`、`weibo/comments` 每次 $0.000556，`weibo/search`、`weibo/topic_search`、`weibo/post_detail`、`weibo/comment_replies`、`weibo/reposts`、`weibo/user_posts` 每次 $0.000806；`weibo/user_post_search`（在某个用户的微博里搜关键词）当天在目录里是 available=false，本文不用。11 月 12 日复读目录，以上单价没有变化。

![流程动画：七个方框从左到右排开，依次是 weibo/trending（$0.000556，中位 0.73 秒）、weibo/topic_search（$0.000806，3.82 秒）、weibo/search（$0.000806，8.13 秒）、weibo/post_detail（$0.000806，1.31 秒）、weibo/comments（$0.000556，1.41 秒）、weibo/comment_replies（$0.000806，6.70 秒）、weibo/reposts（$0.000806，1.36 秒）。一个青绿色小点从热搜框出发，沿箭头依次走过七步。图下写着：一条完整链 7 个请求，合计 $0.005142，三次完整链中位 25.19 秒。](https://everyinfra.com/articles/weibo-api-python/fig-02-chain-flow.zh.light.svg)

下面这段脚本就是我们最后一版实测用的代码，只依赖 requests。Key 只从环境变量读，脚本把每一步的请求、耗时和完整返回存成 JSON，方便事后核对扣费。和第一版相比，它多了两处改动，原因都来自实测：一是 503 且标着可重试时按 `retry_after` 等待后重发，二是先按正文过滤帖子再按评论数排序，后面两节会解释为什么。

```text
"""Weibo chain: trending -> topic_search -> search -> post_detail -> comments -> comment_replies -> reposts.
pip install requests==2.32.3 ; export EVERYINFRA_API_KEY=... ; python weibo_chain.py 流感 run6"""
import json, os, sys, time
from pathlib import Path
import requests

API = "https://api.everyinfra.com/api/v1/social"
SESSION = requests.Session()
SESSION.headers["Authorization"] = "Bearer " + os.environ["EVERYINFRA_API_KEY"]  # key stays in the environment


def call(action, params, out_dir, name):
    body = {"platform": "weibo", "action": action, "params": params}
    for _ in range(4):
        t0 = time.time()
        r = SESSION.post(API, json=body, timeout=120)
        data = r.json()
        err = data.get("error") or {}
        # 429 (rate limit) and retryable 503 are not charged: wait as told, then send the same request again
        if r.status_code == 429 or (r.status_code == 503 and err.get("retryable")):
            time.sleep(int(err.get("retry_after") or 60))
            continue
        break
    rec = {"started_sgt": time.strftime("%H:%M:%S", time.localtime(t0)), "elapsed_s": round(time.time() - t0, 2),
           "http_status": r.status_code, "request": body, "response": data}
    out_dir.mkdir(parents=True, exist_ok=True)
    (out_dir / f"{name}.json").write_text(json.dumps(rec, ensure_ascii=False, indent=1))
    rows = data.get("results") or []
    print(name, r.status_code, rec["elapsed_s"], len(rows), (data.get("billing") or {}).get("charged_usd"), flush=True)
    return data, rows


def main(keyword, tag):
    out = Path(os.environ.get("OUT_DIR", ".")) / tag
    call("trending", {"limit": 50}, out, "1_trending")
    call("topic_search", {"keyword": keyword}, out, "2_topic_search")
    _, posts = call("search", {"keyword": keyword, "limit": 50}, out, "3_search")
    # keep only rows whose text really contains the keyword, then take the most-commented one
    on_topic = [p for p in posts if keyword in (p.get("text") or "")] or posts
    post = max(on_topic, key=lambda p: (int(p.get("comment_count") or 0), int(p.get("repost_count") or 0)))
    pid = str(post["id"])
    call("post_detail", {"url": pid}, out, "4_post_detail")
    _, comments = call("comments", {"url": pid, "limit": 50}, out, "5_comments")
    if comments:
        top = max(comments, key=lambda c: int(c.get("like_count") or 0))
        call("comment_replies", {"comment_id": str(top["id"]), "limit": 20}, out, "6_comment_replies")
    call("reposts", {"url": pid, "limit": 20}, out, "7_reposts")


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2])
```

七步各做一件事。`weibo/trending` 取热搜榜，每行有排名、标题、分类、热度值和「热」「新」「沸」标签；`weibo/topic_search` 按关键词找话题，每个话题带阅读量和讨论量；`weibo/search` 按关键词搜帖子；`weibo/post_detail` 补全一条帖子的计数和作者信息；`weibo/comments` 取一级评论；`weibo/comment_replies` 取某条评论下的回复；`weibo/reposts` 取转发列表。要追某个作者的历史微博，再加一步 `weibo/user_posts`，它支持 `page_token` 翻页，我们在前四次实测里每次都翻了两页。

## 实测：四个关键词、七次跑链

我们选了四个关键词：「流感」和「流感疫苗」对应公共卫生场景，「双十一」是当天全站最热的消费话题，「智利车厘子」是一个冷门的进口生鲜词，用来看冷热词的差别。前四次用第一版脚本（按评论数直接挑帖子，碰到 429 等 60 秒），后三次用上面的最终版。下表是每次的结果，时间是新加坡时间，除实测七在 11 月 12 日外都是 2026 年 11 月 11 日。

| 实测 | 时间 | 关键词 | 搜索回条数（limit 50） | 选中帖子的评论计数 | 评论 / 回复 / 转发实际返回 | 7 步耗时 | 7 步扣费 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 一 | 00:14–00:19 | 流感 | 12 | 4 | 2 / 0（空，退费）/ 3 | 25.19 秒 | $0.004336 |
| 二 | 00:19–00:21 | 双十一 | 17 | 36 | 24 / 1 / 14 | 33.94 秒 | $0.005142 |
| 三 | 00:31–00:33 | 流感疫苗 | 11 | 6 | 5 / 1 / 20 | 19.37 秒 | $0.005142 |
| 四 | 00:33–00:37 | 智利车厘子 | 50 | 25 | 12 / 0（空，退费）/ 503 两次，不扣费 | 32.87 秒 | $0.003530 |
| 五 | 00:46–00:47 | 流感 | 50 | 未取到（503） | 2 / 1 / 503，不扣费 | — | $0.002724 |
| 六 | 00:47–00:55 | 流感 | 38 | 0 | 0（空，退费）/ 未调 / 503，不扣费 | —（含重试等待约 8 分钟） | $0.002168 |
| 七（11 月 12 日） | 00:15–00:20 | 流感 | 15 | 2 | 1 / 503（容量满，退费）/ 503，不扣费 | —（含重试等待约 5 分钟） | $0.003530 |

表里「7 步扣费」只算链上 7 个请求，不含另外调用的 `weibo/user_posts`（每页 $0.000806，后面分页一节单独算）。每一次扣费都和目录单价一致：热搜和评论 $0.000556，其他 $0.000806；评论回复返回 0 条时 `billing.reason` 是 empty_result_refunded，扣 $0；503 失败时是 request_failed_refunded，同样扣 $0。前四次三条完整链（实测一到三）的总耗时中位是 25.19 秒，没有达到我们动笔前定的 20 秒目标；拖慢的是帖子搜索（3.95–13.95 秒）和评论回复（5.91–7.23 秒）两步，热搜一步始终不到 1 秒。限速等待不算在耗时里：前四次一共碰到 6 次 429，每次等 60 秒后重发成功，429 不扣费。

![堆叠横条图：四次 7 步链每一步的耗时。实测一（流感）合计 25.19 秒，帖子搜索 8.1 秒、评论回复 7.2 秒；实测二（双十一）合计 33.94 秒，帖子搜索 10.4 秒、评论 10.7 秒、回复 5.9 秒；实测三（流感疫苗）合计 19.37 秒，帖子搜索 4.0 秒、回复 6.7 秒；实测四（智利车厘子）合计 32.87 秒，帖子搜索 13.9 秒、回复 7.0 秒。帖子搜索一段用青绿色。](https://everyinfra.com/articles/weibo-api-python/fig-08-latency-by-step-bar.zh.light.svg)

实测五是一次意外，也是一个有用的样本。00:46 我们换上新脚本再跑「流感」，话题搜索、帖子详情和转发三步在 0.13–0.23 秒内直接返回 503，错误体里写着 service temporarily unavailable、retryable 为 true、retry_after 为 60 秒，并注明这是第 1 次（或第 2 次）失败、不扣费，第 3 次失败会说明该检查什么。三步都没扣钱，那次实际花费只有成功的四步。我们因此在脚本里加上了对可重试 503 的等待重发，实测六就是加上之后的结果。

实测六（00:47–00:55）和第二天的实测七（11 月 12 日 00:15–00:20）用的是加了重试的最终版。实测六里话题搜索连续三次 503，第三次的错误体写着「10 分钟内 5 次失败、都没扣费」，并建议先发一次它给出的示例请求，判断是这个目标的问题还是服务的问题；实测七里评论回复返回 503，原因写的是 capacity_exhausted，也就是这项能力当时在服务一侧满员，同样退费，并明确说明这不是你的限速。七次跑链里，热搜、帖子搜索、评论和用户主页每一次都成功，话题搜索 7 次成功 5 次，帖子详情 7 次成功 6 次。

还有一个省请求的小改动：调评论之前先看帖子的 `comment_count`，为 0 就跳过；评论回复只对点赞最多的一两条评论去取，因为评论行没有回复数，我们 6 次回复调用一共只回了 3 条。空结果虽然退费，但每多一次请求，整条链就多等一两秒到七秒，跑几十个关键词时，这些等待会比钱更先成为瓶颈。

![截图：两张深色代码卡片。左边是 00:19:36 的 weibo/topic_search 请求，关键词双十一，count 为 20，展示前两个话题：双十一（讨论 33336000、阅读 13980000000）和微博会员双十一（讨论 990000、阅读 610000000），billing 里 charged_usd 为 0.000806，最后是截短的 next_page_token。右边是 00:31:50 的 weibo/comment_replies 请求，count 为 1，一条回复带 root_comment_id、reply_to_comment_id 和 ip_location「来自 黑龙江」，作者名显示为已隐去，charged_usd 0.000806。](https://everyinfra.com/articles/weibo-api-python/img-api-response.webp)

两次真实返回，只保留前两条结果；作者名隐去，账户余额字段删除。 [EveryInfra 接口真实返回，2026-11-11 00:19 和 00:31 新加坡时间](https://api.everyinfra.com/api/v1/social/catalog)

## 最容易踩的坑：评论最多的帖子，往往不是你要找的帖子

第一版脚本的挑帖规则很自然：搜索结果里评论最多的那条，评论数超过 20 的优先。四次实测下来，这个规则挑出的帖子 4 次都不含关键词。搜「流感」挑到的是一条动漫同人微博，它出现在结果里，是因为正文以外的话题或长文部分命中了；搜「流感疫苗」挑到的是一个 594 万粉丝的摄影账号发的风景照；搜「双十一」挑到的是一条讲「人只能在吃穿上省钱」的帖子，和购物节沾边但没提「双十一」；搜「智利车厘子」挑到的是一张电商预售卡片。

我们回头统计了四次搜索的每一行：limit 都是 50，热词「流感」「双十一」「流感疫苗」只回了 12、17、11 条，其中正文真正出现关键词的是 8、12、6 条，合计 26/40，也就是 65%；冷门词「智利车厘子」一次回满 50 条，正文含关键词的只有 24 条（48%），剩下大多是同一批电商卡片和带话题标签的转发。正文不含关键词的行偏偏评论更多，因为大号的帖子更容易通过话题、长文或者转发原文被搜到，它们的评论数又天然更高。

![堆叠横条图：四次 weibo/search（limit 50）的返回构成。实测一流感：正文含关键词 8 条、不含 4 条、没返回 38 个空位；实测二双十一：12、5、33；实测三流感疫苗：6、5、39；实测四智利车厘子：24、26、0。含关键词部分为青绿色。](https://everyinfra.com/articles/weibo-api-python/fig-03-search-yield-bar.zh.light.svg)

修复只要一行：先过滤 `keyword in text`，再按评论数排序。实测六和实测七用了这一行，结果正好说明它为什么必要，也说明它不够：实测七的 15 行里评论最多的一行有 312 条评论，是 2025 年 1 月 17 日发的一条线上中文课广告，正文里没有「流感」，按老规则就会挑中它；过滤后挑中的是一条 2 条评论、担心自己得了流感的普通帖子。实测六的 38 行里 37 行正文含「流感」，可全部是 00:36–00:51 这 15 分钟里刚发的帖子，评论最多的只有 1 条；过滤后挑中的是一条从答题小游戏里一键分享出来的帖子（来源设备字段写的就是那个小游戏），评论数 0，评论接口回空列表并退费。过滤能避免挑错帖子，但变不出互动；要评论样本，就得等帖子积累一段时间再去取，或者先用话题搜索找讨论量大的话题。如果你做的是研究抽样，这一行还不够，下面这段代码把搜索结果先分成「正文命中」和「只在话题或转发里命中」两组，分别统计，再决定要不要把第二组纳入样本。我们的建议是两组都保存，但在报告里分开写数字，不然一条大号的风景照就会把你的「流感疫苗讨论」样本拉偏。

```text
import json, sys
from collections import Counter

def split_rows(path, keyword):
    rows = json.load(open(path))["response"]["results"]
    hit = [r for r in rows if keyword in (r.get("text") or "")]
    other = [r for r in rows if keyword not in (r.get("text") or "")]
    def summary(group):
        return {"rows": len(group),
                "comments": sum(int(r.get("comment_count") or 0) for r in group),
                "verified": sum(1 for r in group if r.get("author_verified")),
                "newest": max((r["posted_at"] for r in group), default=None)}
    return {"keyword_in_text": summary(hit), "keyword_elsewhere": summary(other)}

print(json.dumps(split_rows(sys.argv[1], sys.argv[2]), ensure_ascii=False, indent=1))
```

第二个发现和时间有关。同一个词「流感」，00:14 的搜索回 12 条，发布时间从 11 月 3 日跨到 11 月 10 日；00:46 再搜，回满 50 条，49 条正文含「流感」，全部发布于最近 20 分钟（新加坡时间 00:27–00:46）。也就是说，`weibo/search` 返回的是一个随时刻变化的窗口，热词在某些时刻偏向最新发布，某些时刻混入更早的高互动帖子。做研究时，固定每天的采样时刻，比追求「一次取够 50 条」更重要。

## 分页：哪些能力能翻页

微博这几个能力的分页方式并不统一，写循环之前要先看目录里的 `page_token` 字段。下表是 2026 年 11 月 11 日目录里的参数和我们实测到的每页条数。

| 能力 | 每次上限 | 翻页方式 | 实测每次条数 |
| --- | --- | --- | --- |
| `weibo/trending` | limit 最大 200 | 无，一次取完榜单 | 50（我们取 50） |
| `weibo/search` | limit 默认 20、最大 50 | 无 page_token | 11、12、15、15、17、19、38、50、50 |
| `weibo/topic_search` | 每页 20 | page_token，24 小时有效 | 18、20、19、19；第 2 页 10 |
| `weibo/comments` | limit 最大 50 | 无 page_token | 2、24、5、12、21、2、0、1 |
| `weibo/comment_replies` | limit 最大 20 | 无 | 0、1、1、0、1 |
| `weibo/reposts` | limit 最大 20 | 无 | 3、14、20 |
| `weibo/user_posts` | 每页 20 | page_token，24 小时有效；post_type 可选 all、image、original、video | 每页 10，翻 2 页都是 10 |

`weibo/user_posts` 目录写每页最多 20 条，我们 8 次调用每次都回 10 条，计费按次，所以每千条成本按 10 条算。`topic_search` 的 `next_page_token` 原样传回就能取下一页，第二页回了 10 个话题，之后 token 为空表示到头。`weibo/search` 没有翻页参数，同一个词用 limit 20 回了 15 条、limit 50 隔 8 秒再搜回了 19 条，想要更多样本就要换关键词组合或者换采样时刻。

## 字段：每一步回什么，哪些常缺

帖子类的行（search、post_detail、user_posts、reposts）有 15–19 个字段：id、url、text、posted_at、like_count、comment_count、repost_count、image_urls、作者的 id、粉丝数、关注数、是否认证、认证说明、来源设备，以及 is_repost。`post_detail` 多一个 is_long_text，告诉你正文是不是长文；转发行多一个 original_post_id。目录里写着 `post_detail` 可能返回 view_count（阅读数），我们 4 次详情调用都没有拿到。实测四「智利车厘子」的 50 行搜索结果里没有作者粉丝数这一列，详情里才有，所以按粉丝数筛选之前要先补一次详情。

评论行只有 10 个字段：id、text、like_count、posted_at、作者 id 和名字、头像、post_id、post_url、platform。它没有 ip_location，也没有回复数，所以你无法从评论列表判断哪条评论下面有回复，只能按点赞挑。回复行多了 root_comment_id、reply_to_comment_id 和 ip_location；我们拿到的回复里，ip_location 写的是「来自 黑龙江」这样的属地，但也出现过「来自 AI罗伯特贱萌版」——发回复的是一个名叫「评论罗伯特」的账号，它在实测二那条帖子的 24 条评论里占了 2 条，点赞最多的那条评论下唯一的回复也是它发的。做情绪或观点分析时，建议先按作者把这类自动评论账号单独标出来。

计数也会变。实测二的帖子在搜索结果里显示 41 条评论、447 次转发，10 秒后详情显示 36 条评论、397 次转发；15 分钟后对同一条帖子再取一次评论，回 21 条，第一次是 24 条。我们没有办法判断是删评、折叠还是统计延迟，只能把它当作数据边界写清楚：同一条帖子的计数和评论列表，在分钟级别上就会不一样，报告里要写采集时刻。

![柱状图：四条帖子的评论计数和 weibo/comments 实际返回条数。实测一 4 条对 2 条（50%），实测二 36 条对 24 条（67%），实测三 6 条对 5 条（83%），实测四 25 条对 12 条（48%）。灰色柱是计数，青绿色柱是实际返回。](https://everyinfra.com/articles/weibo-api-python/fig-05-comment-coverage-bar.zh.light.svg)

## 每千条成本：热搜最便宜，用户主页最贵

只看单价会误判成本，因为每次返回的条数差很多。我们把全部真实调用的扣费加起来，除以真实返回的条数，得到每千条成本；空结果已经退费，不计入。计算只用原始 JSON，脚本如下。

```text
import glob, json
from collections import defaultdict

agg = defaultdict(lambda: {"calls": 0, "rows": 0, "usd": 0.0})
for f in glob.glob("raw/run*/[1-9]_*.json"):
    d = json.load(open(f))
    resp, action = d["response"], d["request"]["action"]
    a = agg[action]
    a["calls"] += 1
    a["rows"] += len(resp.get("results") or [])
    a["usd"] += (resp.get("billing") or {}).get("charged_usd", 0.0)
for action, a in sorted(agg.items()):
    per_1000 = a["usd"] / a["rows"] * 1000 if a["rows"] else None
    print(f"{action:16} calls={a['calls']:2} rows={a['rows']:4} usd={a['usd']:.6f} per_1000={per_1000}")
```

结果是：热搜榜每千条约 $0.0111（一次 50 条只要 $0.000556）；帖子搜索约 $0.039；评论约 $0.043；话题搜索约 $0.047；转发约 $0.065；用户主页约 $0.081，因为每页只回 10 条。帖子详情按每千个帖子 $0.806。评论回复在 6 次调用里只回了 3 条，样本太少，不算每千条。换一种说法：同样花 1 美元，可以拍 1,798 次热搜快照，或者取大约 23,000 条评论，或者补全 1,240 条帖子详情。

![横向条形图：每千条数据的成本，按实测条数和扣费算。weibo/trending 0.0111 美元（青绿色，最短）；weibo/search 0.0390；weibo/comments 0.0434；weibo/topic_search 0.0469；weibo/reposts 0.0654；weibo/user_posts 0.0806。](https://everyinfra.com/articles/weibo-api-python/fig-04-cost-per-1000-bar.zh.light.svg)

## 跨领域例子：用热搜做公共卫生和公共事件时间线

流感季正好是检验「热搜能不能当公共卫生信号」的时候。[中国疾控中心的流感监测周报](https://www.chinacdc.cn/jksj/jksj04_14249/202611/t20261105_1842732.html)（数据截至 2026 年 11 月 1 日）写着南方省份流感病毒检测阳性率略有下降、北方省份上升，全国报告 106 起流感样病例暴发疫情；北京、上海等地政府网站在 11 月初都发了流感疫苗接种的通知。我们想看的是：同一个时间段，微博热搜榜上能看到多少和流感有关的条目。

### 做法：每 20 分钟拍一次榜

我们用 `weibo/trending`（limit 50）从 2026 年 11 月 11 日 00:14 拍到 03:22（新加坡时间，和北京时间相同），实测链里顺带拍了 6 次，后台脚本每 20 分钟再拍一次，共 16 次快照、800 行，花费 16 × $0.000556 = $0.0089。每一行都存原始 JSON，然后用下面这段代码把它们拼成一张「条目 × 时刻」的名次表，再按关键词和分类挑出公共卫生、公共事件两类条目。

```text
import glob, json, re
from collections import defaultdict

HEALTH = re.compile(r"流感|疫苗|疾控|病毒|感染|呼吸道|支原体|发热|医院|医保|卫健|健康|疫情|肺炎|诺如")
snaps = []
for f in glob.glob("raw/run*/1_trending.json") + glob.glob("raw/trending/*.json"):
    d = json.load(open(f))
    if d.get("http_status") == 200:
        t = (d.get("started_sgt") or f[-11:-5]).replace(":", "")[:4]
        snaps.append((t[:2] + ":" + t[2:], d["response"]["results"]))
snaps.sort()
ranks = defaultdict(dict)                      # title -> {time: rank}
for t, rows in snaps:
    for r in rows:
        ranks[r["title"]][t] = r["rank"]
health = {k: v for k, v in ranks.items() if HEALTH.search(k)}
print(len(snaps), "snapshots,", len(ranks), "distinct titles,", len(health), "health titles")
for k, v in health.items():
    print(k, [v.get(t) for t, _ in snaps])     # None = not on the list at that moment
```

![折线图：16 次热搜快照（00:14 到 03:22）里 5 个条目的名次。「进博会到APEC」（国内时政，青绿色粗线）16 次都在第 3 名；「花坛藏尸案审讯画面」（民生新闻）在第 6 到第 9 名之间；「学龄人口达峰」（民生新闻）从第 6 名在 01:42 掉到第 29 名，03:02 第 49 名后下榜；两个健康医疗条目用虚线，「阿尔兹海默」01:42 以第 45 名上榜、之后停在第 36 到 38 名，「13岁女孩确诊胃癌」03:02 以第 44 名上榜。](https://everyinfra.com/articles/weibo-api-python/fig-06-trending-timeline-line.zh.light.svg)

### 看到了什么

第一，三个多小时、800 行里，没有一条和流感或疫苗有关。用上面的关键词规则只命中 1 条，是 03:02 上榜的「13岁女孩腹痛1年家长忽视确诊胃癌」；按平台自己的分类，「健康医疗」类一共 2 条，另一条是 01:42 上榜的「原来真正的阿尔兹海默是这样的」，名次都在第 36 名以后。可同一时段 `weibo/topic_search` 查「流感」，#流感# 这个话题显示阅读 5.4 亿、讨论 49 万，#流感季全家防护指南# 阅读 7,843 万。话题的累计量很大，热搜榜上却看不到，说明热搜反映的是「此刻在冲榜的东西」，不是一个话题持续有多少人在讨论。做流感季研究，话题搜索的阅读量和讨论量，加上固定时刻的帖子搜索，比热搜榜更适合当主指标。

第二，热度值在夜里大幅下降，不能跨时刻直接比。第 1 名「金鸡奖获奖名单」16 次都在榜首，热度从 142.1 万降到 15.8 万；前 50 名热度之和从 3,297 万降到 294 万，降了 91%。如果你把不同时刻的热度值画在一条线上，看到的主要是作息曲线，而不是话题本身的冷热。Cui 和 Kertész 2022 年对热搜的研究（[arXiv:2208.10176](https://arxiv.org/abs/2208.10176)）也专门讨论了昼夜节律对条目热度的影响。我们的做法是：跨时刻比名次，或者比同一张快照里的相对热度（某条热度除以当次第 1 名），并且每天在相同时刻采样。

第三，名次不完全由热度值决定。第 1、3、4 名在 16 次快照里都是同一个条目；第 3 名「进博会到APEC见证中国开放纵深」的热度在 112.7 万到 9.7 万之间变化，和第 1 名的比值从 0.43 变到 0.95，名次却一次没动。三个小时的数据不足以判断原因，我们不下结论；对研究者来说，能确定的是：名次是榜单规则的结果，不能当成热度的单调函数来用。

第四，20 分钟的间隔会漏掉短命条目。16 次快照里一共出现 85 个不同条目，其中 7 个只出现过一次，23 个每次都在。如果你要研究「一条公共卫生消息在榜上停留多久」，间隔要缩到 5 分钟以内，成本按上一节的单价线性增加。

### 数据边界

[热搜榜数据说明](https://m.s.weibo.com/vtopic/datadescription?tab=rank)写明，热度按「实时热度 × 领域关注度 × 大众度 × 质量度」计算，每分钟更新，榜单是前 50 名，还有「商业广告」标识；我们 800 行里的标签只有「新」「热」「沸」和空白，没有遇到广告位，但长期采集时要把它单独标出来。热搜榜应该被当作「平台在某一时刻展示了什么」的记录，用来研究议程和曝光；它不能代表人群，也不能拿来估计发病情况。2023 年发表在 JMIR 上的一项研究（[e49300](https://doi.org/10.2196/49300)）研究甲流期间的公众情绪时，用的是 2022 年 11 月到 2023 年 3 月的全部相关微博帖子，而不是热搜榜，这也是更稳妥的做法。本文不对任何疾病的流行程度、疫苗效果或政策下结论。

## 三个场景的月账单

把单价和实测每页条数放进三个真实场景，算出来的接口费都不高。第一个是公共卫生研究组做流感季热搜时间线：每 10 分钟拍一次热搜（一个月 4,320 次），每天对 5 个关键词各翻 2 页话题、各搜一次帖子，每天补 3 条帖子的详情、评论和转发。第二个是新闻编辑部追一个 72 小时的突发事件：每 5 分钟拍一次热搜，10 个关键词每小时搜一次，挑 60 条帖子取详情、评论、回复和转发。第三个是一家关注中国市场的智利车厘子出口商，4 周里每天搜 6 个词。

| 场景 | 请求数 | 热搜快照 | 搜索和话题搜索 | 帖子、评论、转发、主页 | 合计 |
| --- | --- | --- | --- | --- | --- |
| 流感季热搜时间线（30 天） | 5,040 | $2.40 | $0.36 | $0.20 | $2.96 |
| 突发事件编辑部（72 小时） | 1,854 | $0.48 | $0.60 | $0.18 | $1.26 |
| 智利车厘子出口商（4 周） | 624 | $0.06 | $0.15 | $0.22 | $0.44 |

![堆叠横条图：三个场景的接口费。流感季热搜时间线 30 天合计 2.96 美元，其中热搜快照 2.40 美元（青绿色）；突发事件编辑部 72 小时合计 1.26 美元，热搜 0.48 美元、搜索 0.60 美元；智利车厘子出口商 4 周合计 0.44 美元。](https://everyinfra.com/articles/weibo-api-python/fig-07-scenario-cost-bar.zh.light.svg)

时间线场景里 81% 的钱花在热搜快照上，所以拍照频率是最该先想清楚的参数。开放平台建议的刷新频率是 3–5 分钟一次，热搜官方说明写的是每分钟更新；我们的经验是，做研究 10 分钟一次已经能看清一个条目的上榜、爬升和下榜，频率翻倍，成本也跟着翻倍。这里只算接口费，不算存储、分析和人工。

第三个场景的钱最少，但能看到的东西不少。我们回头读了实测四「智利车厘子」那 50 行搜索结果：29 行写了果径规格（J 到 4J，最多的是 J 和 4J），20 行提到礼盒，8 行是预售，31 行来自认证账号，50 行里只有 39 段不同的正文，其余是同一张电商卡片的重复。对出口商来说，这说明两件事：一是中国电商在 11 月就开始用规格和礼盒卖预售，规格是销售里的通用语言；二是搜索结果里重复的卡片很多，统计「讨论量」之前要先按正文去重，否则同一张卡片会被算好几次。这些统计只用一次搜索的原始 JSON，没有多花一分钱。

## 错误和扣费：哪些情况不花钱

我们在 00:30 前后专门做了几次错误测试，都没有花钱。不带 Key 请求返回 401，先鉴权再校验参数，未鉴权的请求探测不到参数结构；`weibo/user_posts` 的 post_type 传 originals 返回 422，错误信息里列出允许值 all、image、original、video，并提示你想要的可能是 original；调用当天暂停的 `weibo/user_post_search` 返回 503 unavailable，不扣费。正式实测里，429 限速、503 可重试失败和空结果，全部都是 $0。

这对写自动化脚本的人很重要：重试本身不花钱，所以脚本可以放心地按 `retry_after` 重发；但同一条请求成功两次就会扣两次，所以重试只针对明确的失败状态，不要对超时以外的成功结果重发。按次计费、失败退款怎么在你自己的账本里对上，可以看我们写过的[失败退款对账](/build/failure-refund-reconciliation)和[AI 代理重试与幂等键](/blog/api-idempotency-key-ai-agent-retry)两篇。

## 什么时候另外两条路更合适

按次付费接口不是所有人的最优解。如果你要替用户发微博、回评论、置顶，或者在自己的应用里展示授权用户自己的粉丝和互动数据，只有开放平台能做，任何第三方接口都不该替你做这件事。如果你所在的机构要长期、大批量采集并对外提供分析服务，开发者协议第 2.7.8 条已经说明要走商业数据 API 并签协议，那条路的合同和数据范围是按次接口给不了的。

开源脚本更合适的情况也存在：你只需要一次性下载某个公开账号的全部历史微博做论文，量在几千条，愿意花一个下午复制 Cookie、调延迟；或者你需要的字段是某个项目已经解析好的，比如 weibo-crawler 的 Live Photo 视频和存档核对报告。这时自己跑脚本的边际成本接近零。反过来，如果你要每 10 分钟采一次热搜、每天跑几十个关键词，又不想让一个账号的 Cookie 成为整条流程的单点，按次接口更省心。

## 延伸阅读

样本偏差看[社媒研究的样本完整性](/blog/social-media-research-sample-integrity)，让 AI 写采集脚本看[GLM-5.3 和 Claude Code 写知乎、微博脚本](/blog/glm-5-3-claude-code-zhihu-weibo-scripts)，抖音同类问题看[douyin api python 三条路实测](/blog/douyin-api-python)，公共卫生信号监测看[健康谣言的社媒信号监测](/blog/health-misinformation-social-signal-monitoring)。

## 合规与边界

不管走哪条路，有几条法律底线是一样的。《[个人信息保护法](https://www.cac.gov.cn/2021-08/20/c_1631050028355286.htm)》第 13 条列出了处理个人信息的合法性基础，第 27 条允许在合理范围内处理已经合法公开的个人信息，但个人明确拒绝或者对个人权益有重大影响的除外；评论里的昵称、属地和发言内容都属于个人信息。2025 年修订的《[反不正当竞争法](https://www.cnipa.gov.cn/art/2026/5/20/art_104_206437.html)》第 13 条写明，不得以违反诚实信用原则的方式，通过破坏或者规避技术管理措施等手段获取他人合法持有的数据。2025 年 1 月 1 日起施行的《[网络数据安全管理条例](https://www.mee.gov.cn/zcwj/gwywj/202410/t20241003_1087417.shtml)》对网络数据处理者的安全义务做了细化。

具体到本文的做法：我们只取公开内容，不登录任何账号，不碰私信和仅粉丝可见的内容；文章里出现的评论作者一律隐去昵称；研究报告里引用评论时，建议只引汇总数字或者改写后的观点，不放可以反查到个人的原文。本文不教任何绕过平台限制的方法，前面引用开源项目的 Cookie 和限速说明，是为了让你知道那条路的维护成本，不是推荐你那样做。

## 常见问题

### weibo api python 有没有现成的示例代码？

有。本文第三节的脚本可以直接运行：装 requests，把 Key 放进环境变量 `EVERYINFRA_API_KEY`，执行 `python weibo_chain.py 流感 run1`，就会依次调 7 个能力，并把每一步的原始返回存成 JSON。如果你要的是开放平台的官方 Python 示例，open.weibo.com 的文档以 HTTP 接口说明为主，需要先完成 OAuth 授权拿到 access_token，读取范围受授权用户限制。

### 微博 api 申请要什么条件？

开放平台的普通接口建应用即可调用，但受「单授权用户每天 100 次」等频次限制；高级接口要应用先通过审核，申请后 3 个工作日内处理，部分旧接口已不受理。weibo-cli 要在微博 App 里刷脸完成开发者认证，体验期只对白名单开放。以收集和分析数据为业务的，开发者协议要求使用商业数据 API 并签合作协议。

### 微博评论爬虫怎么拿到二级回复？

先用 `weibo/comments` 取一级评论，再把某条评论的 id 传给 `weibo/comment_replies`。注意评论行没有回复数字段，你不知道哪条评论下有回复，我们 6 次调用里有 2 次回了空列表（已退费）。经验做法是先挑点赞最多的几条评论去取回复，回复行里会带 root_comment_id、reply_to_comment_id 和 ip_location。

## 上手步骤

1. 在控制台创建 API Key，写进环境变量 `EVERYINFRA_API_KEY`，步骤见[快速上手](/docs#quickstart)。
1. 免费读一次目录 `GET /api/v1/social/catalog?platform=weibo`，确认参数、价格和 `available`；价格汇总也可以看[价格页](/pricing)和[数据市场](/market)，微博各能力的说明在[微博数据接口](/weibo-api)页。
1. `pip install requests`，复制第三节的脚本，执行 `python weibo_chain.py "你的关键词" run1`。
1. 打开 run1 目录里的 JSON，核对每一步的 `billing.charged_usd`；要追作者历史，用 `weibo/user_posts` 并把 `next_page_token` 原样传回。
1. 想让 AI 助手直接调这些能力，可以接[MCP 服务](/mcp-server)，工具和价格与 HTTP 接口相同。

各能力的参数页：[weibo/search](/weibo-api/search)、[weibo/trending](/weibo-api/trending)、[weibo/topic_search](/weibo-api/topic_search)、[weibo/post_detail](/weibo-api/post_detail)、[weibo/comments](/weibo-api/comments)、[weibo/comment_replies](/weibo-api/comment_replies)、[weibo/reposts](/weibo-api/reposts)、[weibo/user_posts](/weibo-api/user_posts)。同类平台可以对照[抖音数据接口](/douyin-api)、[B 站数据接口](/bilibili-api)和[小红书数据接口](/xiaohongshu-api)。

## 参考资料

1. 微博开放平台，《接口访问频次权限》，2025-05-15 更新，读取于 2026-11-11，https://open.weibo.com/wiki/%E6%8E%A5%E5%8F%A3%E8%AE%BF%E9%97%AE%E9%A2%91%E6%AC%A1%E6%9D%83%E9%99%90
1. 微博开放平台，《开发者协议》，读取于 2026-11-11，https://open.weibo.com/wiki/%E5%BC%80%E5%8F%91%E8%80%85%E5%8D%8F%E8%AE%AE
1. 微博开放平台，《高级接口申请》，读取于 2026-11-11，https://open.weibo.com/wiki/%E9%AB%98%E7%BA%A7%E6%8E%A5%E5%8F%A3%E7%94%B3%E8%AF%B7
1. 微博开放平台，《2/comments/show》，读取于 2026-11-11，https://open.weibo.com/wiki/2/comments/show
1. 微博开放平台，《2/statuses/user_timeline》，读取于 2026-11-11，https://open.weibo.com/wiki/2/statuses/user_timeline
1. 微博开放平台，《2/search/topics》，读取于 2026-11-11，https://open.weibo.com/wiki/2/search/topics
1. 微博开放平台，《2/statuses/public_timeline》，读取于 2026-11-11，https://open.weibo.com/wiki/2/statuses/public_timeline
1. 微博开放平台，《Oauth2/access_token》，读取于 2026-11-11，https://open.weibo.com/wiki/Oauth2/access_token
1. 微博开放平台，《授权机制说明》，读取于 2026-11-11，https://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E
1. 微博开放平台，《微博API》接口列表，读取于 2026-11-11，https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
1. 微博开放平台，《Scope》，读取于 2026-11-11，https://open.weibo.com/wiki/Scope
1. 微博开放平台，《错误代码说明》，读取于 2026-11-11，https://open.weibo.com/wiki/Error_code
1. 微博开放平台，weibo-cli 使用手册，读取于 2026-11-11 00:2x 新加坡时间，https://open.weibo.com/cli/quickstart
1. 微博开放平台，weibo-cli 命令列表，读取于 2026-11-11，https://open.weibo.com/cli/api/cli/commands
1. 微博商业数据 API 首页，读取于 2026-11-11，https://openapi.sc.weibo.com/
1. npm，@weibo-ai/weibo-cli，0.9.8，2026-09-22，https://www.npmjs.com/package/@weibo-ai/weibo-cli
1. 新浪财经转载 IT之家，《微博推出 weibo-cli》，2026-06-26，https://finance.sina.com.cn/tech/digi/2026-06-26/doc-inietsps5205508.shtml
1. 微博热搜，《热搜榜数据说明》，读取于 2026-11-11，https://m.s.weibo.com/vtopic/datadescription?tab=rank
1. 微博热搜，《热搜榜说明》（旧版公式），读取于 2026-11-11，https://m.s.weibo.com/hot/description
1. 微博，robots.txt，读取于 2026-11-11，https://weibo.com/robots.txt
1. 微博移动版，robots.txt，读取于 2026-11-11，https://m.weibo.cn/robots.txt
1. GitHub，dataabc/weibo-crawler README，读取于 2026-11-11，https://github.com/dataabc/weibo-crawler
1. GitHub，dataabc/weiboSpider README，读取于 2026-11-11，https://github.com/dataabc/weiboSpider
1. GitHub，dataabc/weibo-search README，读取于 2026-11-11，https://github.com/dataabc/weibo-search
1. GitHub，nghuyong/WeiboSpider README，读取于 2026-11-11，https://github.com/nghuyong/WeiboSpider
1. GitHub，NanmiCoder/MediaCrawler README，读取于 2026-11-11，https://github.com/NanmiCoder/MediaCrawler
1. GitHub，stay-leave/weibo-public-opinion-analysis README，读取于 2026-11-11，https://github.com/stay-leave/weibo-public-opinion-analysis
1. GitHub，weibo-crawler #653，2026-09-26，https://github.com/dataabc/weibo-crawler/issues/653
1. GitHub，weibo-crawler #652，2026-09-17，https://github.com/dataabc/weibo-crawler/issues/652
1. GitHub，weibo-crawler #658，2026-11-05 合并，https://github.com/dataabc/weibo-crawler/pull/658
1. GitHub，weibo-crawler #659，2026-11-06 合并，https://github.com/dataabc/weibo-crawler/pull/659
1. GitHub，weibo-search #590，2026-10-13，https://github.com/dataabc/weibo-search/issues/590
1. GitHub，MediaCrawler #1000，2026-11-04，https://github.com/NanmiCoder/MediaCrawler/pull/1000
1. EveryInfra，数据接口目录，读取于 2026-11-11 00:13 新加坡时间，https://api.everyinfra.com/api/v1/social/catalog
1. requests 文档，Advanced Usage：Session Objects，读取于 2026-11-11，https://requests.readthedocs.io/en/latest/user/advanced/#session-objects
1. PyPI，requests，读取于 2026-11-11，https://pypi.org/project/requests/
1. 国家互联网信息办公室，《中华人民共和国个人信息保护法》，2021-08-20，https://www.cac.gov.cn/2021-08/20/c_1631050028355286.htm
1. 国家知识产权局，《中华人民共和国反不正当竞争法（2025年修订）》，2026-05-20 收录，https://www.cnipa.gov.cn/art/2026/5/20/art_104_206437.html
1. 生态环境部转载国务院令第790号，《网络数据安全管理条例》，2024-10-03，https://www.mee.gov.cn/zcwj/gwywj/202410/t20241003_1087417.shtml
1. 上海交通大学竞争法律与政策研究中心，字节跳动诉微博 robots 协议案二审，2021-10-21，https://cclp.sjtu.edu.cn/Show.aspx?info_lb=672&info_id=5120&flag=648
1. 广东外语外贸大学知识产权研究院，新浪微博诉脉脉不正当竞争案（(2016)京73民终588号），读取于 2026-11-11，https://sciiip.gdufs.edu.cn/info/1028/1083.htm
1. 中国疾病预防控制中心，《2026年第44周中国流感监测周报》，2026-11-05，https://www.chinacdc.cn/jksj/jksj04_14249/202611/t20261105_1842732.html
1. 北京市人民政府，《流感疫苗去年打过，今年为什么还要打？》，2026-11-04，https://www.beijing.gov.cn/fuwu/bmfw/sy/jrts/202611/t20261104_4931879.html
1. 上海市人民政府，《@普陀新就业群体工会会员：免费流感疫苗开约！》，2026-11-06，https://www.shanghai.gov.cn/nw17239/20261106/de579962c67d46c6888397fc74bb9b0d.html
1. 湖滨区人民政府，《不用花钱，湖滨农村的老人、中小学生可以打流感疫苗啦！》，2026-10，https://www.hubin.gov.cn/25114/2026/10/2320886.html
1. 中共广东省委老干部局转载南方网，《流感季提前，今年秋冬警惕「先甲流后乙流」》，2026-11-05，https://www.gdlgb.gov.cn/xwdt/slzx6/content/post_123219.html
1. Cui, H. & Kertész, J.，Attention dynamics on the Chinese social media Sina Weibo during the COVID-19 pandemic，EPJ Data Science，2021，https://doi.org/10.1140/epjds/s13688-021-00263-0
1. Cui, H. & Kertész, J.，Competition for popularity and interventions on a Chinese microblogging site，arXiv:2208.10176，https://arxiv.org/abs/2208.10176
1. PubMed，Cui & Kertész 2021 摘要，https://pubmed.ncbi.nlm.nih.gov/33552838/
1. JMIR，Public sentiment toward influenza A on Weibo（e49300），2023，https://doi.org/10.2196/49300
