基于Python+Flask的B站数据分析可视化系统

基于Python+Flask的B站数据分析可视化系统 毕业论文

毕业设计


一、项目名称:

基于Python+Flask的B站数据分析可视化系统


【摘要】

B站视频、UP主与评论数据体量大、字段多,手工汇总难以快速把握分区结构、播放趋势与互动口碑。本文设计并实现基于 Python 与 Flask 的 B 站数据分析可视化系统,面向毕业设计与教学演示,将视频、UP主、评论统一入库后,以交互式图表完成多维分析与情感概览。

系统采用 B/S 架构,后端入口为 app.py,运行端口 8050;数据库使用 MySQL(库名 bilibili),经 PyMySQL 访问。前台基于 Bootstrap 5、本地 static/vendor 中的 ECharts 5 与 echarts-wordcloud,配合 bilibili-theme.css 主题与登录背景 bilibili-bg.jpg。业务表包括 usersup_usersvideoscomments。数据可通过 scripts/generate_bilibili_data.py 生成演示集,或经 BilibiliSpider / 页面「数据爬虫」调用 B 站公开 API 抓取;说明见 data/DATA_SOURCES.md。分析层在 utils/bilibili_charts.py 中聚合 KPI、分区、时序、互动、词云与情感等 bundle;utils/bilibili_core.py 提供筛选、简易情感判定与 invalidate_cache 版本缓存。前端以 sessionStoragebilibili_filter_options_v1 缓存筛选项(含 options.version),并用 Promise.all 并行加载筛项与图表数据;时序日线配合类目轴抽稀、MM-DD 缩短标签与 dataZoom。后台为自研 CRUD(utils/admin_blueprint.py),路径 /admin/,须先以前台 admin 登录,非 Flask-Admin、非 SimpleUI。默认账号 admin/123456

测试与运行表明,系统可完成登录注册、数据总览、视频/UP主/时序/互动分析、词云与评论情感、视频列表、爬虫采集与后台维护等闭环,界面清晰、响应稳定,可为 B 站数据分析课题研究与教学演示提供可用支撑。

【关键词】 Flask;B站数据分析;数据可视化;ECharts;情感分析

【Abstract】

Bilibili video, UP-user and comment data are large and multi-dimensional, making manual aggregation inefficient. This thesis designs and implements a Python- and Flask-based Bilibili data analysis and visualization system for graduation design and teaching demos. Videos, UP users and comments are stored in MySQL and explored through interactive charts.

The system follows a B/S architecture. The entry is app.py on port 8050. MySQL database name is bilibili, accessed via PyMySQL. The frontend uses Bootstrap 5, local ECharts 5 and echarts-wordcloud under static/vendor, with bilibili-theme.css and login background bilibili-bg.jpg. Tables include users, up_users, videos and comments. Data can be generated by scripts/generate_bilibili_data.py or crawled by BilibiliSpider / the crawler page. Analysis bundles are built in bilibili_charts.py with filtering, sentiment helpers and versioned cache invalidation in bilibili_core.py. The frontend caches filter options in sessionStorage (bilibili_filter_options_v1, options.version) and loads options with chart bundles via Promise.all. Time-series charts use dense-axis thinning, MM-DD labels and dataZoom. Admin CRUD is custom (admin_blueprint.py) at /admin/, requiring frontend admin login—not Flask-Admin or SimpleUI. Default account is admin/123456.

Results show that authentication, overview, video/UP/time/interaction analysis, word cloud, sentiment, video list, crawling and admin maintenance work stably for course demos.

【Keywords】 Flask; Bilibili Data Analysis; Data Visualization; ECharts; Sentiment Analysis


目 录

1 绪 论

2 相关技术

3 系统分析与设计

4 系统实现

5 系统测试

6 总结与展望

参考文献

致谢


1 绪 论

1.1 课题研究背景

短视频与弹幕社区快速发展,B站等内容平台积累了海量投稿、播放、点赞、投币、收藏与评论数据。对教学与课题研究而言,若仅依赖平台页面逐条浏览,难以从分区结构、投稿时序、UP主影响力与评论情感等维度形成整体认识。与此同时,毕业设计场景需要一套可本地部署、结构清晰、图表可读的可视化系统,既要能装载演示数据,也要能通过合规的公开接口补充真实样本。

本课题据此构建「基于Python+Flask的B站数据分析可视化系统」:以 Flask 提供页面与 JSON 接口,以 MySQL 库 bilibili 持久化视频、UP主与评论,以 ECharts 完成多页分析看板。系统入口 app.py 监听 8050 端口;侧栏覆盖数据总览、视频分析、UP主分析、时序分析、互动分析、词云、评论情感、视频列表与数据爬虫;管理端为自研 /admin/ CRUD。该背景决定了后续技术选型必须兼顾轻量部署、图表交互与数据可更新性。

1.2 课题研究的目的、意义

1.2.1 研究目的
  1. 建立统一的 B 站业务数据模型(视频、UP主、评论、系统用户),完成建库脚本与可选爬取/生成链路。
  2. 实现登录鉴权与侧栏多页面分析,按分区、月份等条件筛选后输出 KPI 与图表 bundle。
  3. 在前端落实本地静态资源、主题样式、筛选项缓存与时序轴可读性优化。
  4. 提供自研后台对四张业务表的增删改查,并在数据变更后失效服务端缓存,保证图表与列表一致。
1.2.2 研究意义

理论意义上,课题将 Web 应用分层、聚合查询与前端可视化工程实践结合起来,形成可复用的「页面路由 + bundle API + 缓存版本」模式。实践意义上,系统可在课堂或答辩环境中一键演示分析链路,降低对在线后台的依赖。社会与教学意义上,有助于理解内容社区数据的结构特征与舆情倾向,培养数据获取、清洗展示与工程实现能力。

1.3 课题的国内外研究现状和发展动态

1.3.1 国外研究现状

国外在社交媒体分析、视频平台指标看板与交互可视化方面积累较早。常见路径是将平台开放数据或第三方采集结果导入数据仓库,再以 BI 工具或自研 Web 看板呈现播放、互动与用户画像。开源生态中,Python 科学计算栈与浏览器端图表库(如 ECharts、D3)被广泛用于教学原型。情感分析多采用词典、传统机器学习或深度模型;课题级系统往往在准确率与实现成本之间折中,采用轻量规则即可满足演示需求。

1.3.2 国内研究现状

国内高校毕业设计中,基于 Flask/Django 的视频或电商可视化课题较多,常见组合为 MySQL + ECharts,辅以爬虫脚本。B站相关课题多关注热门分区、UP主粉丝与评论词频。管理端有的使用 Django Admin / SimpleUI,有的自研轻量 CRUD。本课题选择 Flask + 自研 /admin/,与前台同一套 B 站主题,避免引入重量级 Admin 框架,更贴近小型课题的可维护目标。

1.3.3 发展趋势

趋势上,内容数据分析正向「采集—入库—缓存—交互可视化」一体化演进;前端强调本地化静态资源与弱网可用;时序类图表普遍引入缩放与标签避让。合规方面,学习研究型爬取需控制频率并遵守平台条款。本系统在 bundle TTL、筛选项版本缓存与日线 dataZoom 等方面体现了上述工程趋势。

1.4 研究内容

研究内容包括:(1)库表设计与 bilibili.sql 初始化;(2)Flask 路由、Session 登录与菜单注入;(3)bilibili_charts 各分析 bundle 与筛选条件;(4)爬虫/生成数据与缓存失效;(5)ECharts 页面与 chart_helpers 轴标签优化;(6)自研后台 CRUD;(7)功能与性能层面的验证。创新点集中在:bundle + 版本缓存、前后端筛选项协同、时序密集轴可读性,以及与前台统一主题的自研后台。

1.5 论文结构安排

第1章介绍背景、目的意义、研究现状与研究内容。第2章说明 Python、Flask、MySQL/PyMySQL、ECharts、采集与情感判定等关键技术。第3章给出架构、数据流、功能结构、六大模块详细设计与数据库设计。第4章按模块阐述实现流程、核心代码、访问路径与界面图题。第5章给出功能测试用例与性能分析。第6章总结量化成果并展望改进方向。文末为参考文献与致谢。


2 相关技术

2.1 Python编程语言

2.1.1 语言特性与项目选型

Python 语法简洁,生态覆盖 Web、数据处理与 HTTP 客户端。本项目使用 Python 3.11,依赖见 requirements.txt:Flask、PyMySQL、pandas、numpy、requests。业务脚本与工具模块均以 UTF-8 源码组织,便于在 Windows 环境下维护。

2.1.2 在本系统中的应用位置

app.py 负责路由与会话;utils/db.py 封装连接与查询;utils/bilibili_core.pyutils/bilibili_charts.pyutils/bilibili_spider.pyutils/admin_blueprint.py 分别承担过滤缓存、图表聚合、采集与后台。scripts/ 目录提供数据生成与命令行爬取入口。

2.2 Flask Web框架

2.2.1 轻量路由与会话

Flask 以装饰器注册路由,适合中小型课题。本系统用 session 保存 usernamelogin_required 装饰器保护分析页与 API;context_processor 注入侧栏 MENU、站点名与格式化函数。根路径 / 重定向到登录页。

2.2.2 Blueprint 扩展后台

后台以 Blueprint admin_bp 挂载于 /admin,与主应用解耦。页面模板与前台共用主题资源,权限通过 admin_required 校验 session["username"] == "admin",未满足则携带 next 跳转登录。

2.3 MySQL与PyMySQL

2.3.1 存储选型

业务数据存放于 MySQL 库 bilibili,字符集 utf8mb4。config.pyDB_CONFIG 指定 host、port、user、password、database。表结构由 bilibili.sql 创建,并预置 admin/123456

2.3.2 访问封装

utils/db.py 使用 PyMySQL DictCursorquery(sql, params, fetch) 支持 one/all/none。图表与列表均通过参数化 SQL 访问,降低拼接风险。爬虫批量写入使用 ON DUPLICATE KEY UPDATE 保证 BV 号、MID 唯一键幂等更新。

2.4 ECharts可视化技术

2.4.1 本地化静态资源

模板 base.html 引用 static/vendor/bootstrapbootstrap-iconsecharts.min.jsecharts-wordcloud.min.js,禁止依赖外网 CDN,保证离线演示可用。主题色以 B 站蓝 #00A1D6 与粉 #FB7299 为主,定义于 chart_helpers.jsbilibili-theme.css

2.4.2 轴标签与时序交互

chart_helpers.jscategoryAxis 对日期类密集类目自动抽稀、旋转,并用 shortAxisLabel 将日线显示为 MM-DD;timeDataZoom 在类目数超过 40 时加入 inside/slider,默认聚焦末段约 40 个点。axisTooltip 使用系列名展示,避免出现无意义的 series0 文案。

2.5 数据采集与情感判定

2.5.1 公开 API 采集

BilibiliSpider 请求热门列表、视频详情、评论与 UP 卡片接口,请求间隔约 1.5~3.5 秒,写入 videoscommentsup_users 后调用 invalidate_cache()。Web 页通过 crawl_job 异步任务返回 job_id,前端轮询日志。

2.5.2 词典情感与分词

classify_sentiment 基于正面/负面关键词集合给出「正面」「负面」「中性」及分数,供评论入库与情感页统计。tokenize_text 抽取中文与英文词元,供词云 Counter 统计。该方案实现成本低,适合课题演示,不宣称等同商用 NLP 精度。

2.6 技术特色与创新点

缓存与一致性:服务端以 _cache["version"] 抬升失效全部 bundle;filter_options 返回 version,前端 bilibili_filter_options_v1 比对后决定是否复用 sessionStorage。

加载并行loadPageDataPromise.all 并行拉取 /api/options 与各 *-bundle,缩短首屏等待。

时序可读性:日线密集轴抽稀 + MM-DD + dataZoom,解决长序列挤压问题。

自研后台:非 Flask-Admin / SimpleUI,按 admin_registry.MODULES 声明式配置列表列与表单字段,修改后立即 invalidate_cache()

资源本地化与主题统一:vendor 本地化 + bilibili-theme.css,登录页使用 bilibili-bg.jpg,前后台视觉一致。


3 系统分析与设计

3.1 系统总体设计

3.1.1 系统架构设计

系统采用表现层、业务逻辑层与数据访问层三层结构。表现层为 Jinja2 模板与 bilibili_pages.js;业务层包括鉴权、图表 bundle、爬虫任务与后台 CRUD;数据层为 MySQL bilibili 及可选外部 API/生成脚本。

图3.1 系统架构图

数据访问层

业务逻辑层

表现层

登录/注册页

分析页面与视频列表

数据爬虫页

自研后台 /admin

ECharts + chart_helpers

login_required / admin_required

app.py 路由与 API

bilibili_charts bundle

bilibili_core 筛选缓存情感

BilibiliSpider + crawl_job

admin_blueprint CRUD

MySQL: bilibili

generate_bilibili_data

B站公开 API

3.1.2 系统数据流设计

外部角色包括前台用户、管理员与数据供给方(生成脚本或爬虫)。系统输出页面 HTML 与图表 JSON,并将采集/维护结果写入数据库。

图3.2 顶层数据流图

账号与筛选请求

CRUD与爬取配置

视频评论UP主

页面与图表JSON

管理反馈

持久化

前台用户

B站数据分析可视化系统

管理员 admin

B站公开API/生成脚本

MySQL bilibili

图3.3 0层数据流图

前台用户

1.0 用户认证

2.0 数据总览与视频分析

3.0 UP主与互动分析

4.0 时序分析

5.0 词云情感与爬虫

管理员

6.0 后台数据管理

users

videos

comments

up_users

3.1.3 系统功能模块设计

结合 MENU 与后台菜单,功能划分为六大模块:(1)用户认证;(2)数据总览与视频分析;(3)UP主与互动分析;(4)时序分析;(5)词云情感与爬虫采集;(6)后台数据管理。视频列表归属数据浏览能力,在实现章与总览/视频模块一并说明。

图3.4 系统功能结构图

基于Python+Flask的B站数据分析可视化系统

用户认证

数据总览与视频分析

UP主与互动分析

时序分析

词云情感与爬虫采集

后台数据管理

登录注册退出

Session鉴权

数据总览KPI与图表

视频分析分区与播放分布

视频列表分页筛选

粉丝与播放TOP

点赞投币弹幕收藏

日线投稿

小时分布与热力图

词云与词频柱

情感饼图与月趋势

热门/单BV爬取

视频评论UP主用户CRUD

缓存失效

3.2 系统详细设计

3.2.1 用户认证模块设计

模块提供 /login/register/logout。登录校验 users 表用户名与密码(演示环境明文存储,与课题默认账号一致);成功后写入 session["username"],可跳转 next 或进入 /home。注册校验空值、两次密码一致与用户名唯一。login_required 对未登录访问重定向登录页。默认账号 admin/123456

3.2.1.1 用户认证流程设计

图3.5 用户认证模块流程图

GET

POST

匹配

不匹配

通过

失败

访问 /login

请求方法

渲染 login.html

读取用户名密码

users表匹配

写入 session username

存在 next?

跳转 next

跳转 /home

提示用户名或密码错误

访问 /register

注册校验

INSERT users

跳转登录页

提示空值/不一致/已存在

访问受保护页

session.username?

放行视图

3.2.2 数据总览与视频分析模块设计

数据总览页 /home 调用 /api/overview,展示视频数、总播放、总点赞、平均播放、评论数,以及月播放趋势、分区饼图、播放 TOP10。视频分析页 /video 调用 /api/video-bundle,展示分区平均播放与播放量分桶分布。视频列表 /video_list 服务端分页(每页 20),可按分区、月份筛选。公共筛选参数为 categorymonthmid,由 build_video_where 生成条件。

3.2.2.1 数据总览与视频分析流程设计

图3.6 数据总览与视频分析模块流程图

进入 /home 或 /video

渲染模板

Promise.all 拉 options 与 bundle

bilibili_charts 聚合

缓存命中?

返回 JSON

SQL分组统计

写入 TTL 缓存

ECharts 渲染 KPI/柱/饼

进入 /video_list

服务端 WHERE + LIMIT

渲染分页表格

3.2.3 UP主与互动分析模块设计

UP主分析页 /up 调用 /api/up-bundle:粉丝 TOP15、按投稿播放汇总 TOP15。互动分析页 /interaction 调用 /api/interaction-bundle:点赞/投币/弹幕/收藏合计与点赞 TOP10 视频。UP 相关查询 TTL 略长(240 秒),减轻重复聚合压力。

3.2.3.1 UP主与互动分析流程设计

图3.7 UP主与互动分析模块流程图

UP主

互动

进入 /up 或 /interaction

加载筛项与 bundle

页面类型

up_users 排序与 JOIN videos

SUM 互动字段与 like TOP

返回 labels/values

横向/纵向柱图渲染

3.2.4 时序分析模块设计

时序页 /time 调用 /api/time-bundle:近 90 日每日投稿量、24 小时分布、星期×小时热力图。前端 lineChart 结合 categoryAxistimeDataZoom,保证长日线可缩放阅读。

3.2.4.1 时序分析流程设计

图3.8 时序分析模块流程图

进入 /time

请求 /api/time-bundle

按 DATE/HOUR/WEEKDAY 聚合

截取日线末段90天

返回 daily/hourly/heatmap

折线+柱+热力图

日线类目密集?

MM-DD 抽稀 + dataZoom

常规轴标签

3.2.5 词云情感与爬虫采集模块设计

词云页 /wordcloud 汇总标题、标签与评论词频,输出词云与 TOP20 柱图。情感页 /sentiment 统计评论情感饼图与按月正/中/负序列。爬虫页 /crawler 展示库内统计,支持「开始抓取」热门与「抓取该视频」单 BV;接口 /api/crawl-hot/api/crawl-video/api/crawl-job/<id>。抓取完成后 invalidate_cache()

3.2.5.1 词云情感与爬虫采集流程设计

图3.9 词云情感与爬虫采集模块流程图

热门

单BV

词云/情感页

wordcloud/sentiment bundle

分词计数或情感分组

ECharts 词云/饼/折线

爬虫页配置参数

热门或单BV

start_hot_crawl

start_video_crawl

BilibiliSpider 写库

invalidate_cache

轮询 job 日志与统计刷新

3.2.6 后台数据管理模块设计

/admin/ 仪表盘展示四表计数与最近视频;子模块覆盖 videos、comments、up_users、users 的列表搜索、创建、编辑、删除。禁止删除默认 admin(id=1)。所有写操作后调用 invalidate_cache()。权限:必须前台以 admin 登录。

3.2.6.1 后台数据管理流程设计

图3.10 后台数据管理模块流程图

创建/编辑

删除

访问 /admin/

username==admin?

flash 提示并跳转登录

仪表盘统计

选择模块列表

操作类型

表单校验入库

是否默认admin用户

拒绝删除

DELETE

invalidate_cache

返回列表并 flash

3.3 数据库设计

3.3.1 数据库关系设计

数据库名为 bilibili,四张表:users(系统账号)、up_users(UP主)、videos(视频)、comments(评论)。视频通过 mid 逻辑关联 UP主,评论通过 bvid 逻辑关联视频;SQL 文件未强制外键,便于爬虫批量写入。

图3.11 数据库表关系图

mid

bvid

users

int

id

PK

主键

varchar

username

用户名唯一

varchar

password

密码

timestamp

created_at

创建时间

up_users

int

id

PK

主键

varchar

mid

UK

UP主MID

varchar

up_name

昵称

int

follower

粉丝数

int

video_count

投稿数

int

level

等级

videos

int

id

PK

主键

varchar

bvid

UK

BV号

varchar

title

标题

varchar

author

UP昵称

varchar

mid

UP主MID

varchar

category

分区

varchar

tag

标签

varchar

cover_url

封面

int

view_count

播放

int

danmaku_count

弹幕

int

like_count

点赞

int

coin_count

投币

int

favorite_count

收藏

int

share_count

分享

int

duration_sec

时长秒

datetime

pubdate

发布时间

comments

int

id

PK

主键

varchar

bvid

视频BV号

varchar

user_name

评论用户

varchar

content

内容

int

like_count

点赞

varchar

sentiment

情感标签

decimal

sentiment_score

情感分

datetime

comment_time

评论时间

表3.1 users 表结构

字段名称字段类型字段说明是否主键是否为空
idINT自增主键
usernameVARCHAR(64)用户名(唯一)
passwordVARCHAR(128)密码
created_atTIMESTAMP创建时间

表3.2 up_users 表结构

字段名称字段类型字段说明是否主键是否为空
idINT自增主键
midVARCHAR(32)UP主 MID(唯一)
up_nameVARCHAR(128)昵称
followerINT粉丝数
video_countINT投稿数
levelINT等级

表3.3 videos 表结构

字段名称字段类型字段说明是否主键是否为空
idINT自增主键
bvidVARCHAR(32)BV 号(唯一)
titleVARCHAR(256)标题
authorVARCHAR(128)UP 昵称
midVARCHAR(32)UP 主 MID
categoryVARCHAR(32)分区
tagVARCHAR(256)标签
cover_urlVARCHAR(512)封面 URL
view_countINT播放量
danmaku_countINT弹幕数
like_countINT点赞数
coin_countINT投币数
favorite_countINT收藏数
share_countINT分享数
duration_secINT时长(秒)
pubdateDATETIME发布时间

表3.4 comments 表结构

字段名称字段类型字段说明是否主键是否为空
idINT自增主键
bvidVARCHAR(32)所属视频 BV
user_nameVARCHAR(64)评论用户
contentVARCHAR(512)评论内容
like_countINT点赞数
sentimentVARCHAR(16)正面/负面/中性
sentiment_scoreDECIMAL(5,3)情感分
comment_timeDATETIME评论时间

4 系统实现

4.0 系统整体实现流程

实现按「环境与库表 → 鉴权与壳页 → 图表 bundle → 采集脚本 → 自研后台 → 前端优化与联调」推进。配置集中在 config.py(端口 8050、库 bilibili、缓存 TTL 120 秒)。

图4.0 系统整体实现流程图

项目初始化

配置 config 与依赖

执行 bilibili.sql 建库

实现 db 与 core

登录注册与 base 布局

charts bundle 与 API

各分析页与 bilibili_pages

爬虫与生成脚本

自研 admin CRUD

轴标签与缓存联调

功能测试与部署

4.1 用户认证模块的实现

登录、注册、退出在 app.py 中实现;登录页使用主题背景图,表单提交校验用户表。

功能实现流程设计

图4.1 用户认证模块实现流程图

打开登录页

POST提交?

显示表单

查询 users

账号密码正确?

session 赋值

跳转首页或 next

error 提示

注册提交

校验通过?

插入用户

回登录

显示错误

核心代码实现
# 来源:app.py — 登录与鉴权装饰器(节选)
def login_required(view):
    @wraps(view)
    def wrapped(*args, **kwargs):
        if not session.get("username"):
            return redirect(url_for("login"))
        return view(*args, **kwargs)
    return wrapped

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get("username", "").strip()
        password = request.form.get("password", "").strip()
        user = query(
            "SELECT id, username FROM users WHERE username=%s AND password=%s",
            [username, password],
            fetch="one",
        )
        if user:
            session["username"] = user["username"]
            nxt = request.args.get("next", "").strip()
            if nxt:
                return redirect(nxt)
            return redirect(url_for("home"))
        return render_template("login.html", error="用户名或密码错误")
    return render_template("login.html")
实现效果展示

访问路径http://127.0.0.1:8050/login(账号 admin / 123456

界面截图见第 4.7 节图4.9。

4.2 数据总览与视频分析模块的实现

总览与视频页由前端请求 bundle;列表页由服务端渲染分页结果。

功能实现流程设计

图4.2 数据总览与视频分析模块实现流程图

渲染错误: Mermaid 渲染失败: Lexical error on line 3. Unrecognized text. ...api/options 与 bundle] C --> D[overvi -----------------------^
核心代码实现
# 来源:utils/bilibili_charts.py — 总览 bundle(节选)
def overview_bundle(args):
    def build():
        where, params = build_video_where(args)
        stats = query(
            f"SELECT COUNT(*) AS cnt, COALESCE(SUM(view_count),0) AS views, "
            f"COALESCE(SUM(like_count),0) AS likes, COALESCE(AVG(view_count),0) AS avg_view "
            f"FROM videos{where}",
            params,
            fetch="one",
        )
        # … monthly / category_pie / top_videos …
        return {
            "kpis": {
                "video_count": int(stats["cnt"] or 0),
                "total_views": int(stats["views"] or 0),
                "total_likes": int(stats["likes"] or 0),
                "avg_view": _num(stats["avg_view"]),
                "comment_count": int(cstats["cnt"] or 0),
            },
            # …
        }
    return _bundle("overview", args, build)
// 来源:static/js/bilibili_pages.js — 并行加载(节选)
function loadPageData(bundlePath) {
  return Promise.all([
    loadOptions().then(bindFilter),
    fetchJson(bundlePath + queryString()),
  ]).then(function (pair) { return pair[1]; });
}
实现效果展示

访问路径

  • 数据总览:http://127.0.0.1:8050/home
  • 视频分析:http://127.0.0.1:8050/video
  • 视频列表:http://127.0.0.1:8050/video_list

界面截图见第 4.7 节图4.10、图4.11、图4.17。

4.3 UP主与互动分析模块的实现

UP 与互动页复用筛选栏与 bundle 缓存机制。

功能实现流程设计

图4.3 UP主与互动分析模块实现流程图

进入 /up 或 /interaction

请求对应 bundle

缓存有效?

直接返回

查询 up_users / videos

组装 labels values

写入缓存

柱状图渲染

核心代码实现
# 来源:utils/bilibili_charts.py — UP 与互动(节选)
def up_bundle(args):
    def build():
        rows = query(
            "SELECT up_name, follower, video_count FROM up_users "
            "ORDER BY follower DESC LIMIT 15",
            fetch="all",
        )
        gmv = query(
            "SELECT u.up_name, SUM(v.view_count) AS views FROM up_users u "
            "JOIN videos v ON v.mid = u.mid GROUP BY u.up_name "
            "ORDER BY views DESC LIMIT 15",
            fetch="all",
        )
        return {
            "top_follower": {
                "labels": [r["up_name"][:12] for r in rows],
                "values": [int(r["follower"]) for r in rows],
            },
            "top_views": {
                "labels": [r["up_name"][:12] for r in gmv],
                "values": [int(r["views"] or 0) for r in gmv],
            },
        }
    return _bundle("up", args, build, ttl=240)
实现效果展示

访问路径

  • UP主分析:http://127.0.0.1:8050/up
  • 互动分析:http://127.0.0.1:8050/interaction

界面截图见第 4.7 节图4.12、图4.14。

4.4 时序分析模块的实现

后端按日/小时/星期小时聚合;前端处理密集轴与缩放。

功能实现流程设计

图4.4 时序分析模块实现流程图

渲染错误: Mermaid 渲染失败: Lexical error on line 2. Unrecognized text. ...> B[/api/time-bundle] B --> C[daily/ -----------------------^
核心代码实现
# 来源:utils/bilibili_charts.py — 时序 bundle(节选)
daily = query(
    f"SELECT DATE(pubdate) AS d, COUNT(*) AS cnt, SUM(view_count) AS views "
    f"FROM videos{where} GROUP BY d ORDER BY d",
    params,
    fetch="all",
)
return {
    "daily_count": {
        "labels": [str(r["d"]) for r in daily[-90:]],
        "values": [int(r["cnt"]) for r in daily[-90:]],
    },
    # hourly_count / heatmap …
}
// 来源:static/js/chart_helpers.js — 日线轴与 dataZoom(节选)
function shortAxisLabel(v) {
  var s = String(v == null ? "" : v);
  if (/^\d{4}-\d{2}-\d{2}/.test(s)) return s.slice(5); // MM-DD
  return s;
}
function timeDataZoom(n) {
  if (n <= 40) return [];
  return [
    { type: "inside", xAxisIndex: 0, filterMode: "filter" },
    {
      type: "slider",
      xAxisIndex: 0,
      start: Math.max(0, 100 - Math.round((40 / n) * 100)),
      end: 100,
    },
  ];
}
实现效果展示

访问路径http://127.0.0.1:8050/time

界面截图见第 4.7 节图4.13。

4.5 词云情感与爬虫采集模块的实现

词云与情感依赖评论与标题文本;爬虫页驱动异步任务。

功能实现流程设计

图4.5 词云情感与爬虫采集模块实现流程图

词云/情感请求

tokenize / GROUP BY sentiment

返回 words 或 pie/series

词云图与情感图

点击开始抓取/抓取该视频

POST crawl API

后台线程执行 Spider

写 videos/comments/up_users

invalidate_cache

轮询 crawl-job 日志

核心代码实现
# 来源:utils/bilibili_core.py — 情感判定(节选)
def classify_sentiment(text):
    if not text:
        return "中性", 0.0
    pos = sum(1 for w in POS_WORDS if w in text)
    neg = sum(1 for w in NEG_WORDS if w in text)
    if pos > neg:
        return "正面", _num(min(0.95, 0.55 + pos * 0.1))
    if neg > pos:
        return "负面", _num(max(-0.95, -0.55 - neg * 0.1))
    return "中性", 0.0
# 来源:app.py — 热门爬取接口(节选)
@app.route("/api/crawl-hot", methods=["POST"])
@login_required
def api_crawl_hot():
    body = request.get_json(silent=True) or {}
    pages = min(10, max(1, int(body.get("pages", 2))))
    comments = min(100, max(0, int(body.get("comments", 20))))
    clear = bool(body.get("clear"))
    job_id = start_hot_crawl(pages=pages, comments=comments, clear=clear)
    return jsonify({"ok": True, "job_id": job_id})
实现效果展示

访问路径

  • 词云分析:http://127.0.0.1:8050/wordcloud
  • 评论情感:http://127.0.0.1:8050/sentiment
  • 数据爬虫:http://127.0.0.1:8050/crawler

界面截图见第 4.7 节图4.15、图4.16、图4.18。

4.6 后台数据管理模块的实现

后台基于模块注册表动态生成列表与表单,写操作统一失效缓存。

功能实现流程设计

图4.6 后台数据管理模块实现流程图

admin 登录后进 /admin/

仪表盘四表计数

进入模块列表

POST 写操作?

分页展示

校验字段

INSERT/UPDATE/DELETE

invalidate_cache

flash 并回列表

核心代码实现
# 来源:utils/admin_blueprint.py — 权限与删除保护(节选)
def admin_required(view):
    @wraps(view)
    def wrapped(*args, **kwargs):
        if session.get("username") != "admin":
            flash("请使用 admin 账号登录后再进入后台", "warning")
            return redirect(url_for("login", next=request.url))
        return view(*args, **kwargs)
    return wrapped

@admin_bp.route("/<module_key>/<int:pk>/delete", methods=["POST"])
@admin_required
def module_delete(module_key, pk):
    # …
    if module_key == "users" and pk == 1:
        flash("不能删除默认 admin 用户", "warning")
        return redirect(url_for("admin.module_list", module_key=module_key))
    query(f"DELETE FROM {spec['table']} WHERE id=%s", [pk], fetch="none")
    invalidate_cache()
    flash(f"{spec['label']}已删除", "success")
    return redirect(url_for("admin.module_list", module_key=module_key))
实现效果展示

访问路径http://127.0.0.1:8050/admin/(须先以前台 admin 登录)

界面截图见第 4.7 节图4.19。

4.7 用户界面实现

界面采用顶栏 + 侧栏 + 主内容布局:base.html 注入 MENU(数据总览、视频分析、UP主分析、时序分析、互动分析、词云分析、评论情感、视频列表、数据爬虫)。主题文件 bilibili-theme.css,登录背景 static/img/bilibili-bg.jpgadmin 用户顶栏显示「后台管理」按钮。图表脚本统一经 chart_helpers.jsbilibili_pages.js 初始化。本节集中给出界面图题;第 4.1~4.6 节不再重复贴图。

功能实现流程设计

图4.7 用户界面功能实现流程图

浏览器请求页面

Flask 渲染 Jinja2

已登录?

登录/注册布局

顶栏侧栏主区布局

加载 vendor 与主题 CSS

加载 ECharts 与页面脚本

并行请求 options+bundle

setOption 绘制图表

筛选提交更新 URL

主要页面实现
用户登录界面

访问路径http://127.0.0.1:8050/login

图4.9 用户登录界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系统首页 / 数据总览界面

访问路径http://127.0.0.1:8050/home

图4.10 数据总览界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

视频分析界面

访问路径http://127.0.0.1:8050/video

图4.11 视频分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UP主分析界面

访问路径http://127.0.0.1:8050/up

图4.12 UP主分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

时序分析界面

访问路径http://127.0.0.1:8050/time

图4.13 时序分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

互动分析界面

访问路径http://127.0.0.1:8050/interaction

图4.14 互动分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

词云分析界面

访问路径http://127.0.0.1:8050/wordcloud

图4.15 词云分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论情感界面

访问路径http://127.0.0.1:8050/sentiment

图4.16 评论情感界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

视频列表界面

访问路径http://127.0.0.1:8050/video_list

图4.17 视频列表界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据爬虫界面

访问路径http://127.0.0.1:8050/crawler

图4.18 数据爬虫界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后台管理界面

访问路径http://127.0.0.1:8050/admin/

图4.19 后台管理界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.8 系统集成与部署

功能实现流程设计

图4.8 系统集成与部署功能实现流程图

生成

爬取

准备 Python3.11 与 MySQL

pip 安装 requirements

导入 bilibili.sql

核对 config.DB_CONFIG

需要演示数据?

generate_bilibili_data.py

crawl_bilibili.py 或页面爬虫

python app.py

监听 0.0.0.0:8050

浏览器访问 /login

联调图表与后台

核心配置实现
# 来源:config.py
DB_CONFIG = {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "bilibili",
    "charset": "utf8mb4",
}

SECRET_KEY = "bilibili-flask-analysis-2026"
CACHE_TTL = 120
APP_PORT = 8050
# 来源:app.py — 启动入口
if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=config.APP_PORT)
部署环境展示

部署步骤概要:

  1. 安装依赖:pip install -r requirements.txt(Flask 3.1.0、PyMySQL、pandas、numpy、requests)。
  2. 创建并导入 bilibili.sql,确认库名 bilibili,默认用户 admin/123456
  3. 按需执行 python scripts/generate_bilibili_data.py,或 python scripts/crawl_bilibili.py --pages 2 --comments 20(详见 data/DATA_SOURCES.md)。
  4. 在项目根目录执行 python app.py,服务监听 8050
  5. 访问 http://127.0.0.1:8050/login;后台 http://127.0.0.1:8050/admin/(须 admin 会话)。

5 系统测试

5.1 系统功能测试

测试环境:Windows 10,Python 3.11,Flask 3.1.0,MySQL(库 bilibili),浏览器访问 http://127.0.0.1:8050。默认账号 admin/123456

5.1.1 用户认证功能测试用例

表5.1 用户认证功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-A01正确登录users 中存在 admin打开 /login,输入 admin/123456,点击「登录」跳转 /home,顶栏显示用户名符合预期
TC-A02错误密码账号存在输入错误密码并点击「登录」提示「用户名或密码错误」符合预期
TC-A03注册新用户用户名未占用/register 填写一致密码并提交跳转登录页,可用新账号登录符合预期
TC-A04两次密码不一致注册页密码与确认密码不同并提交提示「两次密码不一致」符合预期
TC-A05退出登录已登录点击顶栏「退出」Session 清空,回到登录页符合预期
TC-A06未登录拦截无 Session直接访问 /home重定向至 /login符合预期
5.1.2 数据管理功能测试用例

表5.2 数据管理功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-B01视频列表分页videos 记录数>20打开 /video_list每页 20 条,可翻页符合预期
TC-B02列表分区筛选库有多分区选择分区后筛选列表仅显示该分区符合预期
TC-B03后台创建视频admin 已登录/admin/videos/create 填写必填项保存提示已创建,列表可见符合预期
TC-B04后台编辑评论存在评论编辑情感字段并保存提示已更新,情感页可反映(缓存失效后)符合预期
TC-B05禁止删默认 admin用户管理删除 id=1 用户提示「不能删除默认 admin 用户」符合预期
TC-B06非 admin 进后台普通用户登录访问 /admin/flash 提示并跳转登录符合预期
5.1.3 核心业务功能测试用例

表5.3 核心业务功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-C01数据总览 KPI库有视频评论打开 /home视频数/播放/点赞/评论等 KPI 有值符合预期
TC-C02视频分析图表已登录打开 /video分区均播与播放分布图渲染符合预期
TC-C03UP主 TOPup_users 有数据打开 /up粉丝与播放 TOP 柱图显示符合预期
TC-C04互动合计videos 有互动字段打开 /interaction点赞/投币/弹幕/收藏合计正确符合预期
TC-C05热门爬取按钮网络可用/crawler 设页数,点「开始抓取」任务状态变化,日志滚动,统计增加符合预期
TC-C06单 BV 抓取有效 BV 号输入 BV,点「抓取该视频」视频/评论/UP 可入库符合预期
5.1.4 数据分析功能测试用例

表5.4 数据分析功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-D01时序日线多日 pubdate打开 /time日线折线可见,可 dataZoom符合预期
TC-D02时序热力图数据覆盖多小时查看热力图星期×小时格子有计数符合预期
TC-D03词云展示标题/评论充足打开 /wordcloud词云与 TOP 词柱图显示符合预期
TC-D04情感饼图comments 有 sentiment打开 /sentiment正/中/负占比与月趋势显示符合预期
TC-D05筛选联动多分区数据总览页选分区提交筛选URL 带 category,图表随筛选变化符合预期
TC-D06options.version缓存未失效再次进入分析页sessionStorage 可复用筛选项符合预期
5.1.5 系统集成功能测试用例

表5.5 系统集成功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-E01侧栏路由贯通已登录依次点击九个菜单项均能打开对应页面符合预期
TC-E02API 需登录未登录请求 /api/overview重定向登录符合预期
TC-E03写库后缓存失效admin 后台改视频保存后刷新总览图表数据更新符合预期
TC-E04爬取后图表刷新完成一次热门抓取打开总览/词云新数据可反映符合预期
TC-E05静态资源本地断外网 CDN刷新页面Bootstrap/ECharts 仍可用符合预期
TC-E06端口配置默认配置启动 app.py监听 8050符合预期
5.1.6 用户界面功能测试用例

表5.6 用户界面功能测试用例

编号说明条件操作步骤预期结果实际结果
TC-F01登录背景打开登录页查看页面背景显示 bilibili-bg 主题背景符合预期
TC-F02顶栏后台入口admin 登录查看顶栏可见「后台管理」按钮符合预期
TC-F03菜单高亮进入视频分析查看侧栏「视频分析」为 active符合预期
TC-F04Tooltip 名值悬停柱图查看提示框显示系列名与数值,无 series0符合预期
TC-F05日线标签时序页长序列观察横轴标签为 MM-DD 且不严重重叠符合预期
TC-F06响应式基本可用缩小窗口浏览首页布局可滚动使用符合预期

5.2 系统性能测试

5.2.1 响应时间性能分析

在本地演示数据或中小规模爬取样本下,页面 HTML 响应通常在百毫秒量级;bundle API 在缓存命中时明显更快,未命中时取决于聚合 SQL 与数据量。Promise.all 并行拉取筛项与图表,降低串行等待。时序页对日线截取近 90 天,控制前端渲染点数。

5.2.2 并发性能测试

课题场景以单机演示为主。Flask 开发服务器适合功能验证;多用户并发建议改用生产 WSGI。Session 鉴权与只读聚合在低并发下表现稳定;写操作(爬取、后台 CRUD)会触发缓存失效,短时间出现瞬时查询升高,属预期行为。

5.2.3 数据库性能测试

videoscategorymidpubdateview_count 上建有索引,commentsbvidsentimentcomment_time 上建有索引,支撑筛选与分组。列表查询使用 LIMIT/OFFSET 分页,避免一次加载全表到模板。大批量导入优先使用脚本侧批量接口。

5.2.4 性能优化措施
  1. bundle 级 TTL 缓存(默认 120 秒,部分 240 秒)与 invalidate_cache 版本抬升。
  2. 前端 bilibili_filter_options_v1 + options.version 减少重复拉筛项。
  3. 日线抽稀、MM-DD 与 dataZoom 降低视觉与交互压力。
  4. 爬虫请求间隔与页数/评论数上限,降低被限流风险。
  5. 静态资源本地化,避免 CDN 延迟影响首屏。

6 总结与展望

6.1 总结

本课题完成了「基于Python+Flask的B站数据分析可视化系统」的设计与实现。系统入口 app.py,端口 8050,数据库 bilibili,默认账号 admin/123456,后台为自研 /admin/ CRUD。

项目完成情况:实现登录注册鉴权,侧栏九个业务页(数据总览、视频分析、UP主分析、时序分析、互动分析、词云、评论情感、视频列表、数据爬虫),以及后台对 users/up_users/videos/comments 的维护;数据可通过生成脚本或公开 API 爬取更新。

主要技术成果:构建 6 大设计模块、4 张核心业务表;提供 overview/video/up/time/interaction/wordcloud/sentiment 等 bundle API;前端具备筛选项缓存与时序轴优化;静态资源置于 static/vendor,主题为 bilibili-theme.css

系统架构成果:表现层、业务层、数据层职责清晰;工具模块包括 bilibili_corebilibili_chartsbilibili_spideradmin_blueprintcrawl_jobdb 等;模板覆盖前台分析页与 admin/ 后台页。第5章设计多组测试用例,覆盖认证、数据管理、核心业务、分析、集成与界面。

创新点总结:版本化缓存失效、前后端筛选项协同、密集时序可读性处理,以及与前台统一视觉的自研后台。

项目价值体现:为 B 站相关数据分析教学与毕业设计提供可运行样板,便于演示「采集—存储—分析—可视化—管理」完整链路。

6.2 展望

后续可在密码哈希与权限分级、更细粒度的 UP/视频下钻、更稳健的情感模型、生产级部署(WSGI + 反向代理)以及定时增量同步等方面继续完善。在合规前提下扩展采集维度,并补充自动化回归脚本,可进一步提升工程完整度。


参考文献

[1] 明日科技. Python从入门到项目实践[M]. 北京: 清华大学出版社, 2020.

[2] Grinberg M. Flask Web开发:基于Python的Web应用开发实战[M]. 安道, 译. 北京: 人民邮电出版社, 2018.

[3] 姜承尧. MySQL技术内幕:InnoDB存储引擎[M]. 北京: 机械工业出版社, 2013.

[4] McKinney W. 利用Python进行数据分析[M]. 徐敬一, 译. 北京: 机械工业出版社, 2021.

[5] 王珊, 萨师煊. 数据库系统概论[M]. 5版. 北京: 高等教育出版社, 2014.

[6] 李航. 统计学习方法[M]. 2版. 北京: 清华大学出版社, 2019.

[7] Apache ECharts. ECharts Documentation[EB/OL]. https://echarts.apache.org/zh/index.html, 2026-03-01.

[8] Pallets Projects. Flask Documentation[EB/OL]. https://flask.palletsprojects.com/, 2026-03-01.

[9] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.

[10] 张良均, 王路, 谭立云, 等. Python数据分析与挖掘实战[M]. 北京: 机械工业出版社, 2016.

[11] 刘鹏. 大数据技术原理与应用[M]. 北京: 人民邮电出版社, 2021.

[12] Fielding R T. Architectural Styles and the Design of Network-based Software Architectures[D]. University of California, Irvine, 2000.

[13] 中国互联网络信息中心. 中国互联网络发展状况统计报告[R]. 北京: CNNIC, 2024.

[14] 哔哩哔哩. 哔哩哔哩开放平台与公开接口说明[EB/OL]. https://www.bilibili.com/, 2026-03-01.

[15] PyMySQL Contributors. PyMySQL Documentation[EB/OL]. https://pymysql.readthedocs.io/, 2026-03-01.


致谢

在毕业设计完成过程中,感谢指导老师在选题、系统架构与论文撰写方面给予的耐心指导与严格要求。感谢同学们在联调、界面体验与答辩准备中提供的帮助与建议。感谢家人在学习与生活上的支持与理解。课题实现过程中参考了开源社区文档与相关教材,在此一并致谢。由于水平与时间有限,系统仍有不足,恳请各位老师批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值