前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜
一.开发工具简介
开发语言:Java+Python(两个版本都支持) 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+ElementUI+HTML 数据库:MySQL 系统架构:B/S 开发工具:IDEA(Java的)或者PyCharm(Python的)
二.系统内容简介
本B站视频数据分析系统采用Python Django框架作为后端核心,配合Vue+ElementUI前端技术栈和MySQL数据库,构建了一个完整的B/S架构数据分析平台。系统主要围绕B站热门视频数据的采集、存储、分析和可视化展示进行设计,通过用户管理模块实现不同权限用户的登录认证和角色管理,热门视频管理模块负责视频信息的录入、编辑、删除和批量操作,系统管理模块提供基础配置和参数设置功能。系统的核心亮点在于热门视频推送功能,能够根据数据分析结果智能推荐符合用户偏好的热门内容,数据可视化模块则通过图表形式直观展现视频播放量、点赞数、评论数等关键指标的变化趋势和分布情况。个人中心模块允许用户管理个人信息和查看历史操作记录。整个系统界面简洁友好,操作流程清晰,即使是技术基础较弱的用户也能快速上手使用,同时系统具备良好的扩展性和稳定性,能够满足不同规模的数据分析需求。
三.系统功能演示
技术小白也能做:Python Django实现B站视频数据分析系统零基础教程
四.系统界面展示
五.系统源码展示
from pyspark.sql import SparkSession
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View
import json
import pandas as pd
from datetime import datetime, timedelta
from collections import Counter
import numpy as np
@method_decorator(csrf_exempt, name='dispatch')
class VideoAnalysisView(View):
def __init__(self):
self.spark = SparkSession.builder.appName("BilibiliVideoAnalysis").config("spark.executor.memory", "2g").getOrCreate()
def post(self, request):
data = json.loads(request.body)
video_data = data.get('video_data', [])
df = self.spark.createDataFrame(video_data)
popular_videos = df.filter(df.view_count > 100000).orderBy(df.like_count.desc()).limit(50)
result_data = popular_videos.collect()
analysis_result = []
for row in result_data:
engagement_rate = (row.like_count + row.comment_count) / max(row.view_count, 1) * 100
heat_score = row.view_count * 0.4 + row.like_count * 0.3 + row.comment_count * 0.2 + row.share_count * 0.1
video_info = {
'video_id': row.video_id,
'title': row.title,
'author': row.author,
'view_count': row.view_count,
'like_count': row.like_count,
'engagement_rate': round(engagement_rate, 2),
'heat_score': round(heat_score, 2),
'category': row.category,
'publish_time': row.publish_time
}
analysis_result.append(video_info)
return JsonResponse({'status': 'success', 'data': analysis_result})
@method_decorator(csrf_exempt, name='dispatch')
class VideoRecommendationView(View):
def __init__(self):
self.spark = SparkSession.builder.appName("BilibiliRecommendation").config("spark.executor.memory", "2g").getOrCreate()
def post(self, request):
data = json.loads(request.body)
user_preferences = data.get('user_preferences', {})
video_pool = data.get('video_pool', [])
user_categories = user_preferences.get('favorite_categories', [])
user_authors = user_preferences.get('favorite_authors', [])
df = self.spark.createDataFrame(video_pool)
recommendation_scores = []
for video in video_pool:
base_score = video['view_count'] * 0.3 + video['like_count'] * 0.4 + video['comment_count'] * 0.3
category_bonus = 50000 if video['category'] in user_categories else 0
author_bonus = 30000 if video['author'] in user_authors else 0
recency_days = (datetime.now() - datetime.strptime(video['publish_time'], '%Y-%m-%d')).days
recency_bonus = max(0, (30 - recency_days) * 1000)
total_score = base_score + category_bonus + author_bonus + recency_bonus
recommendation_scores.append({
'video_id': video['video_id'],
'title': video['title'],
'author': video['author'],
'score': total_score,
'category': video['category'],
'reason': self.generate_recommendation_reason(video, user_preferences)
})
sorted_recommendations = sorted(recommendation_scores, key=lambda x: x['score'], reverse=True)
final_recommendations = sorted_recommendations[:20]
return JsonResponse({'status': 'success', 'recommendations': final_recommendations})
def generate_recommendation_reason(self, video, preferences):
reasons = []
if video['category'] in preferences.get('favorite_categories', []):
reasons.append(f"匹配您喜欢的{video['category']}分类")
if video['author'] in preferences.get('favorite_authors', []):
reasons.append(f"来自您关注的UP主{video['author']}")
if video['like_count'] > 10000:
reasons.append("高点赞量优质内容")
return ",".join(reasons) if reasons else "基于热度推荐"
@method_decorator(csrf_exempt, name='dispatch')
class DataVisualizationView(View):
def __init__(self):
self.spark = SparkSession.builder.appName("BilibiliVisualization").config("spark.executor.memory", "2g").getOrCreate()
def post(self, request):
data = json.loads(request.body)
video_data = data.get('video_data', [])
chart_type = data.get('chart_type', 'category_distribution')
df = self.spark.createDataFrame(video_data)
if chart_type == 'category_distribution':
category_counts = df.groupBy('category').count().orderBy('count', ascending=False).collect()
chart_data = {
'labels': [row.category for row in category_counts],
'values': [row.count for row in category_counts],
'type': 'pie'
}
elif chart_type == 'view_trend':
df_pandas = df.toPandas()
df_pandas['publish_date'] = pd.to_datetime(df_pandas['publish_time'])
df_pandas['date_only'] = df_pandas['publish_date'].dt.date
daily_views = df_pandas.groupby('date_only')['view_count'].sum().reset_index()
chart_data = {
'labels': [str(date) for date in daily_views['date_only'].tolist()],
'values': daily_views['view_count'].tolist(),
'type': 'line'
}
elif chart_type == 'engagement_analysis':
engagement_data = []
for row in df.collect():
engagement_rate = (row.like_count + row.comment_count) / max(row.view_count, 1) * 100
engagement_data.append({
'video_id': row.video_id,
'title': row.title[:20] + '...' if len(row.title) > 20 else row.title,
'engagement_rate': round(engagement_rate, 2),
'view_count': row.view_count
})
sorted_engagement = sorted(engagement_data, key=lambda x: x['engagement_rate'], reverse=True)[:15]
chart_data = {
'labels': [item['title'] for item in sorted_engagement],
'values': [item['engagement_rate'] for item in sorted_engagement],
'type': 'bar'
}
return JsonResponse({'status': 'success', 'chart_data': chart_data})
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨