【Python实战】基于Flask+TensorFlow的网易云音乐数据分析系统:从数据爬取到情感分析的全流程实现
本文将详细介绍如何使用Python构建一个完整的网易云音乐数据分析系统,涵盖数据爬虫、Web开发、数据可视化、词云生成和深度学习情感分析等多个技术点。
📌 前言
在当今大数据时代,音乐平台积累了海量的用户行为数据和内容数据。如何从这些数据中挖掘有价值的信息,成为了数据分析领域的热点话题。本文将带大家从零开始,构建一个功能完整的网易云音乐数据分析系统。
🎯 项目概述
本项目是一个基于 Flask + TensorFlow 的Web应用系统,主要功能包括:
- 数据爬虫:使用Selenium爬取网易云音乐的歌单、歌曲、评论等数据
- 数据可视化:通过ECharts展示语种分布、情感分布、用户画像等多维度数据
- 词云生成:基于歌词和评论生成精美的词云图
- 情感分析:使用深度学习模型对评论进行情感分类
技术栈
- 后端:Flask 3.0.0、SQLite、TensorFlow 2.15.0
- 前端:Bootstrap、ECharts、jQuery
- 数据处理:jieba、WordCloud、NumPy、Pandas
- 爬虫:Selenium
🏗️ 一、项目架构设计
1.1 目录结构
music/
├── app.py # Flask主应用
├── requirements.txt # 依赖包
├── data/ # 数据存储
│ └── NEC_Music.db # SQLite数据库
├── based/ # 核心模块
│ ├── data_manager.py # 数据管理
│ ├── model.py # 模型训练
│ ├── predict_demo.py # 预测接口
│ └── network/ # 神经网络
├── dataspider/ # 爬虫模块
├── static/ # 静态资源
└── templates/ # HTML模板
1.2 数据库设计
系统采用SQLite数据库,主要包含以下数据表:
playlist_info:歌单详细信息songs_info:歌曲信息(含歌词)comments_info:评论信息(含用户画像)author_info:用户/作者信息count_all:统计数据汇总
🕷️ 二、数据爬虫实现
2.1 爬虫架构
由于网易云音乐使用JavaScript动态加载内容,我们使用Selenium进行浏览器自动化爬取。爬虫模块按功能分为:
- 歌单列表爬虫 (
01playlist.py) - 歌单详情爬虫 (
02playlist_info.py) - 作者信息爬虫 (
03author_info.py) - 歌曲信息爬虫 (
04songs_info.py) - 评论信息爬虫 (
05comments_info.py)
2.2 核心代码示例
python
# dataspider/01playlist.py
import time
import random
from selenium import webdriver
import sqlite3
def get_playlist_url(db_path):
"""爬取歌单列表页面的所有歌单URL"""
browser = webdriver.Chrome('chromedriver.exe')
page_one_url = 'https://music.163.com/#/discover/playlist/...'
while next_page_url != 'javascript:void(0)':
browser.get(next_page_url)
time.sleep(random.randint(8, 12)) # 模拟人类操作
# 切换到iframe
iframe = browser.find_element_by_class_name('g-iframe')
browser.switch_to.frame(iframe)
# 提取歌单信息
item_all = browser.find_elements_by_xpath('//ul[@id="m-pl-container"]/li')
for item in item_all:
list_url = item.find_element_by_xpath('./p[@class="dec"]/a').get_attribute('href')
list_name = item.find_element_by_xpath('./p[@class="dec"]/a').get_attribute('title')
# ... 保存到数据库
# 获取下一页URL
next_page_url = browser.find_element_by_xpath('...').get_attribute('href')
关键技术点:
- iframe切换:网易云使用iframe嵌套,需要先切换到iframe才能定位元素
- 随机延迟 :使用
random.randint(8, 12)模拟人类操作,避免被反爬 - 分页处理:循环遍历所有分页,直到没有下一页
- 数据持久化:使用SQLite存储爬取的数据
🌐 三、Flask Web应用开发
3.1 Flask路由设计
python
# app.py
from flask import Flask, render_template, request
from flask_caching import Cache
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
@app.route('/')
def index():
"""首页:显示数据统计和精彩评论"""
conn = sqlite3.connect('data/NEC_Music.db')
cur = conn.cursor()
# 查询统计数据
sql = 'select * from count_all'
# ... 返回渲染模板
return render_template('index.html', count=result_list, datalist=datalist)
@app.route('/language_charts')
@cache.cached(timeout=600) # 缓存10分钟
def language_charts():
"""语种分布分析"""
# 按语种统计数据
songs_language = ['日语', '粤语', '韩语', '欧美', '华语']
# ... 返回图表数据
3.2 缓存优化
使用Flask-Caching对视图函数进行缓存,减少数据库查询次数:
python
@app.route('/playlist')
@cache.cached(timeout=600) # 10分钟缓存
def playlist():
# 数据查询逻辑
pass
优势:
- 提升响应速度
- 降低数据库负载
- 改善用户体验
📊 四、数据可视化实现
4.1 ECharts集成
使用ECharts进行数据可视化,支持多种图表类型:
javascript
// templates/language_charts.html
var myChart = echarts.init(document.getElementById('main'));
var option = {
title: { text: '语种分布分析' },
tooltip: { trigger: 'axis' },
legend: { data: ['歌单数', '歌曲数', '播放量', '收藏数'] },
xAxis: {
type: 'category',
data: ['日语', '粤语', '韩语', '欧美', '华语']
},
yAxis: { type: 'value' },
series: [
{
name: '歌单数',
type: 'line',
data: {{ list_count | tojson }}
},
// ... 其他系列
]
};
myChart.setOption(option);
4.2 可视化维度
系统提供以下可视化分析:
- 语种分布:对比不同语种的数据指标
- 情感标签:分析怀旧、清新、浪漫等情感分布
- 用户年龄分布:直方图展示用户年龄段
- 听歌量-年龄关系:散点图分析听歌行为
☁️ 五、词云生成
5.1 中文分词处理
使用jieba进行中文分词:
python
# app.py
import jieba
from wordcloud import WordCloud
from PIL import Image
import numpy as np
@app.route('/refresh_all_lyric_word')
def refresh_all_lyric_word():
# 从数据库读取歌词
conn = sqlite3.connect('data/NEC_Music.db')
sql = "select lyric from songs_info ... where list_tags like '%华语%'"
text = ""
for lyric in table:
clean_text = lyric[0]
# 数据清洗:去除制作人、作词等无关信息
clean_text = clean_text.replace('制作人', '').replace('作词', '')...
text += clean_text
# jieba分词
lyric_cut = jieba.cut(text)
lyric_str = ' '.join(lyric_cut)
# 生成词云
img = Image.open('static/img/wordcloud/backgroud/bg_lyric.jpg')
img_array = np.array(img)
wc = WordCloud(
background_color='white',
mask=img_array,
font_path='msyh.ttc' # 中文字体
)
wc.generate_from_text(lyric_str)
# 保存图片
plt.imshow(wc)
plt.axis('off')
plt.savefig('static/img/wordcloud/all_lyric_word.jpg', dpi=500)
5.2 词云功能
- 全量歌词词云:分析所有华语歌词的高频词汇
- 热门评论词云:展示热门评论的核心关键词
- 自定义歌曲词云:支持指定歌曲生成评论词云
🧠 六、深度学习情感分析
6.1 模型架构
使用**SimpleRNN(简单循环神经网络)**进行文本情感分类:
python
# based/network/simplernn.py
import tensorflow as tf
from tensorflow.keras import layers
class MySimpleRNN(tf.keras.Model):
def __init__(self, num_classes, vocab_size, sentens_length, embeding_dim):
super(MySimpleRNN, self).__init__()
# 词嵌入层
self.embeding = layers.Embedding(vocab_size, embeding_dim,
input_length=sentens_length,
mask_zero=True)
# RNN层
self.simple_rnn = layers.SimpleRNN(128, activation='tanh', use_bias=True)
# 全连接层
self.fc1 = layers.Dense(num_classes, activation=None, use_bias=False)
# Softmax层
self.softmax = layers.Softmax()
def call(self, x):
x = self.embeding(x) # 词向量化
x = self.simple_rnn(x) # RNN处理序列
x = self.fc1(x) # 全连接
x = self.softmax(x) # 概率输出
return x
6.2 模型训练
python
# based/model.py
class MovieReviewsRNNModel():
def train(self, epochs=150):
# 构建词汇表
self.word2id = dm.build_word2id(...)
# 创建模型
self.model = simplernn.MySimpleRNN(...)
# 训练循环
for epoch in range(epochs):
# 前向传播
out = self.model(inputs)
# 计算损失
loss = tf.keras.losses.categorical_crossentropy(labels, out)
# 反向传播
grads = tape.gradient(loss, self.model.trainable_variables)
self.opt.apply_gradients(zip(grads, self.model.trainable_variables))
6.3 预测接口
python
# based/predict_demo.py
def predict_sentences(sentence):
"""对输入文本进行情感分类"""
# 文本预处理:分词、转ID序列
content = [word2id.get(w, 0) for w in sentence.split()]
content = content[:max_sen_len]
# 填充到固定长度
if len(content) < max_sen_len:
content += [word2id['_PAD_']] * (max_sen_len - len(content))
# 模型预测
content = np.array(content).reshape(1, -1)
out = model.predict(content)
cls = np.argmax(out, axis=1)[0]
return labels[cls] # 返回"正面"或"负面"
6.4 Web接口集成
python
# app.py
@app.route('/sentiment_analysis', methods=['POST', 'GET'])
def sentiment_analysis():
analysis_pl = '评论'
if request.method == 'POST':
analysis_pl = request.form['pl']
# jieba分词
lyric_cut = jieba.cut(analysis_pl)
lyric_str = ' '.join(lyric_cut)
# 调用预测函数
predict = predict_sentences(lyric_str)
return render_template("sentiment_analysis.html",
predict=predict,
analysis_pl=analysis_pl)
📈 七、系统效果展示
7.1 数据统计页面
首页展示核心数据指标:
- 歌单总数
- 歌曲总数
- 评论总数
- 精彩评论统计
7.2 可视化图表
- 语种分布分析:多指标对比折线图
- 情感标签分析:情感类型数据分布
- 用户画像:年龄、注册时间等维度分析
7.3 词云效果
支持多种词云生成场景,自定义背景图片,高分辨率输出。
7.4 情感分析
实时输入评论文本,快速返回情感分类结果(正面/负面)。
🔧 八、部署与运行
8.1 环境配置
bash
# 安装依赖
pip install -r requirements.txt
# 主要依赖
# flask==3.0.0
# tensorflow==2.15.0
# jieba==0.42.1
# wordcloud==1.9.3
# matplotlib==3.8.2
8.2 数据准备
-
运行爬虫(按顺序执行):
bashpython dataspider/01playlist.py python dataspider/02playlist_info.py # ... 其他爬虫脚本 -
或使用已有数据库 :将
NEC_Music.db放入data/目录
8.3 启动应用
bash
python app.py
访问 http://127.0.0.1:5000
💡 九、技术难点与解决方案
9.1 反爬虫应对
- 问题:网易云有反爬机制,直接请求容易被封
- 解决:使用Selenium模拟浏览器,添加随机延迟,模拟人类操作
9.2 中文文本处理
- 问题:中文分词和词云生成需要特殊处理
- 解决:使用jieba进行分词,配置中文字体(msyh.ttc)生成词云
9.3 模型加载优化
- 问题:TensorFlow模型首次加载较慢
- 解决:使用Flask-Caching缓存预测结果,必要时预加载模型
9.4 大数据量处理
- 问题:词云生成、数据查询可能较慢
- 解决:使用缓存机制、数据库索引优化、分批处理
🎓 十、项目总结
本项目整合了多个技术栈,实现了从数据获取到数据分析的完整流程:
- 数据采集:使用Selenium进行网页爬虫
- 数据存储:SQLite数据库管理
- Web开发:Flask框架构建Web应用
- 数据可视化:ECharts展示多维度数据
- 文本分析:jieba分词 + WordCloud词云
- 深度学习:TensorFlow构建RNN情感分析模型
技术收获
- ✅ 掌握Selenium网页自动化爬虫
- ✅ 熟悉Flask Web开发流程
- ✅ 学会使用ECharts进行数据可视化
- ✅ 理解RNN在文本分类中的应用
- ✅ 掌握中文文本处理和词云生成
适用场景
- 📚 数据挖掘课程实践项目
- 💼 数据分析师作品集
- 🎓 毕业设计项目
- 🔬 音乐数据研究
📚 参考资源
⚠️ 免责声明
本项目仅用于学习研究,数据来源于网易云音乐。请遵守相关法律法规和网站使用协议,不要用于任何商业用途。
如果这篇文章对你有帮助,欢迎点赞、收藏、转发! 🙏
有任何问题欢迎在评论区讨论,我会及时回复。
#Python #Flask #TensorFlow #数据爬虫 #数据分析 #深度学习 #情感分析 #词云