技术小白也能做:Python Django实现B站视频数据分析系统零基础教程

48 阅读4分钟

前言

💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长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})


六.系统文档展示

在这里插入图片描述

结束

💕💕文末获取源码联系 计算机程序员小杨