毕业设计 大数据B站数据分析与可视化 - python 数据分析 大数据

Posted DanCheng-studio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业设计 大数据B站数据分析与可视化 - python 数据分析 大数据相关的知识,希望对你有一定的参考价值。

文章目录


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 大数据B站数据分析与可视化

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

1 课题背景

目前视频行业可以分为爱优腾为代表的长视频赛道,快手抖音为代表的短视频赛道,以及B站,B站的视频内容十分的丰富,因为独特的社区属性和基于UP主们的原创内容,打造了一个通过内容交流给用户带来愉悦感的社区型平台。

本项目基于Python+flask+pyecharts实现了对哔哩哔哩排行榜大数据的可视化分析。

2 实现效果

3 数据获取

本次数据来源于哔哩哔哩排行榜,服务器后台中每5min对排行榜数据爬取,通过jQuery Ajax+flask实时更新到网页上。

python爬虫简介

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫对某一站点访问,如果可以访问就下载其中的网页内容,并且通过爬虫解析模块解析得到的网页链接,把这些链接作为之后的抓取目标,并且在整个过程中完全不依赖用户,自动运行。若不能访问则根据爬虫预先设定的策略进行下一个 URL的访问。在整个过程中爬虫会自动进行异步处理数据请求,返回网页的抓取数据。在整个的爬虫运行之前,用户都可以自定义的添加代理,伪 装 请求头以便更好地获取网页数据。爬虫流程图如下:

爬虫相关代码

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])  

4 数据可视化

可视化呈现方案

综合得分计算指标:哔哩哔哩综合得分,是视频是否能排上排行榜的依据,若能知道其规则,对于视频内容的倾向,up主是否需要请求“一键三连”,观众们需不需要吝啬手中的币,是有很大的价值的,所以在此首先进行综合得分计算指标的分析及其可视化,此处采取灰色关联度分析(Grey Relation Analysis,GRA)来进行数据的处理。

首先是要确定子母序列,母是结果,子是影响因子,那么,毫无疑问,综合得分就是母,其他均为影响因子。将其分别存入mom_以及son_中,代码如下:

with open('./bilibili.txt', 'r+',encoding='utf-8') as f1:  
    lst2=[]  
    for line in f1.readlines():  
        lst2.append(line.split(','))  
mom_ = [int(i[4]) for i in lst2[0:50:]]  
view = []  
reply = []  
favorite = []  
coin = []  
share = []  
like = []  
for i in lst2[0:50]:  
    view.append(float(i[2].strip("万"))*10000)  
    reply.append(int(i[8]))  
    favorite.append(int(i[9]))  
    coin.append(int(i[10]))  
    share.append(int(i[11]))  
    like.append(int(i[12]))  
son_ = [view,reply,favorite,coin,share,like]

然后要对数据进行预处理,因为我们的这些要素是不同质的东西的指标,因此可能会有的数字很大有的数字很小,但是这并不是由于它们内禀的性质决定的,而只是由于量纲不同导致的,因此我们需要对它们进行无量纲化。这个操作一般在数据处理领域叫做归一化(normalization),也就是减少数据的绝对数值的差异,将它们统一到近似的范围内,然后重点关注其变化和趋势。按公式归一化即可。

mom_ = np.array(mom_)  
son_ = np.array(son_)  
son_ = son_.T / son_.mean(axis=1)  
mom_ = mom_/mom_.mean()  
for i in range(son_.shape[1]):  
    son_[:,i] = abs(son_[:,i]-mom_.T)  
Mmin = son_.min()  
Mmax = son_.max()  
cors = (Mmin + 0.5*Mmax)/(son_+0.5*Mmax)  
Mmean = cors.mean(axis = 0)  

最终结果:B站综合得分与播放、评论、收藏、投币、分享、点赞几个因素都具有很强的相关性。

灰色关联度介绍

GRA是一种多因素统计分析的方法。简单来讲,就是在一个灰色系统中,我们想要了解其中某个我们所关注的某个项目受其他的因素影响的相对强弱,本项目中,就是说:我们假设B站综合得分可能是与播放、评论、收藏、投币、分享、点赞几个因素相关的,那么我们想知道综合得分与这几个因素中的哪个相对来说更有关系,而哪个因素相对关系弱一点,把这些因素排个序,得到一个分析结果,我们就可以知道哔哩哔哩综合得分,与因素中的哪些更相关,因而也就可以看出观众的一键三连的作用以及up主们更应该求的是赞、币亦或是其他。

相关代码

# 灰色关联度分析版本  
import numpy as np  
from pyecharts import options as opts  
from pyecharts.charts import Graph  
with open('./bilibili.txt', 'r+',encoding='utf-8') as f1:  
    lst2=[]  
    for line in f1.readlines():  
        lst2.append(line.split(','))  
mom_ = [int(i[4]) for i in lst2[0:50:]]  
view = []  
reply = []  
favorite = []  
coin = []  
share = []  
like = []  
for i in lst2[0:50]:  
    view.append(float(i[2].strip("万"))*10000)  
    reply.append(int(i[8]))  
    favorite.append(int(i[9]))  
    coin.append(int(i[10]))  
    share.append(int(i[11]))  
    like.append(int(i[12]))  
son_ = [view,reply,favorite,coin,share,like]  
mom_ = np.array(mom_)  
son_ = np.array(son_)  
son_ = son_.T / son_.mean(axis=1)  
mom_ = mom_/mom_.mean()  
for i in range(son_.shape[1]):  
    son_[:,i] = abs(son_[:,i]-mom_.T)  
Mmin = son_.min()  
Mmax = son_.max()  
cors = (Mmin + 0.5*Mmax)/(son_+0.5*Mmax)  
Mmean = cors.mean(axis = 0)  
# 为便于观察 扩大40倍  
nodes = [  
    "name": "播放", "symbolSize": Mmean[0]*40,  
    "name": "评论", "symbolSize": Mmean[1]*40,  
    "name": "收藏", "symbolSize": Mmean[2]*40,  
    "name": "投币", "symbolSize": Mmean[3]*40,  
    "name": "分享", "symbolSize": Mmean[4]*40,  
    "name": "点赞", "symbolSize": Mmean[5]*40,  
]  
links = []  
for i in nodes:  
    for j in nodes:  
        links.append("source": i.get("name"), "target": j.get("name"))  
c = (  
    Graph()  
    .add("", nodes, links, repulsion=8000)  
    .set_global_opts(title_opts=opts.TitleOpts(title="综合得分计算指标"))  
)  
c.render_notebook()  

5 最后

爬取B站热门视频排行榜

一、主题式网络爬虫设计方案
1.主题式网络爬虫名称:爬取B站热门视频排行榜
2.主题式网络爬虫爬取的内容:统计所有投稿视频的数据综合得分,每日更新数据(作品,播放量,弹幕,作者)

3.主题式网络爬虫设计方案概述:找到网站地址,分析网站源代码,找到自己所需要的数据所在的位置,提取数据,进行数据整理,数据可视化等操作

二、主题页面的结构特征分析
主题页面的结构与特征分析:

找到我们需要的数据,进行找查定位技术图片

 

 

 

 技术图片

 

 

 技术图片

 

 

 我们需要的内容分别藏在‘a‘,class_="title",‘span‘,class_="data-box",‘div‘,class_="pts"里面

三、网络爬虫程序设计

1.数据爬取与采集

首先爬取网页通用框架

技术图片

 

 

 测试爬取的内容技术图片

 

 

 然后再将内容进行解析

技术图片

 

 

 技术图片

 

 

 测试解析的内容

技术图片

 

 

 

分析之前的网页源码

技术图片

 

 

 尝试把我们需要的内容打印出来

技术图片

 

 

 没问题后将刚刚的步骤打包

技术图片

 

 

 其他需要爬取的数据同理技术图片

 

 大部分整理完后进行细分

技术图片

 

 整理完全部数据之后导出excel文件方便查看

技术图片

 

 技术图片

 

 

数据整理完毕、开始进行数据可视化

 

画出柱状图和散点图

技术图片

 

 

输出结果

技术图片

 

 

建立变量之间的回归方程

技术图片

 

 输出结果

技术图片

 

 

四.

附上完整程序代码

#导入需要用到的模块
import requests import bs4 import re import matplotlib.pyplot
as plt import seaborn as sns import pandas as pd plt.rcParams[font.sans-serif]=[SimHei]#用来正常显示中文 plt.rcParams[axes.unicode_minus]=False#用来正常显示负号 def get_url(url):#获取网页内容 #伪装用户 headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3706.400 SLBrowser/10.0.4040.400} try: #尝试获取网页 f = requests.get(url,headers = headers) #如果状态码不是200则引发异常 f.raise_for_status() #编码 f.encoding = f.apparent_encoding #返回获取的网页 return f.text except: #状态码不是200打印产生异常 print(产生异常) def bs(text): #将读取到的网页解析 soup = bs4.BeautifulSoup(text,html.parser) return soup def cont_ent(soup): #提取排行前100的标题 m = soup.find_all(a,class_="title") n=[] for i in m: n.append(i.text) return (n)#整理成列表 def cont_ent2(soup): #提取播放量,弹幕,作者 x = soup.find_all(span,class_="data-box") n=[] for i in x: n.append(i.text) return (n)#整理成列表 def cont_ent3(soup): #提取综合得分 k = soup.find_all(div,class_="pts") n=[] for i in k: #因为分数没有过千万的所以可以搜集千万以内的数字 c=re.search(d?d?d?d?d?d?d?d?,i.text) n.append(eval(c.group())) return (n)#整理成列表 #把之前提取播放量,弹幕,作者再进行整理 def bofang(cone):#播放量 m=3 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def danmu(cone):#弹幕 m=2 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def zuozhe(cone):#作者 m=1 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def main(): #哔哩哔哩热搜视频排行链接 url = https://www.bilibili.com/ranking? #获取网页 some = get_url(url) #解析网页 soup = bs(some) ‘‘‘with open(try2.txt,w,encoding=utf-8) as f: f.write(soup.text)#测试写代码过程中是否出错‘‘‘ #数据处理 #提取标题 title = cont_ent(soup) #提取播放量,弹幕,作者 cone = cont_ent2(soup) #提取综合得分 score = cont_ent3(soup) ‘‘‘ with open(title.txt,w,encoding=utf-8) as f: for i in title: f.write(str(title.index(i)+1)+.) f.write(i) f.write( ) with open(cone.txt,w,encoding=utf-8) as f: for i in cone: f.write(i) f.write( ) with open(score.txt,w,encoding=utf-8) as f: for i in score: f.write(i) f.write( ) ‘‘‘ #导出数据查看是否有误 bfl = bofang(cone) dm = danmu(cone) zz = zuozhe(cone) df = pd.DataFrame({排名:range(1,101),标题:title,播放量:bfl,弹幕量:dm,作者:zz,综合得分:score}) df.to_excel(b站热门视频排行前100.xlsx) #因数据太多所以挑排名前几的作图 #柱状图 plt.bar(range(1,21),score[:20]) plt.xlabel(排名) plt.ylabel(综合得分) plt.title(前几名的综合得分柱状图) plt.show() #散点图 plt.scatter(range(1,21),score[:20]) plt.xlabel(排名) plt.ylabel(综合得分) plt.title(前几名的综合得分柱状图) plt.show() #回归分析 file_path = "b站热门视频排行前100.xlsx" dataf = pd.read_excel(file_path) sns.lmplot(x=排名,y=综合得分,data=dataf) main()

 

 

五、结论

1.排行是通过综合得分来进行排行,弹幕和播放量有一定的影响,吸引人的标题和视频的质量才是决定的关键

2.能够巩固之前学到的新知识,最好每隔一段时间前来复习一遍,网络爬虫很有趣。

以上是关于毕业设计 大数据B站数据分析与可视化 - python 数据分析 大数据的主要内容,如果未能解决你的问题,请参考以下文章

毕业设计大数据公交数据分析与可视化 - 大数据 python falsk

毕业设计基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化

阿里,B站小伙伴奉献的中高级大数据开发/运维学习课程与规划,赶紧收藏

阿里,B站小伙伴奉献的中高级大数据开发/运维学习课程与规划,赶紧收藏

阿里,B站小伙伴奉献的中高级大数据开发/运维学习课程与规划,赶紧收藏

毕业设计 大数据全国疫情数据分析与3D可视化 - python 大数据