问答
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 站热门和微博、抖音热搜放在一起看,参考趋势研究方案。
更新于