网易云数据可视化分析
项目概述
网易云数据可视化分析系统是一个基于Flask框架开发的Web应用,旨在对网易云音乐平台的用户、歌曲、专辑、歌单等数据进行全面的可视化分析。该系统通过直观的图表、表格和词云等形式,展示网易云音乐的数据分布特征,为用户提供数据洞察。
系统功能
1. 用户认证与权限管理
- 用户登录/注册: 支持普通用户账号的创建和登录
- 邮箱验证与密码规则检查
- 自动识别用户类型,区分普通用户和管理员
- 安全的密码存储机制
- 管理员认证: 提供管理员账户注册和登录功能
- 专属注册入口与验证码保护
- 对管理员操作进行日志记录
- 权限控制: 基于角色的访问控制,管理员可访问后台管理系统
- 细粒度的访问权限设计
- 操作权限动态检查
- 敏感操作的二次验证
2. 数据可视化分析
2.1 首页概览
- 数据量统计: 显示系统中收集的总数据量
- 歌手、专辑、歌曲、评论等各类数据统计
- 数据增长趋势分析
- 热门数据概览: 展示粉丝最多的歌手、歌曲最多的专辑等信息
- 热门歌手榜单与粉丝数量对比
- 热门专辑排行与歌曲数量分布
- 时间区间分析: 展示歌曲时长的分布区间
- 不同时长区间的歌曲数量统计
- 各区间受欢迎程度对比
- 专辑发行年份分析: 通过柱状图展示不同年份专辑发行数量
- 按年度和月度的发行数量分析
- 发行高峰期与低谷期的对比研究
- 歌曲时长分布: 通过饼图展示不同时长区间的歌曲分布
- 基于时长区间的分类统计
- 不同时长区间歌曲的受欢迎程度分析
2.2 专业分析图表
- 用户所在地区分析: 通过地图可视化展示用户地理分布
- 省级和市级用户分布热力图
- 不同地区用户偏好对比
- 地区活跃度分析
- 粉丝数量分析: 展示不同歌手的粉丝数量对比
- 按歌手类别(华语/欧美/日韩)的粉丝分布
- 按歌手性别(男/女/组合)的粉丝数量对比
- 粉丝增长趋势分析
- 专辑发行时间分析: 分析专辑发行的时间趋势
- 按年度发行量变化曲线
- 不同发行公司的专辑数量对比
- 季节性发行规律分析
- 歌曲时长分析: 详细分析歌曲时长的分布特征
- 不同风格歌曲的时长特征对比
- 热门歌曲时长集中区间分析
- 时长与受欢迎程度的相关性研究
- 用户性别分析: 分析用户性别比例分布
- 不同年龄段的性别比例
- 不同地区的性别分布特征
- 性别与音乐偏好的关联分析
- 歌单收听量分析: 分析歌单的收听量数据分布
- 高收听量歌单的共性特征
- 收听量与歌单创建时间的关联
- 收听量与歌单类型的关系分析
2.3 词云分析
- 评论词云: 基于用户评论数据生成词云,直观展示热门评论关键词
- 智能情感分析,区分正面和负面评论
- 中英文评论分离处理
- 评论热词随时间变化的趋势分析
- 歌词词云: 基于歌曲歌词数据生成词云,展示热门歌词关键词
- 中英文歌词的平衡处理与展示
- 不同流派歌词特征对比
- 歌词热词与社会热点的关联分析
2.4 搜索功能
- 专辑搜索: 支持按关键词搜索专辑信息
- 模糊匹配与精准搜索
- 多维度过滤(发行年份、歌手、公司等)
- 搜索结果排序与分页展示
- 歌手搜索: 支持按歌手名称、流派、地区等维度搜索
- 歌手详情实时展示
- 相似歌手推荐
- 歌曲搜索: 支持按歌名、歌词片段、风格等搜索
- 歌曲属性多维度展示
- 相关歌曲推荐
- 用户搜索: 管理员可搜索系统用户信息
- 用户活跃度分析
- 用户偏好展示
3. 后台管理系统
- 用户管理: 管理系统用户账号
- 用户权限分配
- 用户状态监控
- 用户操作日志查询
- 歌手管理: 管理歌手数据,支持编辑和查看
- 歌手分类与标签管理
- 歌手详细信息编辑
- 歌手关联数据查看
- 专辑管理: 管理专辑数据,支持编辑和详情查看
- 专辑封面与信息管理
- 专辑歌曲列表管理
- 专辑发行信息编辑
- 歌曲管理: 管理歌曲信息,包括歌词等详细数据
- 歌词内容编辑与校正
- 歌曲音频信息管理
- 歌曲标签与分类编辑
- 歌单管理: 管理用户歌单信息
- 歌单内容审核
- 歌单分类与推荐设置
- 歌单流行度分析
- 评论管理: 管理用户评论数据
- 评论内容审核
- 敏感评论过滤
- 评论热度分析
4. 交互功能
- 专辑详情展示: 展示专辑封面、发行信息等详细内容
- 专辑封面高清展示
- 专辑发行信息展示
- 专辑歌曲列表交互
- 分页浏览: 支持大量数据的分页浏览
- 自适应分页控件
- 页面大小动态调整
- 数据缓存与预加载
- AI助手集成: 底部集成了基于星火大模型的AI聊天助手
- 音乐推荐智能问答
- 数据分析结果解释
- 个性化音乐推荐
技术实现
1. 开发环境与依赖
- 后端框架: Flask 3.1.0
- 数据库: MySQL (PyMySQL 1.1.1)
- ORM框架: SQLAlchemy 2.0.40, Flask-SQLAlchemy 3.1.1
- 模板引擎: Jinja2 3.1.6
- 前端组件:
- Bootstrap
- jQuery
- ECharts (数据可视化图表库)
- MetisMenu (菜单控件)
- Feather Icons (图标库)
- 数据处理:
- Pandas 2.2.3 (数据分析库)
- NumPy 2.2.5 (科学计算库)
- 可视化工具:
- Matplotlib 3.10.1
- WordCloud 1.9.4 (词云生成)
- 其他依赖:
- Flask-Admin 1.6.1 (后台管理模块)
- Flask-WTF 1.2.2 (表单处理)
- Redis 5.2.1 (缓存支持)
- scikit-learn 1.4.1 (机器学习算法库)
- BeautifulSoup 4.12.3 (HTML解析)
- Requests 2.31.0 (HTTP请求库)
- Crypto 1.4.1 (加密算法库)
2. 项目架构
2.1 代码结构
网易云可视化/
├── app.py # 主应用入口
├── requirements.txt # 项目依赖
├── templates/ # 前端模板
│ ├── index.html # 首页模板
│ ├── login.html # 登录页面
│ ├── register.html # 注册页面
│ ├── admin/ # 管理后台模板
│ └── ... # 其他页面模板
├── static/ # 静态资源
│ ├── css/ # 样式文件
│ ├── js/ # JavaScript文件
│ ├── image/ # 图片资源
│ ├── font/ # 字体文件
│ └── ... # 其他静态资源
├── utils/ # 工具模块
│ ├── utils.py # 通用工具函数
│ ├── query.py # 数据库查询函数
│ ├── getIndexData.py # 首页数据处理
│ ├── getAlbumData.py # 专辑数据处理
│ ├── getWorldCouldData.py # 词云数据处理
│ ├── getRegionData.py # 地区数据处理
│ ├── getGenderData.py # 性别数据处理
│ ├── getFansData.py # 粉丝数据处理
│ ├── getPlaylistData.py # 歌单数据处理
│ ├── getSongsData.py # 歌曲数据处理
│ └── getSearchData.py # 搜索功能支持
├── data/ # 数据文件
│ ├── origin_data/ # 原始数据
│ ├── filtered_data/ # 处理后的数据
│ └── progress/ # 爬虫进度记录
└── spider/ # 数据爬虫
├── crawl.py # 爬虫核心功能
├── get_data.py # 数据获取与存储
└── read_headers.py # 请求头处理
2.2 数据库设计
系统使用MySQL数据库,主要包含以下表结构:
user: 存储用户账号信息
- id: 用户ID (主键)
- email: 用户邮箱
- password: 密码
- role: 用户角色 (admin/user)
artists: 歌手表
- artist_id: 歌手ID (主键)
- artist_name: 歌手名称
- artist_url: 歌手主页链接
- fan_count: 粉丝数量
- bio_TEXT: 歌手简介
albums: 专辑表
- album_id: 专辑ID (主键)
- album_name: 专辑名称
- album_cover: 封面图片链接
- album_url: 专辑链接
- song_count: 歌曲数量
- release_date: 发行日期
- release_company: 发行公司
- artist_id: 歌手ID (外键)
songs: 歌曲表
- song_id: 歌曲ID (主键)
- song_name: 歌曲名称
- song_url: 歌曲链接
- duration: 歌曲时长 (毫秒)
- artist_id: 歌手ID (外键)
- album_id: 专辑ID (外键)
- lyrics: 歌词
- commentThreadId: 评论ID
playlists: 歌单表
- playlist_id: 歌单ID (主键)
- playlist_name: 歌单名称
- playlist_url: 歌单链接
- create_date: 创建日期
- listen_count: 收听次数
- song_count: 歌曲数量
- description: 歌单描述
- user_id: 用户ID (外键)
comments: 评论表
- comment_id: 评论ID (主键)
- comment_content: 评论内容
- like_count: 点赞数
- comment_date: 评论日期
- timeStr: 评论时间字符串
- user_id: 用户ID (外键)
- song_id: 歌曲ID (外键)
3. 核心实现细节
3.1 爬虫模块实现
爬虫模块是系统数据获取的核心,通过以下几个主要组件实现:
- 数据加密与接口请求:
- 采用与网易云音乐官方一致的AES加密算法处理请求参数
- 模拟用户登录状态,获取包含完整数据的响应
- 自动处理请求头与Cookie管理,防止被反爬
# AES加密实现示例
def get_params(data):
first = enc_params(data, g)
second = enc_params(first, i)
return second
def enc_params(data, key):
iv = "0102030405060708"
data = to_16(data)
aes = AES.new(key=key.encode("utf-8"), IV=iv.encode("utf-8"), mode=AES.MODE_CBC)
bs = aes.encrypt(data.encode("utf-8"))
return str(b64encode(bs), "utf-8")
多维度数据采集:
- 歌手采集: 按照华语、欧美、日韩等类别分类爬取
- 专辑采集: 通过歌手ID获取其所有专辑信息
- 歌曲采集: 从专辑中获取完整歌曲列表与详情
- 歌词获取: 通过歌曲ID调用专门接口获取完整歌词
- 评论抓取: 获取歌曲热门评论,包括点赞数、时间等信息
- 用户信息: 从评论中提取用户ID并获取用户详情
- 歌单数据: 获取用户创建的歌单及歌单详情
断点续传与进度管理:
- 使用本地文件记录已爬取的ID,支持中断后从断点继续
- 采用增量更新策略,避免重复爬取相同数据
- 实时记录爬取进度,便于监控与管理
异常处理与容错机制:
- 针对网络波动实现自动重试
- 对不同类型的API错误实现分类处理
- 数据缺失时采用优雅降级策略
数据存储与清洗:
- 采用CSV作为中间存储格式,支持数据增量更新
- 使用Pandas进行数据清洗与标准化
- 处理编码问题,确保中英文混合数据正确存储
3.2 数据处理与预处理
系统通过utils模块中的各种数据处理函数对原始数据进行清洗和转换:
- 数据加载: 使用Pandas从MySQL数据库加载数据
- 数据清洗: 处理缺失值、异常值,确保数据质量
- 数据转换: 处理时间格式、类别标签等
- 数据分组: 按照不同维度进行数据聚合分析
例如,处理歌曲时长分布:
df_songs_chart = df_songs.dropna(subset=['duration']).copy()
df_songs_chart['duration_min'] = df_songs_chart['duration'] / (1000 * 60)
df_songs_chart['duration_min'] = df_songs_chart['duration_min'].round(2)
bins = [0, 1, 2, 3, 4, 5, 6, float('inf')]
labels = ['0-1分钟', '1-2分钟', '2-3分钟', '3-4分钟', '4-5分钟', '5-6分钟', '6分钟以上']
df_songs_chart['duration_category'] = pd.cut(
df_songs_chart['duration_min'],
bins=bins,
labels=labels,
right=False
)
3.3 数据分析算法实现
系统使用多种数据分析算法处理音乐数据:
文本分析算法:
- 词云生成: 使用jieba分词和WordCloud库实现中英文混合词云生成
def getLyrics(): lyrics_df = df_songs.dropna(subset=['lyrics']) # 中英文平衡处理 def is_chinese_dominant(text): chinese_chars = len(re.findall(r'[\u4e00-\u9fff]', text)) english_chars = len(re.findall(r'[a-zA-Z]', text)) return chinese_chars > 0.3 * (chinese_chars + english_chars) # 分类并合并歌词 chinese_lyrics = [] english_lyrics = [] for lyrics in lyrics_df['lyrics']: if is_chinese_dominant(lyrics): chinese_lyrics.append(lyrics) else: english_lyrics.append(lyrics) # 平衡处理 if len(chinese_lyrics) > 0 and len(english_lyrics) > 0: min_len = min(len(chinese_lyrics), len(english_lyrics)) if len(chinese_lyrics) > min_len: import random random.shuffle(chinese_lyrics) chinese_lyrics = chinese_lyrics[:min_len*2] if len(english_lyrics) > min_len: import random random.shuffle(english_lyrics) english_lyrics = english_lyrics[:min_len*2] # 合并所有歌词 combined_lyrics = ' '.join(chinese_lyrics + english_lyrics) return combined_lyrics
- 情感分析: 使用词典匹配和机器学习模型分析评论情感倾向
- 主题提取: 使用LDA模型对歌词进行主题聚类分析
统计分析算法:
- 地区分布分析: 使用地理数据聚合和热力图展示用户地区分布
def getRegionData(): regionList = df_users_chart['所属市'] regionList = regionList.dropna().reset_index(drop=True) regionObj = {} # 统计每个区域出现的次数 for region in regionList: if region not in regionObj: regionObj[region] = 1 else: regionObj[region] += 1 # 排序,按出现次数降序排列 sorted_region = sorted(regionObj.items(), key=lambda item: item[1], reverse=True) top_region = dict(sorted_region) # 创建Echart数据 regionEchartData = [] for key, value in top_region.items(): regionEchartData.append({ 'name': key, 'value': value }) return regionEchartData
3.4 可视化实现
系统主要使用ECharts库实现数据可视化:
- 柱状图: 展示专辑发行年份分布
- 饼图: 展示歌曲时长分布
- 地图可视化: 展示用户地理分布
- 表格展示: 展示专辑详细信息
- 热力图: 展示用户活跃度分布
- 雷达图: 多维度音乐特征对比
- 关系图: 展示歌手合作网络
词云使用WordCloud库实现:
wordcloud = WordCloud(
width=1000,
height=400,
background_color='white',
font_path=font_path,
max_words=200,
collocations=False
).generate(lyrics_text)
3.5 用户认证与安全
- 密码安全: 登录和注册时校验密码强度
- 使用密码哈希存储而非明文
- 密码强度实时检测与提示
- 防止常见安全漏洞如SQL注入
- 表单验证: 使用Flask-WTF进行表单验证
- 服务端完整性验证
- 客户端JavaScript预验证
- 错误信息友好展示
- CSRF保护: 防止跨站请求伪造攻击
- 所有表单添加CSRF令牌
- 敏感操作二次验证
- 会话超时自动登出
- 会话管理: 使用Flask session管理用户会话
- 加密Cookie存储
- 会话状态管理
- 安全的登出机制
3.6 后台管理
使用Flask-Admin框架实现后台管理系统:
- 模型视图: 为每个数据模型创建自定义管理视图
- 自定义列表展示
- 自定义表单验证
- 自定义数据过滤器
- 权限控制: 基于角色的访问控制
- 访问权限检查钩子
- 操作日志记录
- 角色基础的界面定制
- 数据展示: 自定义字段展示和格式化
- 格式化日期、时间等字段
- 封面图片预览功能
- 歌词内容分段展示
- 数据操作: 支持数据的增删改查
- 批量操作支持
- 数据导入导出功能
- 操作确认与撤销机制
3.7 前端交互
- 响应式设计: 适配不同屏幕尺寸
- 基于Bootstrap的栅格系统
- 媒体查询自适应布局
- 移动端友好的交互设计
- 分页功能: 实现数据的分页浏览
- 异步加载分页内容
- 自定义每页显示数量
- 记住用户浏览位置
- 动态加载: 使用AJAX技术实现部分内容的动态加载
- 图表数据异步加载
- 无刷新内容更新
- 加载状态反馈
- 表单交互: 实现表单提交和验证
- 实时表单验证
- 提交前数据预检
- 提交结果即时反馈
3.8 AI助手集成
系统底部集成了基于星火大模型的AI聊天助手:
- 实时对话: 提供即时响应
- WebSocket实时通信
- 流式响应生成
- 打字机效果展示
- 错误处理: 提供备用连接和错误处理机制
- 自动重连机制
- 超时与失败处理
- 降级响应策略
- 用户界面: 友好的聊天界面设计
- 气泡式对话框
- 历史消息滚动
- 响应中状态指示
部署指南
MAC环境部署
- 克隆项目到本地
- 安装Python 3.x环境
- 安装依赖包:
pip install -r requirements.txt
- 配置MySQL数据库:
mysql -u root -p # 输入密码chuankangkk CREATE DATABASE net_music; # 导入数据 (根据实际情况导入)
- 启动应用:
python app.py
- 访问 http://127.0.0.1:5001
Windows环境部署
- 克隆项目到本地
- 安装Python 3.x环境
- 安装依赖包:
pip install -r requirements.txt
- 配置MySQL数据库:
- 使用MySQL Workbench或命令行创建数据库
- 导入数据
- 修改数据库连接配置(如有必要):
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:密码@localhost/net_music'
- 启动应用:
python app.py
- 访问 http://127.0.0.1:5001
项目特色
- 全面的数据分析: 从多个维度对网易云音乐数据进行分析
- 直观的可视化效果: 使用各种图表形式直观展示数据特征
- 完善的用户权限控制: 区分普通用户和管理员权限
- 强大的后台管理功能: 提供完善的数据管理能力
- 良好的用户交互体验: 响应式设计和友好的界面
- AI助手支持: 集成智能对话助手,提升用户体验
- 先进的爬虫技术: 高效获取网易云音乐平台数据
- 精准的数据分析算法: 应用多种统计与机器学习算法
- 细致的数据可视化: 多种形式展示数据洞察结果
- 安全的系统架构: 注重数据安全与用户隐私保护
作者
B站/咸鱼: 万能程序员
截图: