问答

怎么追踪一个 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 能免费做同样的定时读取。要盯的是一批竞品而不是一个视频,看竞品监测方案。

更新于