今天早上看到有人通过随机视频id推测youtube视频总数,感觉很有意思,于是尝试预估一下B站目前的视频总数。
首先了解一下B站的视频编码规则,之前B站用的是8位数十进制的AV号,随着2020年10月,AV99999999:⑨⑨⑨,天长地久般的共荣!_哔哩哔哩_bilibili视频的发布,AV号的寿命也迎来了终结。B站目前采用的是BV号,原先的AV号也通过新的算法转为相应的BV号。
(35 封私信 / 52 条消息) 如何看待 2020 年 3 月 23 日哔哩哔哩将稿件的「av 号」变更为「BV 号」? - 知乎 (zhihu.com)
上述问题中mcfx用户的回答总结了B站BV号的算法,可以看到目前使用的号数共有9位,其中三位是固定的,实际使用6位,采用58进制,因此最多可以存380亿个视频。
本文拟通过随机构造BV号,查看对应视频与否的比例,进而估算总体视频数量。但是如果视频总数远小于380亿,则估算误差可能较大。考虑到目前视频总数大概率不足十亿,因此直接构造BV号效果不佳。
通过上述问题中另一个回答得知,AV号实际依然存在,只是隐藏了起来,目前AV号最高为9位,新视频AV号的生成方式不像以往按时间顺序赋予,而是随机生成。即新视频的AV号在100000000-999999999之间随机生成,通过对新视频的BV号反向解码获得的AV号也可以证明这一点。
于是通过随机数的方式在100000000-999999999间随机生成数字,再将其转化为BV号,使用爬虫判断视频是否存在,并通过样本估计总体的数量。
#BV和AV号转化代码,来源:https://www.zhihu.com/question/381784377/answer/1099438784
table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):
tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608
def dec(x):
r=0
for i in range(6):
r+=tr[x[s[i]]]*58**i
return (r-add)^xor
def enc(x):
x=(x^xor)+add
r=list('BV1 4 1 7 ')
for i in range(6):
r[s[i]]=table[x//58**i%58]
return ''.join(r)
# 随机构造BV号并判断视频是否存在
import random
import requests
header={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'}
a1,a2=0,0
for i in range(1000):
n=random.randint(100000000,999999999)
url='https://www.bilibili.com/video/{}/'.format(enc(n))
html=requests.get(url,headers=header)
if(html.status_code==200):
if(html.text.find('meta data-vue-meta="true" itemprop="description" name="description" content="undefined, 视频播放量 undefined、弹幕量 undefined、点赞数 undefined、投硬币枚数 undefined、收藏人数 undefined、转发人数 undefined, 视频作者 undefined, 作者简介 undefined')==-1):
a1+=1
else:
a2+=1
else:
print('网页请求失败,{},{}',url,html.status_code)
break
print(i,a1)
随机构造4000个视频BV,其中有效BV号为2182个,因此预计新的9位AV号中视频为4.9亿个,加上8位AV号中的1亿视频,总视频数为5.9亿。