背景
目前各种视频业务非常火爆,前有短视频如某音,某手,以及一般的优爱腾影视,综艺平台,而现在很多公司也开始聚焦用户长视频如B站,因此有了获取作者视频信息来做简单分析的想法。比较下来,B站视频更贴近用户,内容丰富,而且有很多可以直接使用的数据接口,能够较快的获取目标数据。
执行思路
这里简单的概括下,先只考虑比较热门作者的内容,然后获取基础的内容数据,包括标题,分类,时长等。拿到原始数据后,就可以使用各种工具来进行对应多个维度的分析,从而得到想要的结果。这里以分析流行用户的时长数据为例展开。首先人工获取流行的作者,然后根据作者id获取到视频详细数据,之后简单用excel透视表来统计对应作者视频的长度等。
实现代码
这里采用python3来实现。
# -*- coding: utf-8 -*-
import json
import time
import requests
headers = {
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'cookie': 'CURRENT_FNVAL=16; _uuid=9D0F15EA-7B1A-6351-82A4-D6BB1CECA46544155infoc; buvid3=8595AC31-6932-4419-BCDF-5CB85BD6D9F0138369infoc; sid=7jq1j6ji; LIVE_BUVID=AUTO8215971455316379; DedeUserID=662763504; DedeUserID__ckMd5=b318a22451f4750e; SESSDATA=d1e54698%2C1612697574%2C37842*81; bili_jct=7affbe69799d32231a3c6708277dd286; bfe_id=5db70a86bd1cbe8a88817507134f7bb5; PVID=1',
}
es_host = 'http://127.0.0.1:9200/'
file_name = 'data.txt'
def save_es(data):
index = 'bili_stat'
url = es_host + index + '/_doc/'
res = requests.post(url=url, json=data)
if res.status_code == 200:
print(res.text)
def query_user_video(mid):
if len(mid) == 0:
return
url_fmt = 'https://api.bilibili.com/x/space/arc/search?mid={}&ps=30&tid=36&pn={}&keyword=&order=pubdate&jsonp=jsonp'
referer = 'https://space.bilibili.com/{}/video?tid=36&keyword=&order=pubdate'.format(mid)
data_list = []
pn = 1
while True:
url = url_fmt.format(mid, pn)
headers.update({'referer': referer})
res = requests.get(url=url, headers=headers)
time.sleep(1)
if res.status_code == 200:
res_json = json.loads(res.text)
if res_json['code'] == 0 and 'list' in res_json['data'].keys() and 'vlist' in res_json['data']['list'].keys():
vlist = res_json['data']['list']['vlist']
print('mid:{},pn:{},size:{}'.format(mid, pn, len(vlist)))
pn = pn + 1
for v in vlist:
v['timestamp'] = int(time.time())
x = {'bvid': v['bvid'], 'author': v['author'], 'mid': v['mid'], 'length': v['length'], 'duration': convert(v['length'])}
data_list.append(x)
save_es(v)
if len(vlist) < 30:
break
else:
break
else:
print('mid:{}, invalid code:{}'.format(mid, res.status_code))
break
if len(data_list) > 0:
with open(file_name, mode='a') as f:
for e in data_list:
f.write(to_line(e))
f.close()
def to_line(x):
return x['author'] + '\t' + str(x['mid']) + '\t' + x['bvid'] + '\t' + x['length'] + '\t' + str(x['duration']) + '\n'
def convert(length):
# 01:34 -> 60*1+34 = 94
arr = length.split(':')
return 60 * int(arr[0]) + int(arr[1])
def run_mids():
with open('mid.txt', 'r') as f:
lines = f.readlines()
for l in lines:
l = l[:-1]
# print(l)
query_user_video(l)
run_mids()
# query_user_video(str(378885845))
有几个需要注意的地方
- 这里作者id是保存到一个
mid.txt
文本中的,里边是流行的20个内容创作者。 - 核心的接口
space/arc/search
如果频繁调用会被禁止访问很长一段时间,返回状态码为412
,亲测只有更换IP才能重新访问,所以这里简单做了限制,每次请求sleep 1秒。 - 最后的内容保存在
data.txt
。每个作者的内容获取完成之后,保存到data_list[]
中,最后刷给文件 - 使用了ES来保存原始数据,如果本地没有的可以去掉这里,看
save_es
方法。 - 这里视频有分类,
tid=36
代表知识
结果展示
获取的数据内容举例。
基本数据:
罗翔说刑法 517327498 BV1264y1c7e6 09:48 588
哔哩哔哩直播 9617619 BV11K4y1Y7VK 31:05 1865
罗翔说刑法 517327498 BV1dk4y1m7oJ 09:37 577
罗翔说刑法 517327498 BV1gV411U7pd 05:41 341
罗翔说刑法 517327498 BV1UK4y1v7nm 12:38 758
罗翔说刑法 517327498 BV1Zf4y1X7Kt 10:29 629
罗翔说刑法 517327498 BV1A54y1D743 07:55 475
罗翔说刑法 517327498 BV1vk4y1m7g2 06:32 392
罗翔说刑法 517327498 BV1CZ4y1T7JD 13:47 827
分析结果:
结果
结语
以上就是本期内容。有兴趣的可以考虑获取更大量的数据,来做更严谨的数据分析。
网友评论