【Python实战】基于Flask+TensorFlow的网易云音乐数据分析系统:从数据爬取到情感分析的全流程实现

【Python实战】基于Flask+TensorFlow的网易云音乐数据分析系统:从数据爬取到情感分析的全流程实现

本文将详细介绍如何使用Python构建一个完整的网易云音乐数据分析系统,涵盖数据爬虫、Web开发、数据可视化、词云生成和深度学习情感分析等多个技术点。

📌 前言

在当今大数据时代,音乐平台积累了海量的用户行为数据和内容数据。如何从这些数据中挖掘有价值的信息,成为了数据分析领域的热点话题。本文将带大家从零开始,构建一个功能完整的网易云音乐数据分析系统。

🎯 项目概述

本项目是一个基于 Flask + TensorFlow 的Web应用系统,主要功能包括:

  1. 数据爬虫:使用Selenium爬取网易云音乐的歌单、歌曲、评论等数据
  2. 数据可视化:通过ECharts展示语种分布、情感分布、用户画像等多维度数据
  3. 词云生成:基于歌词和评论生成精美的词云图
  4. 情感分析:使用深度学习模型对评论进行情感分类

技术栈

  • 后端: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进行浏览器自动化爬取。爬虫模块按功能分为:

  1. 歌单列表爬虫01playlist.py
  2. 歌单详情爬虫02playlist_info.py
  3. 作者信息爬虫03author_info.py
  4. 歌曲信息爬虫04songs_info.py
  5. 评论信息爬虫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')

关键技术点

  1. iframe切换:网易云使用iframe嵌套,需要先切换到iframe才能定位元素
  2. 随机延迟 :使用random.randint(8, 12)模拟人类操作,避免被反爬
  3. 分页处理:循环遍历所有分页,直到没有下一页
  4. 数据持久化:使用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 可视化维度

系统提供以下可视化分析:

  1. 语种分布:对比不同语种的数据指标
  2. 情感标签:分析怀旧、清新、浪漫等情感分布
  3. 用户年龄分布:直方图展示用户年龄段
  4. 听歌量-年龄关系:散点图分析听歌行为

☁️ 五、词云生成

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 数据准备

  1. 运行爬虫(按顺序执行):

    bash 复制代码
    python dataspider/01playlist.py
    python dataspider/02playlist_info.py
    # ... 其他爬虫脚本
  2. 或使用已有数据库 :将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 大数据量处理

  • 问题:词云生成、数据查询可能较慢
  • 解决:使用缓存机制、数据库索引优化、分批处理

🎓 十、项目总结

本项目整合了多个技术栈,实现了从数据获取到数据分析的完整流程:

  1. 数据采集:使用Selenium进行网页爬虫
  2. 数据存储:SQLite数据库管理
  3. Web开发:Flask框架构建Web应用
  4. 数据可视化:ECharts展示多维度数据
  5. 文本分析:jieba分词 + WordCloud词云
  6. 深度学习:TensorFlow构建RNN情感分析模型

技术收获

  • ✅ 掌握Selenium网页自动化爬虫
  • ✅ 熟悉Flask Web开发流程
  • ✅ 学会使用ECharts进行数据可视化
  • ✅ 理解RNN在文本分类中的应用
  • ✅ 掌握中文文本处理和词云生成

适用场景

  • 📚 数据挖掘课程实践项目
  • 💼 数据分析师作品集
  • 🎓 毕业设计项目
  • 🔬 音乐数据研究

📚 参考资源

⚠️ 免责声明

本项目仅用于学习研究,数据来源于网易云音乐。请遵守相关法律法规和网站使用协议,不要用于任何商业用途。


如果这篇文章对你有帮助,欢迎点赞、收藏、转发! 🙏

有任何问题欢迎在评论区讨论,我会及时回复。

#Python #Flask #TensorFlow #数据爬虫 #数据分析 #深度学习 #情感分析 #词云

相关推荐
涅小槃1 小时前
Carla仿真学习笔记(版本0.9.16)
开发语言·python·ros·carla
witAI1 小时前
2025动漫剧本创作工具推荐,助力逆袭重生动态漫
python·量子计算
wujialaoer1 小时前
常用软件阿里源地址
开发语言·python
Ro Jace2 小时前
A Real-Time Cross Correlator for Neurophysiological Research
人工智能·python·算法
还不秃顶的计科生2 小时前
查看linux服务器中某文件夹占用空间大小
服务器·python
T_Fire_of_Square2 小时前
crewai的进一步工具扩展
python·github
喵手2 小时前
Python爬虫零基础入门【第三章:Requests 静态爬取入门·第3节】稳定性第一课:超时、重试、退避(指数退避)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·requests静态爬取·超时、重试、退避
啊阿狸不会拉杆2 小时前
《机器学习》第 7 章 - 神经网络与深度学习
人工智能·python·深度学习·神经网络·机器学习·ai·ml
没有bug.的程序员2 小时前
Spring Boot 启动原理:从 @SpringBootApplication 到自动配置深度解析
java·spring boot·后端·python·springboot·application