B站视频总数推测

         今天早上看到有人通过随机视频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亿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值