博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。
摘 要
随着弹幕视频分享平台的蓬勃发展,B站已成为国内最具代表性的用户生成内容社区之一,其热门视频蕴含的海量观看行为与社交互动数据,为内容传播机制研究和精准营销实践提供了丰富素材。然而,当前面向B站视频数据的分析工具普遍存在采集维度单一、处理流程零散、可视化交互薄弱等问题,难以满足多维度、实时化的数据分析需求。针对上述问题,本文设计并实现了一套基于Python的B站热门视频数据分析与可视化系统。系统通过调用B站官方RESTful API结合自研爬虫技术,实现对视频基本信息、播放量、弹幕量、点赞数、评论数以及弹幕文本与评论内容的多维度数据采集;采用MySQL与Redis混合存储架构,保证数据持久化与实时查询性能;在数据预处理阶段,利用Pandas进行数据清洗,结合正则表达式与jieba分词对文本进行标准化处理,并通过TF‑IDF、Word2Vec及BERT模型提取情感得分与主题分布特征;在此基础上,构建Prophet时间序列模型与XGBoost回归模型进行热度预测,通过交叉验证评估模型性能;可视化层面,基于Dash框架搭建交互式仪表盘,支持时间序列折线图、热力图、雷达图等多种展示形式及多维度筛选功能。系统测试结果表明,本方案在数据采集效率、预测精度和可视化响应速度方面均达到预期目标,可为内容创作者、平台运营者与学术研究人员提供可靠的数据分析与决策支持工具。
关键词:B站;热门视频;数据采集;情感分析;热度预测;可视化仪表盘
一、绪论
1.1 研究背景
哔哩哔哩(B站)作为国内领先的年轻世代文化社区与弹幕视频分享平台,截至2025年,其月均活跃用户已突破3.5亿,日均视频播放量超过20亿次。平台以用户生成内容为核心驱动力,涵盖动画、游戏、知识、生活、科技等数十个内容分区,形成了独特的弹幕互动文化与社区氛围。热门视频作为平台内容生态的集中体现,其播放量、弹幕量、点赞数、评论数等指标不仅反映用户的观看偏好与互动行为,更蕴含着丰富的文化传播规律与市场营销信息。
近年来,随着短视频与直播内容的快速崛起,B站热门视频呈现出内容形式多元化、传播周期碎片化、互动方式立体化的发展趋势。这一变化在为内容创作者带来新的流量机遇的同时,也对平台运营者提出了精准识别热点、优化推荐策略的现实需求。在此背景下,如何系统化地采集、处理与分析热门视频的多维度数据,揭示热度形成的内在机制,已成为学术界与产业界共同关注的课题。
1.2 国内外研究现状
国内外学者围绕在线视频平台热门内容的研究已取得较为丰富的成果,主要集中在数据采集技术、内容特征提取、用户行为建模与热度预测四个方向。
在数据采集技术方面,国外学者多采用平台官方API或第三方爬虫框架获取视频元数据与社交互动信息。例如,针对YouTube、TikTok等平台的研究中,普遍使用Python的Requests、Scrapy以及Selenium等工具实现高并发数据抓取,并结合代理池与请求头轮换策略规避反爬限制。国内研究则以B站开放接口为主要数据来源,部分研究通过自研爬虫对弹幕、评论等非结构化内容进行补充采集,采用多线程与异步IO技术提升采集效率。然而,现有采集方案多针对单一数据类型设计,缺乏对视频基本信息、互动指标与文本内容的统一采集框架。
在内容特征提取方面,国外研究侧重于视频视觉内容的深度特征挖掘,利用卷积神经网络(CNN)对视频关键帧进行编码,提取视觉语义向量,再结合文本情感分析模型对评论进行情感极性判定。国内研究则更加关注弹幕文本与评论的语义理解,广泛采用TF‑IDF、Word2Vec以及BERT等预训练模型进行关键词抽取、主题建模与情感分类。然而,当前研究多将视觉特征与文本特征分开处理,缺乏跨模态特征融合的系统性方法。
在用户行为建模方面,国外学者倾向于使用图神经网络(GNN)构建用户-内容交互网络,捕捉社交传播路径与影响力分布,揭示热点内容的扩散机制。国内研究则以时间序列分析为主流,利用ARIMA、Prophet以及LSTM等模型对播放量、弹幕量的时序波动进行建模与预测。两类方法各有侧重,但均在一定程度上忽视了内容属性与用户互动行为之间的交互效应。
在热度预测与可视化方面,国外研究多采用混合模型将内容特征、用户行为特征与外部事件因素(如发布时间、节假日等)融合,构建多维度热度评分体系,并通过交互式仪表盘(如Plotly Dash、Streamlit)进行动态展示。国内研究则侧重于构建端到端的Python数据管道,从爬虫到清洗再到可视化,提供实时监控与历史回溯功能。然而,现有系统大多面向特定场景定制,缺乏通用性与可复现性,难以直接迁移应用。
总体而言,国内外在B站视频数据分析领域已积累了一定研究基础,但仍存在以下不足:一是数据采集缺乏统一的、多维度并行的采集架构;二是文本特征提取与数值指标分析之间缺少有机融合;三是热度预测模型的对比实验不够充分,模型选择缺乏系统性;四是可视化系统交互性不足,难以满足多层次数据探索需求。本研究正是针对上述问题,构建一套完整的基于Python的B站热门视频数据分析与可视化系统。
1.3 研究目的与意义
研究目的:本文旨在设计并实现一套基于Python的B站热门视频数据分析与可视化系统,涵盖数据采集、存储、清洗、特征工程、热度预测与可视化展示六大核心模块。系统通过对热门视频的播放量、弹幕量、点赞数、评论数等指标进行实时监测与历史回溯,结合弹幕与评论文本的情感分析与主题聚类,揭示用户互动行为与内容热度之间的内在关联;在此基础上构建时间序列预测模型与机器学习模型,实现对视频热度走向的短期预测;同时开发交互式可视化仪表盘,支持多维度筛选与趋势分析,为内容创作者、平台运营者与学术研究人员提供可操作的数据洞察与决策支持。
研究意义体现在以下三个方面:
(1)理论层面,B站作为弹幕文化与短视频融合的典型平台,其内容热度形成机制尚未得到系统化的理论阐释。本研究将多维度指标纳入统一分析框架,揭示不同内容属性与用户互动行为之间的因果关系,有助于丰富数字媒体传播学与网络文化研究的理论体系。
(2)方法层面,本文提出的并发爬虫与代理池管理技术、自动化清洗与特征工程流程、基于Dash的交互式可视化方案,为大规模网络视频数据的实时分析提供了可复制的技术范例,具有较强的推广价值与方法论意义。
(3)实践层面,系统生成的热度预测模型与多维度可视化报告,可帮助内容创作者快速识别潜在热点、评估内容质量,辅助平台运营者优化推荐策略,指导广告主精准投放,具有良好的社会经济效益。
1.4 本文组织结构
本文共分为六章,各章内容安排如下:
第一章为绪论,阐述研究背景、国内外研究现状、研究目的与意义,明确本文的研究问题与技术路线。
第二章为相关技术概述,系统介绍系统开发所涉及的核心技术,包括Python生态中的爬虫框架、数据处理库、机器学习库与可视化框架,以及数据库选型方案。
第三章为系统需求分析,从功能需求与非功能需求两个维度出发,详细定义系统的核心功能模块与性能指标要求。
第四章为系统设计,阐述系统的总体架构设计、数据库设计以及各功能模块的详细设计,包括数据采集模块、数据清洗模块、特征工程模块、预测模型模块与可视化模块。
第五章为系统实现,详细描述各模块的具体实现过程、关键算法与核心代码,并展示系统的主要界面与操作流程。
第六章为系统测试与结果分析,通过功能测试、性能测试与模型评估,验证系统的有效性、可靠性与实用性,并对实验结果进行分析与讨论。
最后为结论与展望,总结本文的研究成果与创新点,指出系统中存在的不足与未来改进方向。
二、相关技术概述
2.1 Python数据采集技术
Python语言凭借其丰富的第三方库生态,已成为数据采集领域的主流工具。本系统在数据采集环节主要采用以下技术:
Requests库是Python中最常用的HTTP客户端库,提供了简洁易用的API用于发送GET、POST等HTTP请求,支持自定义请求头、会话管理、代理设置等功能。本系统利用Requests库调用B站官方RESTful API,获取视频基本信息与播放量、点赞数等结构化数据。
Scrapy框架是一个功能强大的异步爬虫框架,支持分布式抓取、自动限速、数据管道与中间件扩展。本系统基于Scrapy构建弹幕与评论内容的爬虫子系统,利用其内置的并发请求调度机制提升抓取效率。
代理池技术是应对反爬策略的重要手段。本系统维护一个动态代理池,定期从免费或付费代理源获取可用代理,通过健康检查剔除失效代理,并在请求失败时自动切换代理进行重试,有效降低IP被封禁的风险。
2.2 Python数据处理与机器学习技术
Pandas是Python数据分析的核心库,提供了高性能的DataFrame数据结构,支持数据清洗、变换、聚合、合并等操作。本系统使用Pandas进行缺失值填补、异常值剔除、重复记录去重以及特征构造。
NumPy是Python科学计算的基础库,提供高效的多维数组运算与数学函数。本系统利用NumPy进行数值计算与矩阵运算,为机器学习模型提供数据支撑。
scikit-learn是Python最成熟的机器学习库,提供了丰富的预处理工具、特征提取方法以及分类、回归、聚类算法。本系统使用scikit-learn实现数据标准化、PCA降维、交叉验证以及模型评估。
XGBoost是梯度提升树算法的高效实现,在回归与分类任务中表现优异。本系统采用XGBoost构建视频热度回归模型,预测未来播放量与弹幕活跃度。
Prophet是Facebook开源的时间序列预测工具,能够自动处理趋势、季节性与节假日效应。本系统利用Prophet对视频播放量的时序数据进行建模与预测。
Transformers(Hugging Face) 提供了大量预训练语言模型,包括BERT、RoBERTa等。本系统使用BERT模型进行弹幕与评论的情感分类,利用其强大的语义理解能力提升情感分析精度。
2.3 数据可视化技术
Plotly是一个交互式图表库,支持折线图、散点图、热力图、雷达图等40余种图表类型,图表具有缩放、平移、悬停提示等交互特性。本系统使用Plotly生成动态可视化图表。
Dash是Plotly公司推出的Web应用框架,基于Flask、React与Plotly构建,允许纯Python开发者快速搭建数据仪表盘。本系统采用Dash构建交互式可视化前端,支持多维度筛选器、时间滑块与图表联动。
Matplotlib与Seaborn是Python最基础的静态图表库,适用于论文配图与离线报告生成。本系统使用Matplotlib与Seaborn生成高质量静态图表,用于导出与打印。
2.4 数据库技术
MySQL是广泛使用的关系型数据库管理系统,支持ACID事务、索引优化与外键约束。本系统使用MySQL存储视频基本信息、分类数据、日统计数据、弹幕内容、评论内容与预测结果,保证数据的持久化与一致性。
Redis是高性能的内存键值数据库,支持多种数据结构(字符串、哈希、列表、集合等)与持久化机制。本系统使用Redis缓存热点视频的实时统计数据,降低数据库查询压力,提升接口响应速度。
2.5 系统部署技术
Docker是轻量级的容器化平台,可将应用及其依赖打包为镜像,实现环境一致性与快速部署。本系统使用Docker容器化各微服务模块。
Kubernetes是容器编排平台,支持自动扩缩容、服务发现与负载均衡。本系统使用Kubernetes管理容器集群,保证系统在高并发访问下的稳定性。
三、系统需求分析
3.1 用户角色分析
本系统的目标用户群体包含以下四类角色:
(1)内容创作者:包括B站UP主及MCN机构运营人员。他们需要通过实时监测视频的播放量、弹幕互动量、点赞数与评论数,快速评估作品的受众反馈,识别内容亮点与改进空间,从而及时调整创作方向与发布策略。此外,创作者还期望通过热度趋势预测,规划最佳的发布时间与内容选题。
(2)平台运营者:包括B站内部数据分析团队与第三方平台服务商。他们关注热门视频的生命周期管理,需要获取热门视频的多维度数据报表与热度预测结果,以优化推荐算法、策划平台活动、提升用户粘性与平台活跃度。
(3)广告主与品牌方:包括品牌市场部门与广告代理公司。他们希望通过分析热门视频的观看时长分布、弹幕情感倾向以及评论主题分布,精准评估内容营销的投放价值,定位目标受众群体,并量化广告投放效果。
(4)学术研究人员:包括新闻传播学、计算机科学、社会学等领域的研究者。他们需要一个可复现的数据采集与处理流程,以便开展内容传播机制、社交网络影响力、文本情感演化等方面的理论实证研究。
3.2 功能需求分析
基于上述用户角色分析,系统需实现以下核心功能模块:
(1)数据采集模块:支持通过B站官方RESTful API获取视频基本信息(标题、上传时间、分类等)与互动指标(播放量、点赞数、评论数、弹幕数);同时通过自研爬虫抓取弹幕文本与评论内容。采集过程需支持多线程并发请求与代理池轮换,确保采集效率与稳定性。
(2)数据存储模块:采用MySQL关系型数据库存储结构化指标数据与文本数据;使用Redis缓存热点视频的实时统计数据;需实现数据备份与恢复机制,保证数据安全。
(3)数据清洗与预处理模块:对采集到的原始数据进行缺失值填补、异常值剔除、重复记录去重以及文本编码标准化;弹幕与评论文本需经过正则表达式过滤、jieba分词与停用词去除,生成高质量的词频矩阵。
(4)特征工程模块:从视频元数据(分类、上传时间等)、用户互动指标(播放量、弹幕量等)与文本内容三方面提取多维度特征;利用情感词典与BERT模型生成情感得分;采用LDA主题模型提取弹幕主题分布;构造播放量增长率、弹幕活跃度指数等衍生特征。
(5)热度预测模块:集成Prophet时间序列模型与XGBoost回归模型,对未来7天的视频播放量、弹幕量进行预测;支持模型训练、评估、更新与版本管理。
(6)可视化展示模块:基于Dash构建交互式Web仪表盘,支持时间序列折线图、热力图、雷达图、饼图等多种图表形式;提供视频标签、UP主、发布时间区间等多维度筛选器;支持图表联动与数据导出功能。
(7)系统管理模块:实现用户身份认证、权限控制、操作日志审计;提供数据脱敏与加密存储,确保隐私合规;实现监控告警机制,实时检测采集异常与模型漂移。
3.3 非功能需求分析
(1)性能需求:数据采集模块需支持不低于100个并发请求,日均抓取视频记录不少于10万条;可视化仪表盘页面加载时间不超过3秒,图表交互响应时间不超过1秒;热度预测模型训练时间控制在30分钟以内。
(2)可用性需求:系统需保证7×24小时稳定运行,核心服务可用性不低于99.5%;采集异常时需具备自动重试机制,数据库连接断开时需自动恢复。
(3)可扩展性需求:系统采用模块化分层架构,各功能模块之间低耦合、高内聚,便于后续功能扩展与维护;数据采集模块需支持新增数据源(如其他视频平台)的快速适配。
(4)安全性需求:用户密码需采用bcrypt或Argon2算法加密存储;弹幕与评论数据需进行脱敏处理,移除用户ID等个人标识信息;数据传输采用HTTPS协议加密;系统需防范SQL注入、XSS攻击等常见Web安全威胁。
(5)可维护性需求:代码需遵循PEP 8规范,关键函数与模块需包含详细文档字符串;系统日志需记录采集、清洗、预测等各环节的关键操作与异常信息,便于问题定位与性能调优。
四、系统设计
4.1 系统总体架构设计
本系统采用分层架构设计,自下而上划分为数据采集层、数据存储层、数据预处理层、特征工程层、模型预测层、可视化展示层与系统管理层,共七层。各层之间通过标准化接口进行通信,层间依赖关系明确,便于独立开发、测试与部署。
(1)数据采集层:位于系统最底层,负责从B站官方API与目标网页获取原始数据。该层包含API调用子模块、爬虫引擎子模块、代理池管理子模块与请求调度子模块。API调用子模块封装B站开放接口的请求逻辑,爬虫引擎基于Scrapy框架实现对弹幕与评论内容的抓取,代理池管理子模块维护可用代理列表并实现轮换策略,请求调度子模块控制并发度与请求频率。
(2)数据存储层:负责数据的持久化与缓存管理。采用MySQL作为主数据库存储结构化指标与文本数据,采用Redis作为缓存数据库存储热点视频的实时统计信息。该层还实现数据备份、事务管理与连接池管理功能。
(3)数据预处理层:对原始数据进行清洗与转换。具体包括缺失值处理(采用均值/中位数填补或删除)、异常值检测(基于IQR或Z‑score方法)、重复记录去重、文本编码标准化(统一为UTF‑8)、文本分词(jieba结合自定义词典)与停用词过滤。
(4)特征工程层:从清洗后的数据中提取建模所需的特征。该层包含数值特征提取(播放量、互动指标等)、文本特征提取(TF‑IDF向量、Word2Vec嵌入、BERT嵌入)、情感特征提取(基于情感词典与BERT分类器)以及主题特征提取(LDA主题分布)。最终将各类特征拼接为完整的特征矩阵。
(5)模型预测层:实现热度预测模型的训练、评估与推理。该层包含Prophet时间序列模型、XGBoost回归模型以及模型管理子模块(版本控制、在线更新、性能监控)。
(6)可视化展示层:基于Dash框架构建交互式Web仪表盘,提供图表渲染、筛选交互、报表导出等功能。该层通过RESTful API与后端数据服务进行通信。
(7)系统管理层:贯穿各层的横切关注点,包括用户认证与权限管理、审计日志、数据脱敏与加密、监控告警等。
系统数据流走向为:数据采集层抓取原始数据 → 存储层持久化 → 预处理层清洗转换 → 特征工程层构造特征矩阵 → 模型预测层训练与推理 → 可视化展示层呈现结果。各层之间通过消息队列或RESTful API进行异步通信,实现松耦合。
4.2 系统功能模块划分
系统共划分为以下六大功能模块:
| 模块名称 | 核心职责 | 主要子功能 |
|---|---|---|
| 数据采集模块 | 多源数据获取 | API调用、爬虫引擎、代理池管理、并发调度 |
| 数据存储模块 | 数据持久化与缓存 | MySQL存储、Redis缓存、事务管理、备份恢复 |
| 数据处理模块 | 数据清洗与特征构造 | 缺失填补、异常检测、文本分词、特征提取 |
| 热度预测模块 | 模型训练与热度预测 | Prophet模型、XGBoost模型、模型评估、在线预测 |
| 可视化展示模块 | 交互式图表与仪表盘 | 动态图表、多维度筛选、报表导出、实时刷新 |
| 系统管理模块 | 系统运维与安全 | 用户认证、权限控制、审计日志、监控告警 |
4.3 数据库设计
系统数据库采用MySQL,共设计六张核心数据表,表结构遵循第三范式(3NF),确保数据冗余最小化与一致性。
4.3.1 分类表(categories)
存储B站视频的内容分类信息。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| category_id | 分类ID | INT UNSIGNED | PRIMARY KEY, AUTO_INCREMENT | 唯一标识 |
| name | 分类名称 | VARCHAR(100) | NOT NULL | 如“动画”“知识” |
4.3.2 视频主表(videos)
存储视频的基本信息与累计互动指标。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| video_id | 视频ID | VARCHAR(36) | PRIMARY KEY | B站视频唯一标识 |
| title | 视频标题 | VARCHAR(255) | NOT NULL | — |
| upload_time | 上传时间 | DATETIME | NOT NULL | — |
| category_id | 分类ID | INT UNSIGNED | FOREIGN KEY → categories | — |
| views | 累计播放量 | BIGINT UNSIGNED | DEFAULT 0 | — |
| likes | 累计点赞数 | BIGINT UNSIGNED | DEFAULT 0 | — |
| comments_count | 累计评论数 | BIGINT UNSIGNED | DEFAULT 0 | — |
| danmaku_count | 累计弹幕数 | BIGINT UNSIGNED | DEFAULT 0 | — |
| created_at | 记录创建时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | — |
4.3.3 视频日统计表(video_stats)
按日期维度存储视频每日的互动统计数据,用于时间序列分析与趋势追踪。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| video_id | 视频ID | VARCHAR(36) | FOREIGN KEY → videos | 联合主键之一 |
| stat_date | 统计日期 | DATE | — | 联合主键之一 |
| views | 当日播放量 | BIGINT UNSIGNED | DEFAULT 0 | — |
| likes | 当日点赞数 | BIGINT UNSIGNED | DEFAULT 0 | — |
| comments_count | 当日评论数 | BIGINT UNSIGNED | DEFAULT 0 | — |
| danmaku_count | 当日弹幕数 | BIGINT UNSIGNED | DEFAULT 0 | — |
联合主键为 (video_id, stat_date),便于按视频和日期进行快速检索。
4.3.4 弹幕表(danmaku)
存储视频的弹幕文本内容,用于文本分析与情感挖掘。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| danmaku_id | 弹幕ID | VARCHAR(36) | PRIMARY KEY | 唯一标识 |
| video_id | 所属视频ID | VARCHAR(36) | FOREIGN KEY → videos | — |
| content | 弹幕内容 | TEXT | NOT NULL | 原始弹幕文本 |
| created_at | 弹幕发送时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | — |
4.3.5 评论表(comments)
存储视频的评论内容与情感分析结果。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| comment_id | 评论ID | VARCHAR(36) | PRIMARY KEY | 唯一标识 |
| video_id | 所属视频ID | VARCHAR(36) | FOREIGN KEY → videos | — |
| content | 评论内容 | TEXT | NOT NULL | 原始评论文本 |
| sentiment_score | 情感得分 | DECIMAL(5,3) | — | 范围 -1.000 ~ 1.000 |
| created_at | 评论发表时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | — |
4.3.6 预测结果表(predictions)
存储热度预测模型的输出结果,供可视化展示与历史回溯。
| 字段名 | 中文说明 | 数据类型 | 约束 | 备注 |
|---|---|---|---|---|
| prediction_id | 预测ID | VARCHAR(36) | PRIMARY KEY | 唯一标识 |
| video_id | 所属视频ID | VARCHAR(36) | FOREIGN KEY → videos | — |
| predict_date | 预测日期 | DATE | — | — |
| predicted_views | 预测播放量 | BIGINT UNSIGNED | DEFAULT 0 | — |
| predicted_danmaku | 预测弹幕量 | BIGINT UNSIGNED | DEFAULT 0 | — |
| created_at | 记录创建时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | — |
4.4 各模块详细设计
4.4.1 数据采集模块设计
数据采集模块采用生产者-消费者设计模式。生产者负责从B站API获取视频ID列表,并将待采集任务放入队列;消费者从队列中获取任务,执行具体的API调用或页面抓取操作。
API调用子模块:封装B站开放接口的请求逻辑,包括视频信息接口(/x/web-interface/view)、视频统计接口(/x/web-interface/stat)等。请求时需携带合法的User‑Agent与Referer头,并处理API返回的HTTP状态码与业务错误码。对于返回频率限制(如HTTP 412状态码),采用指数退避策略进行重试。
爬虫引擎子模块:基于Scrapy框架构建,针对弹幕历史记录接口(/x/v2/dm/history)与评论接口(/x/v2/reply)设计独立的Spider。爬虫通过模拟浏览器行为获取JSON数据,解析后通过Item Pipeline写入数据库。
代理池管理子模块:采用定时任务从代理源获取新代理,通过测试请求验证代理可用性(响应时间小于5秒、成功率高于80%),将有效代理存入Redis有序集合,按响应速度排序。每次请求时从集合中选取最优代理,请求失败后将该代理降权或移除。
并发调度子模块:使用asyncio与aiohttp实现异步并发请求,控制并发数不超过API限制阈值(如每秒20次)。对于爬虫任务,利用Scrapy内置的CONCURRENT_REQUESTS配置控制并发度。
4.4.2 数据清洗与预处理模块设计
数据清洗流程按以下步骤顺序执行:
(1)缺失值处理:检查各字段的缺失比例。对于视频标题、上传时间等关键字段缺失的记录直接丢弃;对于播放量、点赞数等数值字段,采用该字段的中位数进行填补;对于文本字段的缺失,填充为空字符串。
(2)异常值检测:基于箱线图的IQR方法检测数值异常,将超出[Q1 - 1.5×IQR, Q3 + 1.5×IQR]范围的值标记为异常,根据上下文决定剔除或修正。例如,播放量突增超过历史均值10倍且无对应事件驱动的记录,视为异常。
(3)重复记录去重:依据视频ID与统计日期的组合键进行去重,保留时间戳最新的一条记录。
(4)文本标准化:统一将文本转换为UTF‑8编码,使用正则表达式[\u4e00-\u9fa5a-zA-Z0-9]过滤非汉字、字母与数字字符(保留基本语义单元)。采用jieba分词库进行中文分词,加载自定义词典(包含B站特有词汇如“番剧”“up主”“一键三连”等),随后去除哈工大停用词表中的通用停用词。
4.4.3 特征工程模块设计
特征工程从数值特征、文本特征、情感特征与时间特征四个维度进行构造:
(1)数值特征:包括视频的原始互动指标(播放量、弹幕量、点赞数、评论数)以及衍生指标,如:
-
播放量增长率:
(views_t - views_{t-1}) / views_{t-1} -
弹幕活跃度指数:
danmaku_count / views -
点赞评论比:
likes / comments_count -
互动转化率:
(likes + comments_count + danmaku_count) / views
(2)文本特征:对弹幕与评论文本分别提取TF‑IDF特征向量(维度500),同时使用预训练的Word2Vec模型(基于B站语料训练)将文本映射为300维向量,并取均值作为文档嵌入。
(3)情感特征:采用基于SnowNLP的情感词典方法作为基线,结合微调的BERT情感分类模型(在B站评论数据集上微调)输出情感得分(-1至1),取弹幕集合的情感得分均值与标准差作为特征。
(4)时间特征:从上传时间提取年份、月份、星期几、小时段(如晚间黄金时段)、是否为节假日、是否为周末等特征。
最终,将上述所有特征拼接为一个高维特征矩阵,通过PCA或特征选择方法(基于XGBoost特征重要性)降维至200维,输入后续预测模型。
4.4.4 热度预测模块设计
热度预测模块包含两条技术路线,分别应对不同的应用场景:
(1)Prophet时间序列模型:适用于单条视频的播放量时序预测。将视频的历史日播放量数据构造为(ds, y)格式,其中ds为日期,y为播放量。Prophet模型自动拟合趋势项、季节项(年度、周度、日度)与节假日效应。通过调节changepoint_prior_scale与seasonality_prior_scale超参数控制模型灵活性。预测未来7天的播放量与置信区间。
(2)XGBoost回归模型:适用于批量视频的横向热度预测。将特征工程模块输出的特征矩阵作为输入,目标变量为未来第7天的播放量(取对数变换)。通过网格搜索优化n_estimators、max_depth、learning_rate等超参数,采用5折时间序列交叉验证(按时间顺序分割)评估泛化性能。模型输出预测值,并计算SHAP值进行特征重要性解释。
模型管理子模块支持模型持久化(pickle格式)、版本记录与定时重训(每周一次),以应对数据分布变化。
4.4.5 可视化展示模块设计
可视化展示模块基于Dash框架构建单页Web应用,布局分为筛选区域与图表区域两部分。
筛选区域:位于页面顶部,包含以下交互控件:
-
视频标签下拉选择器(多选)
-
分类名称下拉选择器
-
UP主名称搜索框(支持模糊匹配)
-
发布时间区间滑块(DatePickerRange)
-
热度指标切换按钮(播放量/弹幕量/点赞数/评论数)
图表区域:采用网格布局展示以下图表:
-
时间序列折线图:展示选定视频的播放量、弹幕量等指标随时间的变化趋势,支持多视频对比。
-
热力图:展示不同分类下视频的日均播放量分布,横轴为分类,纵轴为日期。
-
雷达图:展示单个视频在多维度指标(播放量、弹幕密度、情感得分、评论互动率等)上的综合表现。
-
主题分布饼图:展示弹幕LDA主题聚类后的各主题占比。
-
预测结果对比图:展示预测播放量与实际播放量的对比,附带置信区间带。
图表间实现联动交互,如点击折线图中的数据点,自动更新雷达图与主题分布图。所有图表支持PNG格式导出,筛选结果支持Excel报表下载。
4.4.6 系统安全与隐私保护设计
本系统严格遵守相关网络安全法规,在设计和实现中嵌入以下隐私保护机制:
(1)数据脱敏:在采集弹幕与评论数据时,对用户ID、用户昵称等个人标识信息进行哈希脱敏处理,仅保留匿名化的文本内容,不存储任何可直接或间接识别个人身份的信息。
(2)加密存储:系统密码采用bcrypt算法加盐哈希存储;数据库连接字符串、API密钥等敏感配置信息使用AES‑256加密后存入配置文件。
(3)访问控制:基于角色的访问控制(RBAC)模型,区分管理员、普通用户与访客三级权限,不同角色可访问的数据范围与操作权限不同。
(4)审计日志:记录所有用户的登录、数据导出、配置修改等关键操作,日志保存期限不少于180天,便于安全审计与追溯。
五、系统实现
5.1 开发环境与工具
本系统的开发与测试环境配置如下:
| 项目 | 规格 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS |
| CPU | Intel Xeon Gold 6254 (8核) |
| 内存 | 32GB DDR4 |
| 硬盘 | 512GB NVMe SSD |
| Python版本 | 3.10.12 |
| MySQL版本 | 8.0.35 |
| Redis版本 | 7.2.4 |
| Docker版本 | 24.0.7 |
| 主要Python库 | Requests 2.31.0, Scrapy 2.11.0, Pandas 2.0.3, NumPy 1.24.3, scikit-learn 1.3.0, XGBoost 2.0.1, Prophet 1.1.5, Transformers 4.35.0, Dash 2.14.0, Plotly 5.17.0 |
5.2 数据采集模块实现
5.2.1 B站API接口封装
系统封装的B站API核心接口如下:
(1)视频信息接口
-
端点:
https://api.bilibili.com/x/web-interface/view -
方法:GET
-
参数:
bvid(视频BVID) -
返回:视频标题、上传时间、分类ID、描述等
(2)视频统计接口
-
端点:
https://api.bilibili.com/x/web-interface/stat -
方法:GET
-
参数:
aid(视频AID) -
返回:播放量、点赞数、评论数、弹幕数等
(3)弹幕历史接口
-
端点:
https://api.bilibili.com/x/v2/dm/history -
方法:GET
-
参数:
type=1&oid={cid}&date={yyyy-mm-dd} -
返回:指定日期的弹幕XML文本
(4)评论接口
-
端点:
https://api.bilibili.com/x/v2/reply -
方法:GET
-
参数:
type=1&oid={aid}&pn={page}&ps={size} -
返回:评论列表(含内容、时间、点赞数等)
API调用核心代码示例如下:
python
复制
下载
import requests
import time
from typing import Dict, Optional
class BiliAPIClient:
def __init__(self, proxy_pool=None, max_retries=3):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (compatible; BiliAnalyzer/1.0)',
'Referer': 'https://www.bilibili.com/'
})
self.proxy_pool = proxy_pool
self.max_retries = max_retries
self.base_url = 'https://api.bilibili.com'
def get_video_stat(self, aid: int) -> Optional[Dict]:
"""获取视频统计信息"""
url = f'{self.base_url}/x/web-interface/stat'
params = {'aid': aid}
for attempt in range(self.max_retries):
try:
proxy = self.proxy_pool.get_proxy() if self.proxy_pool else None
resp = self.session.get(url, params=params,
proxies=proxy, timeout=10)
if resp.status_code == 200:
data = resp.json()
if data.get('code') == 0:
return data.get('data')
elif resp.status_code == 412: # 频率限制
time.sleep(2 ** attempt) # 指数退避
continue
except Exception as e:
print(f'Request failed (attempt {attempt+1}): {e}')
time.sleep(1)
return None
5.2.2 爬虫实现
基于Scrapy框架实现弹幕爬虫,核心逻辑如下:
python
复制
下载
import scrapy
import re
from datetime import datetime, timedelta
class DanmakuSpider(scrapy.Spider):
name = 'danmaku'
def __init__(self, video_id=None, start
下方名片联系我即可~大家点赞、收藏、关注、评论啦 、查看下方👇🏻获取联系方式👇🏻

1373

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



