基于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。业务表包括 users、up_users、videos、comments。数据可通过 scripts/generate_bilibili_data.py 生成演示集,或经 BilibiliSpider / 页面「数据爬虫」调用 B 站公开 API 抓取;说明见 data/DATA_SOURCES.md。分析层在 utils/bilibili_charts.py 中聚合 KPI、分区、时序、互动、词云与情感等 bundle;utils/bilibili_core.py 提供筛选、简易情感判定与 invalidate_cache 版本缓存。前端以 sessionStorage 键 bilibili_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
目 录
- 4.0 系统整体实现流程
- 4.1 用户认证模块的实现
- 4.2 数据总览与视频分析模块的实现
- 4.3 UP主与互动分析模块的实现
- 4.4 时序分析模块的实现
- 4.5 词云情感与爬虫采集模块的实现
- 4.6 后台数据管理模块的实现
- 4.7 用户界面实现
- 4.8 系统集成与部署
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 研究目的
- 建立统一的 B 站业务数据模型(视频、UP主、评论、系统用户),完成建库脚本与可选爬取/生成链路。
- 实现登录鉴权与侧栏多页面分析,按分区、月份等条件筛选后输出 KPI 与图表 bundle。
- 在前端落实本地静态资源、主题样式、筛选项缓存与时序轴可读性优化。
- 提供自研后台对四张业务表的增删改查,并在数据变更后失效服务端缓存,保证图表与列表一致。
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.py、utils/bilibili_charts.py、utils/bilibili_spider.py、utils/admin_blueprint.py 分别承担过滤缓存、图表聚合、采集与后台。scripts/ 目录提供数据生成与命令行爬取入口。
2.2 Flask Web框架
2.2.1 轻量路由与会话
Flask 以装饰器注册路由,适合中小型课题。本系统用 session 保存 username,login_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.py 中 DB_CONFIG 指定 host、port、user、password、database。表结构由 bilibili.sql 创建,并预置 admin/123456。
2.3.2 访问封装
utils/db.py 使用 PyMySQL DictCursor,query(sql, params, fetch) 支持 one/all/none。图表与列表均通过参数化 SQL 访问,降低拼接风险。爬虫批量写入使用 ON DUPLICATE KEY UPDATE 保证 BV 号、MID 唯一键幂等更新。
2.4 ECharts可视化技术
2.4.1 本地化静态资源
模板 base.html 引用 static/vendor/bootstrap、bootstrap-icons、echarts.min.js、echarts-wordcloud.min.js,禁止依赖外网 CDN,保证离线演示可用。主题色以 B 站蓝 #00A1D6 与粉 #FB7299 为主,定义于 chart_helpers.js 与 bilibili-theme.css。
2.4.2 轴标签与时序交互
chart_helpers.js 中 categoryAxis 对日期类密集类目自动抽稀、旋转,并用 shortAxisLabel 将日线显示为 MM-DD;timeDataZoom 在类目数超过 40 时加入 inside/slider,默认聚焦末段约 40 个点。axisTooltip 使用系列名展示,避免出现无意义的 series0 文案。
2.5 数据采集与情感判定
2.5.1 公开 API 采集
BilibiliSpider 请求热门列表、视频详情、评论与 UP 卡片接口,请求间隔约 1.5~3.5 秒,写入 videos、comments、up_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。
加载并行:loadPageData 以 Promise.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 系统架构图
3.1.2 系统数据流设计
外部角色包括前台用户、管理员与数据供给方(生成脚本或爬虫)。系统输出页面 HTML 与图表 JSON,并将采集/维护结果写入数据库。
图3.2 顶层数据流图
图3.3 0层数据流图
3.1.3 系统功能模块设计
结合 MENU 与后台菜单,功能划分为六大模块:(1)用户认证;(2)数据总览与视频分析;(3)UP主与互动分析;(4)时序分析;(5)词云情感与爬虫采集;(6)后台数据管理。视频列表归属数据浏览能力,在实现章与总览/视频模块一并说明。
图3.4 系统功能结构图
3.2 系统详细设计
3.2.1 用户认证模块设计
模块提供 /login、/register、/logout。登录校验 users 表用户名与密码(演示环境明文存储,与课题默认账号一致);成功后写入 session["username"],可跳转 next 或进入 /home。注册校验空值、两次密码一致与用户名唯一。login_required 对未登录访问重定向登录页。默认账号 admin/123456。
3.2.1.1 用户认证流程设计
图3.5 用户认证模块流程图
3.2.2 数据总览与视频分析模块设计
数据总览页 /home 调用 /api/overview,展示视频数、总播放、总点赞、平均播放、评论数,以及月播放趋势、分区饼图、播放 TOP10。视频分析页 /video 调用 /api/video-bundle,展示分区平均播放与播放量分桶分布。视频列表 /video_list 服务端分页(每页 20),可按分区、月份筛选。公共筛选参数为 category、month、mid,由 build_video_where 生成条件。
3.2.2.1 数据总览与视频分析流程设计
图3.6 数据总览与视频分析模块流程图
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主与互动分析模块流程图
3.2.4 时序分析模块设计
时序页 /time 调用 /api/time-bundle:近 90 日每日投稿量、24 小时分布、星期×小时热力图。前端 lineChart 结合 categoryAxis 与 timeDataZoom,保证长日线可缩放阅读。
3.2.4.1 时序分析流程设计
图3.8 时序分析模块流程图
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 词云情感与爬虫采集模块流程图
3.2.6 后台数据管理模块设计
/admin/ 仪表盘展示四表计数与最近视频;子模块覆盖 videos、comments、up_users、users 的列表搜索、创建、编辑、删除。禁止删除默认 admin(id=1)。所有写操作后调用 invalidate_cache()。权限:必须前台以 admin 登录。
3.2.6.1 后台数据管理流程设计
图3.10 后台数据管理模块流程图
3.3 数据库设计
3.3.1 数据库关系设计
数据库名为 bilibili,四张表:users(系统账号)、up_users(UP主)、videos(视频)、comments(评论)。视频通过 mid 逻辑关联 UP主,评论通过 bvid 逻辑关联视频;SQL 文件未强制外键,便于爬虫批量写入。
图3.11 数据库表关系图
表3.1 users 表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | INT | 自增主键 | 是 | 否 |
| username | VARCHAR(64) | 用户名(唯一) | 否 | 否 |
| password | VARCHAR(128) | 密码 | 否 | 否 |
| created_at | TIMESTAMP | 创建时间 | 否 | 是 |
表3.2 up_users 表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | INT | 自增主键 | 是 | 否 |
| mid | VARCHAR(32) | UP主 MID(唯一) | 否 | 否 |
| up_name | VARCHAR(128) | 昵称 | 否 | 否 |
| follower | INT | 粉丝数 | 否 | 是 |
| video_count | INT | 投稿数 | 否 | 是 |
| level | INT | 等级 | 否 | 是 |
表3.3 videos 表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | INT | 自增主键 | 是 | 否 |
| bvid | VARCHAR(32) | BV 号(唯一) | 否 | 否 |
| title | VARCHAR(256) | 标题 | 否 | 否 |
| author | VARCHAR(128) | UP 昵称 | 否 | 否 |
| mid | VARCHAR(32) | UP 主 MID | 否 | 否 |
| category | VARCHAR(32) | 分区 | 否 | 否 |
| tag | VARCHAR(256) | 标签 | 否 | 是 |
| cover_url | VARCHAR(512) | 封面 URL | 否 | 是 |
| view_count | INT | 播放量 | 否 | 是 |
| danmaku_count | INT | 弹幕数 | 否 | 是 |
| like_count | INT | 点赞数 | 否 | 是 |
| coin_count | INT | 投币数 | 否 | 是 |
| favorite_count | INT | 收藏数 | 否 | 是 |
| share_count | INT | 分享数 | 否 | 是 |
| duration_sec | INT | 时长(秒) | 否 | 是 |
| pubdate | DATETIME | 发布时间 | 否 | 否 |
表3.4 comments 表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | INT | 自增主键 | 是 | 否 |
| bvid | VARCHAR(32) | 所属视频 BV | 否 | 否 |
| user_name | VARCHAR(64) | 评论用户 | 否 | 否 |
| content | VARCHAR(512) | 评论内容 | 否 | 否 |
| like_count | INT | 点赞数 | 否 | 是 |
| sentiment | VARCHAR(16) | 正面/负面/中性 | 否 | 是 |
| sentiment_score | DECIMAL(5,3) | 情感分 | 否 | 是 |
| comment_time | DATETIME | 评论时间 | 否 | 否 |
4 系统实现
4.0 系统整体实现流程
实现按「环境与库表 → 鉴权与壳页 → 图表 bundle → 采集脚本 → 自研后台 → 前端优化与联调」推进。配置集中在 config.py(端口 8050、库 bilibili、缓存 TTL 120 秒)。
图4.0 系统整体实现流程图
4.1 用户认证模块的实现
登录、注册、退出在 app.py 中实现;登录页使用主题背景图,表单提交校验用户表。
功能实现流程设计
图4.1 用户认证模块实现流程图
核心代码实现
# 来源: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 数据总览与视频分析模块实现流程图
核心代码实现
# 来源: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主与互动分析模块实现流程图
核心代码实现
# 来源: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 时序分析模块实现流程图
核心代码实现
# 来源: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 词云情感与爬虫采集模块实现流程图
核心代码实现
# 来源: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 后台数据管理模块实现流程图
核心代码实现
# 来源: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.jpg。admin 用户顶栏显示「后台管理」按钮。图表脚本统一经 chart_helpers.js 与 bilibili_pages.js 初始化。本节集中给出界面图题;第 4.1~4.6 节不再重复贴图。
功能实现流程设计
图4.7 用户界面功能实现流程图
主要页面实现
用户登录界面
访问路径: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 系统集成与部署功能实现流程图
核心配置实现
# 来源: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)
部署环境展示
部署步骤概要:
- 安装依赖:
pip install -r requirements.txt(Flask 3.1.0、PyMySQL、pandas、numpy、requests)。 - 创建并导入
bilibili.sql,确认库名bilibili,默认用户admin/123456。 - 按需执行
python scripts/generate_bilibili_data.py,或python scripts/crawl_bilibili.py --pages 2 --comments 20(详见data/DATA_SOURCES.md)。 - 在项目根目录执行
python app.py,服务监听 8050。 - 访问
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-C03 | UP主 TOP | up_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-D06 | options.version | 缓存未失效 | 再次进入分析页 | sessionStorage 可复用筛选项 | 符合预期 |
5.1.5 系统集成功能测试用例
表5.5 系统集成功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-E01 | 侧栏路由贯通 | 已登录 | 依次点击九个菜单项 | 均能打开对应页面 | 符合预期 |
| TC-E02 | API 需登录 | 未登录 | 请求 /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-F04 | Tooltip 名值 | 悬停柱图 | 查看提示框 | 显示系列名与数值,无 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 数据库性能测试
videos 在 category、mid、pubdate、view_count 上建有索引,comments 在 bvid、sentiment、comment_time 上建有索引,支撑筛选与分组。列表查询使用 LIMIT/OFFSET 分页,避免一次加载全表到模板。大批量导入优先使用脚本侧批量接口。
5.2.4 性能优化措施
- bundle 级 TTL 缓存(默认 120 秒,部分 240 秒)与
invalidate_cache版本抬升。 - 前端
bilibili_filter_options_v1+options.version减少重复拉筛项。 - 日线抽稀、MM-DD 与
dataZoom降低视觉与交互压力。 - 爬虫请求间隔与页数/评论数上限,降低被限流风险。
- 静态资源本地化,避免 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_core、bilibili_charts、bilibili_spider、admin_blueprint、crawl_job、db 等;模板覆盖前台分析页与 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.
致谢
在毕业设计完成过程中,感谢指导老师在选题、系统架构与论文撰写方面给予的耐心指导与严格要求。感谢同学们在联调、界面体验与答辩准备中提供的帮助与建议。感谢家人在学习与生活上的支持与理解。课题实现过程中参考了开源社区文档与相关教材,在此一并致谢。由于水平与时间有限,系统仍有不足,恳请各位老师批评指正。

1014

被折叠的 条评论
为什么被折叠?



