#0简介
明天学长向你们介绍一个机器视觉的毕设项目
毕设分享B站大数据剖析可视化(源码+论文)
项目获取:
哔哩哔哩排名榜数据剖析与可视化可视化目标与任务可视化任务选择
目前视频行业可以分为爱优腾为代表的长视频赛道,快手抖音为代表的短视频赛道,以及B站,B站的视频内容非常的丰富,由于奇特的社区属性和基于UP主们的原创内容,塑造了一个通过内容交流给用户带来愉悦感的社区型平台。
长视频类型的平台就是指通过大量优质自制剧、综艺和影片版权来获取会员,对标的是Netflix。诸如一部有可能要火的电视剧或则资源,各大视频平台会疯狂砸重金买版权。由于你们都明白,买下这块版权,都会吸引到想要关注这块内容的海量用户(中国在线视频用户以每年28%的增长在下降),也才会有好多的人去冲值会员,甚至于超前点播等。但中国目前三大视频平台旁边站的正是BATIT三大鳄,谁都不缺钱。那这就意味着谁都想吃下这块面包,所以都将内容版权炒上了天价,以至于目前这个赛道上,各家都是集体巨亏的状态,而到了真正垄断的这天,很难预测会是哪些样的局面。
短视频行业风头正茂,近些年来,随着互联网事业的蓬勃发展,手机终端的智能化越来越高,在这样的背景下,视频产品也发生了翻天覆地的变化。从影片到微影片,从微影片到短视频,作品的体量越来越小,抒发内容越来越集中,快餐文化的兴起,我不想谈哪些,也谈不了哪些,劝他人不刷某音手,无异于痴人说梦,尼尔·波兹曼在《娱乐至死》中提及:现实社会的一切公众话语逐渐以娱乐的形式出现,并成为一种文化精神。人们的政治、宗教、新闻、体育、教育和商业都心甘甘愿的成为娱乐的附庸,其结果是人们成了一个娱乐至死的物种。曾经其实是劝人读书,之后或许是劝人瞧瞧一部影片本身,瞧瞧一部电视剧,而不是沉溺在几分钟的影片解说,沉沦在快餐文化这一精神鸦片之中。
图2是我在写下此篇文字报告时在安卓模拟器中下载的某软件,刚才打开,往下稍为翻了,女人用户听到这些推荐是哪些看法?应当不至于新的模拟器中也有我自己泄漏的个人信息吧?其实短视频平台也有好多优秀的地方,也有好多优质的博主,不过我的自控力还是挺差的,所以还是敬而远之了。
B站则比较的不同,其实由于更多元也有好多低质量糟粕的东西,目前比较像YouTube,但B站没有妨碍观看内容的广告,这点挺好,看YouTube时几分钟一次的广告影响人的体验也是很严重的,并且YouTuber们常常还会把视频置于视频的关键的点,让你必须在那几秒的广告之时还保持高度的集中,便于快速跳过,B站的恰饭机制就十分的不错,up主们可以结合自己的内容来进行恰饭,甚至可以为恰饭作出带有个人风格的视频,带有自己特色的同时也完成了乙方妈妈的要求,但是恰饭的视频也不是强制性的,甚至可以完全不看,完全跳过。
除此之外,内容方面也是值得一谈的,视频的时长上,长、中、短视频均有,B站最奇特的优势就在于UGC,用户原创内容占多数,B站奇特的社区属性和基于UP主们的原创内容和一定的PGC视频,而围绕构建的各种圈层文化,显著区别于“爱优腾”这类以长视频内容见长的主流长视频平台。打开B站首页,列举的热门排名中,几乎是清一色的原创视频,来自不同版区,每位都高达数十万甚至百万的播放量,以及上千过万的弹幕。
在B站,最受欢迎的从来不是大热的动漫和影视剧等长视频内容,点击量表现好的,大多是UP主们原创的视频,分散在各个领域,如音乐区、游戏区、鬼畜区等,这种原创视频帮助B站默默收割着播放量。
而B站在二次元领域的多年耕耘,自带的二次元圈层属性,也不同于以抖音、快手等为代表的短视频平台所推动的“新视频文化”。
B站的特色是漂浮于视频上方的实时评论功能,爱好者称其为“弹幕”,这些奇特的视频体验让基于互联网的弹幕才能赶超时空限制,建立出一种奇妙的共时性的关系,产生一种虚拟的部落式观影气氛,让B站成为极具互动分享和二次创造的文化社区。B站目前也是诸多网路热门词汇的发祥地之一。
所以我们本次想要完成哔哩哔哩排名榜的数据剖析与可视化,第一是剖析才能“火”起来的视频都有哪些样的特点,便于up主们才能创作出更优质的内容,第二是想看一下在这个快餐文化兴起的时代里,哔哩哔哩作为奇特与其上两种形态的内容,有哪些其特色,为什么才能拿下一片视频领域的江山。
可视化方案规划
为了易于后续的数据的使用,我们从老师规定的三种可视化方案中选择了pycharts方案,因此前端也就选择了Flask,一个使用Python编撰的轻量级Web应用框架。
对于数据的抓取,则选定了Urllib这一python外置的HTTP恳求库来进行抓取。
对于后端,我们采用了flexible使用rem自适应布局,使用jQueryAjax对图表进行实时的更新。
对于数据处理,主要使用到了python的一些外置库,除此之外,对于综合评分剖析中,使用到了红色关联度剖析与主成份剖析,用到了sklearn库,详尽的内容在可视化部份进行解读。
数据处理方案
本次数据来始于哔哩哔哩排名榜,服务器后台中每5min对排名榜数据爬取,通过jQueryAjax+flask实时更新到网页上。
以下是数据爬取过程:
本次爬虫教程使用requests第三方库,一个强悍的基于urllib3的第三方库。
首先剖析哔哩哔哩排名榜的源码:
不难发觉榜单都在
可以看出,大厂的网站写的还是很棒的,很有体系,可以说bilibili甚至很适宜菜鸟来练手爬虫。
由于比较条理且为静态网页,直接使用requests,遍历li并对其进行find操作,找到对应标签内的内容,储存即可完成热榜爬取。
此时部份数据需进行一定的处理,但均较为简单,转换格式以及消除空格、‘\n’等。
但哔哩哔哩排名榜的内容只包括排行,视频名称、播放量、弹幕数、综合得分、作者、链接,并没有更加重要的投币、双击、转发和收藏等关键信息。所以还须要对每一个页面内部进行爬取。
后续代码中的info_Page(bv)对此进行了实现,bv代表的是哔哩哔哩每位视频对应的惟一的bv号,使用此bv添加网站后缀即可完成info页面的访问,在info页面中,仍然非常便于爬取。
但此时爬取速渡过快时会触发其反爬策略,且较难处理,故后续采用其提供插口获取内部详尽数据。使用+bv号方式获取数据,后续只需进行格式处理即可完成。
最后数据保存入bilibili.txt文件中,数据的运用及处理在各可视化案例中详尽介绍。
爬虫部份到此结束:
附爬虫代码:
import requests
from bs4 import BeautifulSoup
import xlwt
import time
import urllib3
import requests
import json
# 爬取B站热榜排行
# 格式解析,[0-当前排名,1-视频标题,2-播放数目,3-弹幕数量,4-综合得分,5-作者,6-视频地址,7-时长,8-评论数,9-收藏数,10-投币数,11-分享数,12-点赞数]
# 格式化
def whitespace(st):
st = st.replace('\n', '')
st = st.strip()
st = st.replace(' ', '')
return st
# 详情页
def info_Page(bv):
url = 'http://api.bilibili.com/x/web-interface/view?bvid=' + bv
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
} # 请求头,模拟浏览器的运行
urllib3.disable_warnings() # 从urllib3中消除警告
response = requests.get(url, headers=headers)
content = json.loads(response.text)
# 很迷,获取到的是str字符串 需要解析成json数据
statue_code = content.get('code')# print(statue_code)
if statue_code == 0:
duration = content['data']['duration'] # 时长
reply = content['data']['stat']['reply'] # 评论
favorite = content['data']['stat']['favorite'] # 收藏
coin = content['data']['stat']['coin'] # 投币
share = content['data']['stat']['share'] # 分享
like = content['data']['stat']['like'] # 点赞
return duration,reply,favorite,coin,share,like
while(True):
url = 'https://www.bilibili.com/v/popular/rank/all'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
rank = requests.get(url, headers=headers) # 请求页面
soup = BeautifulSoup(rank.text, 'lxml')
all_rank = soup.find_all('li', class_='rank-item')
num = 0
lst=[]
for i in all_rank:
record = []
rank_num = i.find('div', class_='num').text # 获取排名
info = i.find('div', class_='info') # 筛选出视频详细信息的标签
href = info.find('a', class_='title').attrs['href'] # 获取链接
title = info.find('a', class_='title').text # 获取标题
play_num = info.find('i', class_='b-icon play').parent.text # 获取播放量
view_num = info.find('i', class_='b-icon view').parent.text # 获取弹幕数
author = info.find('i', class_='b-icon author').parent.text # 获取作者名
scores = info.find('div', class_='pts').find('div').text # 获取综合得分
# 播放,弹幕,作者
play_num = whitespace(play_num)
view_num = whitespace(view_num)
author = whitespace(author)
bv = href.split('/')[-1]
duration,reply,favorite, coin,share,like = info_Page(bv)
record.append(rank_num)
record.append(title)
record.append(play_num)
record.append(view_num)
record.append(scores)
record.append(author)
record.append(href)
record.append(duration)
record.append(reply)
record.append(favorite)
record.append(coin)
record.append(share)
record.append(like)
num += 1
lst.append(record)
# 爬取的数据存入文件,避免多次爬取且提高响应速度
with open('./bilibili.txt', 'w',encoding='utf-8') as f:
for line in lst:
for i in line:
f.write(str(i)+',')
f.write('\n')
time.sleep(300)
#print(lst[0])
可视化呈现方案综合得分估算指标
哔哩哔哩综合得分,是视频是否能排上排名榜的根据,若能晓得其规则,对于视频内容的倾向,up主是否须要恳求“一键三连”,听众们需不须要小气手中的币,是有很大的价值的,所以在此首先进行综合得分估算指标的剖析及其可视化,此处采取蓝色关联度剖析(GreyRelationAnalysis,GRA)来进行数据的处理,