问答

B站热门榜有接口吗?

简短回答

有。okdata 的 B站热门榜接口返回当前综合热门列表,带排名、视频标题、播放量和链接,每页约 50 条,每次 $0.002。每天抓三次、抓一个月是 $0.18。不用传参数,不用登录,也不用 Cookie。

每天早上看一眼 B 站热门,内容团队很快就能知道这周什么形式在爆:一个新梗、一次游戏版本更新、一种突然人人都在模仿的讲解方式。手动刷网页也能看,可一旦想把它放进表格、和上周对比,或者开晨会前让模型先总结一遍,就需要拿到结构化的数据了。

用哪个接口

B站热门榜不需要任何参数。每一行有:

  • rank,在榜单上的位置
  • name,视频标题
  • heat,抓取那一刻的视频播放量
  • url,视频链接,里面就有 BV 号

榜单不止一页。把 page.next_cursor 作为 cursor 传回去就能往下翻,每翻一页算一次调用。

想知道某一条的点赞、投币或者 UP 主是谁,把链接交给 B站视频详情,每条 $0.002。

费用

用法 调用次数 费用
抓一次,只要第一页 1 $0.002
每天三次,抓 30 天 90 $0.18
同上,每次翻三页 270 $0.54
每天一次,再查前 10 名的详情 30 + 300 {{cost:bilibili.trends.list30+bilibili.videos.get300}}

早报脚本

import json, os, datetime, requests

API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

board = requests.get(API + "/v1/bilibili/trends/list", headers=H, timeout=60).json()
rows = board["data"]["items"]

top = []
for row in rows[:10]:
    bv = row["url"].rstrip("/").split("/")[-1]
    d = requests.get(API + "/v1/bilibili/videos/get", headers=H,
                     params={"id": bv, "view": "full"}, timeout=60).json()["data"]["item"]
    top.append({"排名": row["rank"], "标题": row["name"], "播放": row["heat"],
                "投币": d["ext"]["coins"], "分区": d["ext"]["section"], "UP主": d["author"]["name"]})

stamp = datetime.date.today().isoformat()
json.dump(top, open(f"bili-popular-{stamp}.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)

每天跑一次,文件按日期存,一个月后就有了自己的热门榜档案。

榜单里没有的东西

  • heat 就是播放量,并非 B 站内部的排序分。所以播放少的视频排在播放多的前面,并不奇怪。
  • 只有当前的综合热门。分区排行榜、每周必看、入站必刷都不在接口目录里。
  • 没有历史榜单接口。想看上个月的热门,只能从现在开始自己存快照,像上面那样一天一个文件就够了。

别的办法

开源项目 DailyHotApi 和 RSSHub 都有 B 站热门的路由,自己部署不花钱,手上已经在跑其中一个的话很合适。只是随手看看,B 站首页的热门页就是数据源本身。想把 B 站热门和微博、抖音热搜放在一起看,参考趋势研究方案。

更新于