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

news2024/12/22 16:30:02

文章目录

  • 0 前言
  • 1 课题背景
  • 2 实现效果
  • 3 数据获取
  • 4 数据可视化
  • 5 最后


0 前言

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

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

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

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

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

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 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++指针的使用

文章目录 1.C指针1.1 定义指针1.2 使用指针 2.空指针和野指针2.1 空指针2.2 野指针 3.指针所占空间4.使用const修饰指针4.1 const修饰指针4.2 const修饰常量4.3 const 既修饰指针也修饰常量 5.指针操作数组6.指针做函数参数7.使用指针知识实现冒泡排序 1.C指针 指针其实就是一…

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。(我更新博文的顺序一般是按照我当前的学习进度来安排,学到什么就更新什么(简单来说就是我的学习笔记),所以不会对一个专栏一下子更新到底,哈哈哈哈哈哈哈!&a…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具,但在实际应用中,也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具,它们在功能、性能和易用性方面都具有独特优势,可以满足不同压力测试需求的选择。 一、Gat…

使用ExLlamaV2在消费级GPU上运行Llama2 70B

Llama 2模型中最大也是最好的模型有700亿个参数。一个fp16参数的大小为2字节。加载Llama 270b需要140 GB内存(700亿* 2字节)。 只要我们的内存够大,我们就可以在CPU上运行上运行Llama 2 70B。但是CPU的推理速度非常的慢,虽然能够运行,速度我…

[管理与领导-108]:IT人看清职场中的隐性规则 - 5 - 你会在不经意间被归属在不同的分类中,一旦分类定型,你就会被打上了某种标签(职场分类方法大全)

目录 前言: 一、关于分类 1.1 什么是分类 1.2 分类是人们理解复杂问题的一种常见方式 1.3 分类的优点与缺点 1.4 职场中的分类方法 二、职场对人的分类方法1:组织架构 2.1 职位和职级分类 2.2 按照部门、岗位进行分类 三、职场对人的分类方法2…

java Spring Boot按日期 限制大小分文件记录日志

上文 java Spring Boot 将日志写入文件中记录 中 我们实现另一个将控制台日志写入到 项目本地文件的效果 但是 这里有个问题 比如 我项目是个大体量的企业项目 每天会有一百万用户访问 那我每天的日志都记载同一个文件上 那不跟没记没什么区别吗? 东西怎么找&#x…

C++11之可变参数模板

可变参数模板 可变参数模板概念可变参数模板定义参数包展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板概念 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C98/03,类模版和函…

Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object

文章目录 一、数组(Array)二、数组的内存分析三、Array工具类四、面向对象的一些小知识五、进阶知识补充1. this关键字2.继承3.方法重写4.super关键字的使用5.子类对象实例化6.多态性的体现7.向下转型8.Object类 一、数组(Array) 数组:多个相同类型数据按照一定顺序…

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始,Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的,并推荐使用新的 Java API Client,即 ElasticsearchClient. 为什么要将 RestHighLevelC…

大喜国庆,聊聊我正式进入职场的这三个月...

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

Thymeleaf 内联语法使用教程

1 表达式内联 Thrmeleaf标准方言允许使用标签属性(th:)来实现很多的功能,但在有些场景之下,需要将表达式直接写入我们HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起,分能不开,待验证】,称为内联…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

【实验记录】一些小疑问

1.为什么要选择基于“外观”这一特性来作为回环检测的方案? 朴素思路复杂度高,不利于实时性;基于“里程计”的方案需要知道相机处于何位置下才能发生检测,这与我们需要知道的准确位置相矛盾 基于“外观”的方案与前端和后端均无关…

计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)

贝塞尔曲线 1. 本次作业实现的函数及简单描述(详细代码见后)2. 与本次作业有关的基础知识整理3. 代码描述(详细)4. 完整代码5. 参考文献 (本篇为作者学习计算机图形学时根据作业所撰写的笔记, 如有同课程请…

进程的状态与转换以及组织方式

1.进程的状态 三种基本状态:运行态,就绪态,阻塞态。 1.运行状态 如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。 CPU会执行该进程对应的程序(执行指令序列) 2.就绪状态 当进程创建完成后,…

【论文阅读】(CVPR2023)用于半监督医学图像分割的双向复制粘贴

目录 前言方法BCPMean-teacher and Traning StrategyPre-Training via Copy-PasteBidirectional Copy-Paste ImagesBidirectional Copy-Paste Supervisory Signals Loss FunctionTesting Phase 结论 先看这个图,感觉比较清晰。它整个的思路就是把有标签的图片和无标…

动态规划算法(1)--矩阵连乘

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘? 2、动态规划思路 3、手推m和s矩阵 4、完…

AI伦理与机器道德:人工智能的道德挑战

文章目录 什么是AI伦理和机器道德?1. 隐私保护2. 歧视和不平等3. 透明度和解释性4. 安全性5. 社会影响 AI伦理和机器道德的重要性1. 保护个人权利2. 避免不平等和歧视3. 保持透明和责任4. 促进创新 AI伦理挑战和解决方案1. 隐私保护2. 歧视和不平等3. 透明度和解释性…

P1541 [NOIP2010 提高组] 乌龟棋(4维背包问题)

[NOIP2010 提高组] 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行 N N N 个格子,每个格子上一个分数(非负整数)。棋盘第 1 1 1 格是唯一的起点,第 N N N 格是…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器,以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中,我们将首先介绍Nginx的基本概念,然后演示如何使用Docker C…