问答
怎么追踪一个 B 站视频的播放量变化?
简短回答
按 BV 号定时调用 B站视频详情接口,每次读数连同时间一起存下来。每次读数 $0.002,一个视频每小时一次、追一周是 $0.336,十个视频追一周是 $3.36。每次都能拿到播放、点赞、投币、收藏和弹幕数。
你投的商单视频周五晚上八点上线,UP 主承诺首周 30 万播放。你想看的是整条曲线:周六有没有起量,周一是不是停滞了,上了热门之后有没有二次增长。B 站页面上只显示当前的数字,想要曲线,就得按固定间隔去读,并把每一次读数都留下来。
用哪个接口
B站视频详情按 BV 号返回视频当前的数据。加上 view=full,每次读数都有播放、点赞、评论、分享、收藏,ext 里还有投币和弹幕数。返回里的 meta.fetched_at 是抓取时间,画图时当横轴用。
不同频率的费用
| 方案 | 读数次数 | 费用 |
|---|---|---|
| 上线后 24 小时,每小时一次 | 24 | $0.048 |
| 一个视频,每小时一次,追 7 天 | 168 | $0.336 |
| 十个视频,每小时一次,追 7 天 | 1,680 | $3.36 |
| 一个视频,每天一次,追 30 天 | 30 | $0.06 |
比较划算的做法是前三天每小时一次,之后改成每天一次。B 站视频的大部分播放都集中在刚发布的那几天。
放进 cron 的脚本
用 0 * * * * python track.py 每小时跑一次:
import csv, datetime, os, requests
URL = "https://api.okdata.online/v1/bilibili/videos/get"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
VIDEOS = ["BV1xx411c7mD"]
hour = datetime.datetime.utcnow().strftime("%Y%m%d%H")
with open("views.csv", "a", newline="") as f:
w = csv.writer(f)
for bv in VIDEOS:
# 每个视频每小时一个 key:cron 重跑时第二次是免费回放
headers = {**H, "Idempotency-Key": f"{bv}-{hour}"}
body = requests.get(URL, headers=headers, params={"id": bv, "view": "full"}, timeout=60).json()
if body["code"] != "ok":
print(bv, body["code"], body["message"])
continue
v = body["data"]["item"]
w.writerow([body["meta"]["fetched_at"], bv, v["metrics"]["views"], v["metrics"]["likes"],
v["ext"]["coins"], v["metrics"]["favorites"], v["ext"]["danmaku"]])
用表格打开 views.csv,以时间为横轴画播放量;相邻两行相减,就是每小时新增的播放。
看数据时心里要有数
- B 站的公开计数是分批更新的,可能这一小时纹丝不动,下一小时一下跳很多。看趋势要看连续几个小时,别盯着单个点。
- 每分钟读一次没有意义:计数没涨得那么快,每次读数却都要付费。
- 这些都是谁都能看到的公开数字。完播率、流量来源和观众画像只在 UP 主的创作中心里。
- 视频被下架时返回
not_found,不扣费。
有些情况换个办法更好
如果是你投的商单,一周后请 UP 主导出创作中心的数据,那里的信息外部怎么读都读不到;你自己记录的逐小时曲线正好用来核对。想要现成图表,也可以用第三方的 B 站数据分析平台。愿意自己部署和维护的话,开源库 bilibili-api 能免费做同样的定时读取。要盯的是一批竞品而不是一个视频,看竞品监测方案。
更新于