# B站 API Python 教程：搜索、视频数据、评论和热门榜（2026）

> 用 Python 搜 B站视频，按 BV 号读播放、投币和弹幕数，翻评论，读热门榜，不用 wbi 签名也不用 Cookie。完整代码和花费。

网页版：https://okdata.online/zh/guides/bilibili-api-python/

四个接口：B站视频搜索、按 BV 号取视频详情、视频评论和热门榜，每个都是带 API key 的普通 GET 请求，不用 wbi 签名，也不用 buvid3 Cookie。下面的示例一共 7 次调用，花费 $0.014；失败的调用不扣费。

更新于 2026-11-12

用 Python 拿 B站数据，大多数代码是直接调 B站网页自己的接口，能用，直到某天不能用。搜索要 wbi 签名，还要新鲜的 buvid3 Cookie，密钥会轮换，跑了几周的脚本某天开始只返回 -412。这类代码大多参考的两个社区项目，bilibili-API-collect 文档和 bilibili-api 这个 Python 库，在 GitHub 上都已经归档、不再维护，下一次接口变动不会再有人从那边修。如果你已经撞上 -412，可以先看[B站搜索接口一直返回 -412 怎么办](https://okdata.online/zh/answers/bilibili-search-api-412-error/)。

这篇用 API key 做同样几件事：搜视频、按 BV 号读一条视频的数据、翻评论、读热门榜。每次调用就是一个 HTTPS GET，没有签名代码、Cookie 或登录态要维护，依赖只有 `requests`。最后得到一个视频数据 CSV 和一个评论 CSV。

## 分步操作

先设好 key：`export OKDATA_API_KEY=okd_...`。每次返回都有 `code`（成功为 `"ok"`）；列表结果在 `data.items`，翻页信息在 `page`；单个对象在 `data.item`。

先说 ID：B站每条视频都有 BV 号，就是链接里 `BV1` 开头那段，比如 `https://www.bilibili.com/video/BV1Gc411K7wD`。下面四个接口用的 `id` 都是它。老的数字 AV 号还在，返回在 `ext.aid` 里。各项数据分别在哪个字段，见[按 BV 号查播放、投币和弹幕数](https://okdata.online/zh/answers/bilibili-bv-id-video-stats/)。

### 第一步：搜视频

[B站视频搜索](https://okdata.online/zh/apis/bilibili/videos/search/)有 `query` 和 `sort` 两个参数，`sort` 可选 `relevance`（默认，综合）、`latest`（最新）或 `most_viewed`（最多播放）。一次调用返回约 20 条视频，每次 $0.002。每条有 `id`（BV 号）、`title`、简介 `text`、`published_at`、`author` 下的 UP 主昵称和数字 ID（mid）、`hashtags` 里的标签，以及 `metrics.views`、`metrics.likes`、`metrics.comments` 和 `metrics.favorites`。加上 `view=full` 还有 `ext.danmaku`、`ext.duration` 和 `ext.section`。

```bash
curl -G "https://api.okdata.online/v1/bilibili/videos/search" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'query=相机推荐' --data-urlencode 'sort=most_viewed' --data-urlencode 'view=full'
```

### 第二步：读一条视频的完整数据

[B站视频详情](https://okdata.online/zh/apis/bilibili/videos/get/)的 `id` 填 BV 号，或者用 `url` 传完整链接，每次 $0.002。详情补上了搜索里没有的东西：`metrics.shares`，以及 `view=full` 时的 `ext.coins`、`ext.danmaku`、`ext.aid`、`ext.cid`、`ext.duration_s` 和 `ext.section`。投币值得单独一列：观众得花币才能投，比点赞更能说明大家对这条视频的认可。

```bash
curl -G "https://api.okdata.online/v1/bilibili/videos/get" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=BV1Gc411K7wD' --data-urlencode 'view=full'
```

### 第三步：翻评论

[B站视频评论](https://okdata.online/zh/apis/bilibili/videos/comments/list/)的 `id` 填 BV 号，`sort` 可选 `hot`（默认，最热）或 `latest`（最新）。每页约 20 条，每次 $0.002，每条有 `text`、`author.name`、`author.id`（评论者的 mid）、`likes`、`replies`、`published_at` 和 `ip_location`（IP 属地，已去掉前缀）。下一页就把 `page.next_cursor` 作为 `cursor` 传回去。

```bash
curl -G "https://api.okdata.online/v1/bilibili/videos/comments/list" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=BV1Gc411K7wD' --data-urlencode 'sort=hot'
```

### 第四步：读热门榜

[B站热门榜](https://okdata.online/zh/apis/bilibili/trends/list/)没有参数，返回当前的综合热门，每次约 50 行，每次 $0.002。每行有 `rank`、`name`（视频标题）、`heat`（播放量）和 `url`（视频链接，末尾就是 BV 号）。想看更多屏，热门榜也可以用 `cursor` 翻页。

```bash
curl -G "https://api.okdata.online/v1/bilibili/trends/list" -H "Authorization: Bearer $OKDATA_API_KEY"
```

### 第五步：完整脚本

辅助函数检查 `body["code"]`，跳过已删除的视频，遇到限流或上游繁忙就用同一个 `Idempotency-Key` 重试，重试不会重复扣费。翻页用一个带页数上限的生成器。

```python
import csv
import os
import time
import uuid

import requests

API = "https://api.okdata.online"
KEY = os.environ["OKDATA_API_KEY"]
QUERY = "相机推荐"
TOP_VIDEOS = 2      # 查几条视频详情
COMMENT_PAGES = 3   # 第一条视频读几页评论；每页一次调用


def call(path, **params):
    headers = {"Authorization": f"Bearer {KEY}", "Idempotency-Key": str(uuid.uuid4())}
    for attempt in range(4):
        body = requests.get(API + path, headers=headers, params=params, timeout=60).json()
        if body["code"] == "ok":
            return body
        if body["code"] == "not_found":
            return None  # 已删除或不公开：不扣费
        if body.get("retry") in ("yes", "same_key"):
            time.sleep(body.get("retry_after_seconds") or 2 ** attempt)
            continue
        raise RuntimeError(f"{body['code']}: {body['message']} (request {body['request_id']})")
    raise RuntimeError(f"{path}: 重试 4 次仍然失败")


def paged(path, max_pages, **params):
    cursor = None
    for _ in range(max_pages):
        body = call(path, **params, **({"cursor": cursor} if cursor else {}))
        if body is None:
            return
        yield from body["data"]["items"]
        if not body["page"]["has_more"]:
            return
        cursor = body["page"]["next_cursor"]


board = call("/v1/bilibili/trends/list")["data"]["items"]
for row in board[:5]:
    print(row["rank"], row["heat"], row["name"], row["url"])

hits = call("/v1/bilibili/videos/search", query=QUERY, sort="most_viewed")["data"]["items"]
videos = []
for hit in hits[:TOP_VIDEOS]:
    body = call("/v1/bilibili/videos/get", id=hit["id"], view="full")
    if body:
        videos.append(body["data"]["item"])

with open("bilibili_videos.csv", "w", newline="", encoding="utf-8-sig") as f:
    out = csv.writer(f)
    out.writerow(["bvid", "title", "uploader", "views", "likes", "coins", "favorites", "shares", "danmaku", "published_at"])
    for v in videos:
        m, ext = v["metrics"], v["ext"]
        out.writerow([v["id"], v["title"], v["author"]["name"], m["views"], m["likes"], ext.get("coins"),
                      m["favorites"], m["shares"], ext.get("danmaku"), v["published_at"]])

if videos:
    first = videos[0]["id"]
    with open("bilibili_comments.csv", "w", newline="", encoding="utf-8-sig") as f:
        out = csv.writer(f)
        out.writerow(["bvid", "comment_id", "text", "user", "likes", "replies", "ip_location", "published_at"])
        for c in paged("/v1/bilibili/videos/comments/list", COMMENT_PAGES, id=first, sort="hot"):
            out.writerow([first, c["id"], c["text"], c["author"]["name"], c["likes"], c["replies"], c["ip_location"], c["published_at"]])
```

跑一遍就是上面的示例，7 次调用。如果要长期跟踪，花费主要在详情调用上：每天早上刷新 500 个 BV 号、连续一个月，是 15,000 次调用，$30.00。

## 注意事项

- **搜索深度。** B站自己的搜索翻到一定页数就不再给结果，这个接口也一样。话题比较宽的话，拆成几个更具体的关键词分别搜。
- **null 字段。** 搜索结果没有分享数（搜索里 `metrics.shares` 是 null，详情里有）。作品里 UP 主的粉丝数是 null，目录里目前也还没有 B站账号接口。每个 null 字段都在 `meta.unavailable` 里注明。
- **评论和回复。** 能拿到每条评论的回复数，拿不到回复正文。弹幕内容也拿不到，只有弹幕数。
- **多 P 视频。** 所有分 P 共用一个 BV 号，数据是整条视频的，`ext.cid` 是第一 P 的。
- **数据是快照。** 数字是调用那一刻读到的，跟踪增长时把 `meta.fetched_at` 一起存下来。
- **不收钱的情况。** 已删除的视频返回 `not_found`，和限流等其他错误一样不扣费。

不写代码只想看榜，打开 [B站热门榜工具](https://okdata.online/zh/tools/hot-search/bilibili/)就行。要跨平台研究一个话题，可以看[内容调研](https://okdata.online/zh/solutions/content-research/)，里面讲了搜索、详情和评论怎么配合。

## 示例花费

按播放量搜一次“相机推荐”，取前 2 条视频的完整数据，读第一条下 3 页热门评论，再读一次热门榜

| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| [B站视频搜索](https://okdata.online/zh/apis/bilibili/videos/search/) | 1 | $0.002 | $0.002 |
| [B站视频详情](https://okdata.online/zh/apis/bilibili/videos/get/) | 2 | $0.002 | $0.004 |
| [B站视频评论](https://okdata.online/zh/apis/bilibili/videos/comments/list/) | 3 | $0.002 | $0.006 |
| [B站热搜榜](https://okdata.online/zh/apis/bilibili/trends/list/) | 1 | $0.002 | $0.002 |
| 合计 | 7 |  | $0.014 |

按本页生成时的价格计算。失败的调用不扣费。

## 在你的 AI 里用（MCP）

先接好 MCP 服务，然后直接说你要什么。智能体会自己找到这些接口、看清价格，再用你的余额调用。

可以这样说：在 B站按播放量搜“相机推荐”，给我前 2 条视频的播放、点赞、投币、收藏、分享和弹幕数，再看第一条下面的热门评论。顺便看看现在热门榜上有什么。

```json
{
  "endpoint": "bilibili.videos.search",
  "params": {
    "query": "Claude Code 教程"
  },
  "idempotency_key": "<新的 UUID>"
}
```

MCP：`https://api.okdata.online/mcp`

## 本指南用到的接口

- [B站视频搜索](https://okdata.online/zh/apis/bilibili/videos/search/) `bilibili.videos.search`：$0.002/次 · 每页约 20 条视频
- [B站视频详情](https://okdata.online/zh/apis/bilibili/videos/get/) `bilibili.videos.get`：$0.002/次
- [B站视频评论](https://okdata.online/zh/apis/bilibili/videos/comments/list/) `bilibili.videos.comments.list`：$0.002/次 · 每页约 20 条评论
- [B站热搜榜](https://okdata.online/zh/apis/bilibili/trends/list/) `bilibili.trends.list`：$0.002/次 · 每页约 50 条榜单

## 更多B站内容

- [B站 API](https://okdata.online/zh/apis/bilibili/)
- [B 站的 mid（UID）是什么，从哪里拿到？](https://okdata.online/zh/answers/bilibili-mid-uid/)
- [怎么抓取 B 站视频下面的评论？](https://okdata.online/zh/answers/bilibili-video-comments-api/)
- [B 站 BV 号和 AV 号是什么关系，数据库里该存哪个？](https://okdata.online/zh/answers/bilibili-bv-vs-av-number/)
- [想找某个领域的 B 站 UP 主做推广，怎么筛？](https://okdata.online/zh/answers/bilibili-find-up-creators-for-sponsorship/)
- [B站有新视频提到我们产品时，怎么及时知道？](https://okdata.online/zh/answers/bilibili-new-videos-keyword-alert/)
- [B站热门榜有接口吗？](https://okdata.online/zh/answers/bilibili-popular-board-api/)
- [评论接口](https://okdata.online/zh/roles/posts-comments-list/)
- [热榜接口](https://okdata.online/zh/roles/trends-list/)
- [内容详情接口](https://okdata.online/zh/roles/posts-get/)
- [内容搜索接口](https://okdata.online/zh/roles/posts-search/)
- [B站热搜榜：今日榜单](https://okdata.online/zh/tools/hot-search/bilibili/)

## 资料来源

- [bilibili-API-collect 仓库（GitHub，已归档）](https://github.com/SocialSisterYi/bilibili-API-collect) (读取于 2026-11-12)
- [bilibili-api Python 库仓库（GitHub，已归档）](https://github.com/Nemo2011/bilibili-api) (读取于 2026-11-12)
