简介本资源是一套基于Python与Django开发的网易云音乐数据可视化分析系统面向计算机专业本科生、毕业设计学生及数据分析初学者聚焦用户画像构建与播放行为深度分析两大核心问题可直接用于课程设计、毕设选题或教学演示。压缩包共54个文件含24个核心Python源码覆盖爬虫、Django后端、ECharts前端集成与数据分析逻辑、4个CSV原始数据集、7张PNG可视化图表、3份Markdown说明文档及1份PDF设计报告另有requirements.txt、README与字体等支撑文件整体10.57MB结构清晰、模块解耦度高。已有62人学习下载资源提供完整可运行代码、详细设计文档与环境配置指南支持小白远程指导并预留扩展接口便于二次开发——如替换数据源、接入新图表或对接MySQL数据库。1. 这不是“做个网页放几条曲线”它是一套能看清用户听歌习惯的“音乐行为显微镜”你有没有想过为什么刷着刷着就停不下来为什么总在深夜单曲循环某一首为什么系统突然给你推了一首“好像就是为你写的歌”这些背后不是玄学而是一整套数据在说话——有人把网易云音乐里上亿用户的播放、收藏、评论、跳过、重复听这些动作一条条抓下来再用 Python 拆解、用 Django 组装、用图表“翻译”成你能看懂的语言。这份资源就是这样一个可运行、可修改、带完整文档的“音乐行为分析系统”它不只画几个柱状图应付作业而是从爬虫开始把真实数据存进数据库再建起一个带登录、有菜单、能点选不同用户群的大屏页面最后用热力图、词云、时间分布图告诉你——“00后女生在周五晚8点最爱听什么风格”“哪些歌被跳过最多”“谁是‘收藏但从不重听’型用户”。它适合完全没碰过数据分析的新手也适合要交毕设、赶课设、想快速搭个演示原型的在校生你不需要先成为 Python 大神只要愿意按步骤装好环境、跑通第一个页面就能亲手“看见”数据怎么变成洞察。2. 先搞懂三块拼图爬虫、数据库、大屏它们到底在各自干啥很多人一看到“可视化系统”四个字第一反应是“哦画图嘛我用 Excel 就行。”但这个项目远不止画图——它像一条流水线前端在“听”中间在“记”后端在“讲”。我们拆开来看每一块都不黑匣子都是你能摸得着、改得动的零件。2.1 爬虫不是“偷数据”而是按规则请网站“给一份公开榜单”项目里用的是 Scrapy 框架专门干一件事自动打开网易云音乐的“热歌榜”页面注意是公开可访问的榜单页不是登录后才能看的私人歌单把每首歌的名字、歌手、播放量、评论数、发布时间这些信息一条条“抄”下来存成结构化的数据。它不像浏览器手动复制粘贴那么累也不像人眼扫一遍就忘而是像一个不知疲倦的实习生每天固定时间去官网“领表”填好后交上来。你打开CloudMusic-Crawler文件夹会看到spiders/下面有个hot_spider.py里面写的不是魔法咒语而是清晰的指令“去这个 URL”“找 class 是 ‘song-name’ 的标签”“把里面的文字取出来”“存到字段叫 ‘title’ 里”。它不碰账号密码不刷接口只拿网站明面上展示的内容——所以它合法、稳定、可复现。2.2 MySQL 不是“高级记事本”而是让千万条记录秒级查得出的“音乐档案馆”你爬回来几百首歌、几千条评论如果全塞在一个 Excel 表格里想查“周杰伦的歌里哪首被收藏最多”得手动筛选、排序、数数……等你数完数据都过时了。MySQL 就是来解决这个问题的它把数据分门别类存进“表”里——一张叫songs的表存歌名、歌手、时长一张叫users的表存用户ID、注册时间一张叫behaviors的表存“谁在什么时候听了哪首歌、听了多久、有没有收藏”。你只要写一句 SQLSELECT s.title, COUNT(*) as collect_count FROM behaviors b JOIN songs s ON b.song_id s.id WHERE b.action_type collect GROUP BY s.id ORDER BY collect_count DESC LIMIT 5;数据库立刻返回前五名最被收藏的歌。它不靠人脑记忆靠索引和优化器——就像图书馆的卡片目录你报书名管理员3秒内就把书从十万册里抽出来。项目里的requirements.txt里写了PyMySQL和Django自带的数据库驱动说明它已经帮你配好了“图书管理员”和“借阅系统”的连接方式你只需要确保本地装了 MySQL 服务并在settings.py里填对用户名、密码、库名就行。2.3 Django 大屏不是“PPT截图”而是能点、能选、能刷新的“交互式数据驾驶舱”很多新手以为“可视化导出 PNG 图片”但这个项目的 Django 部分让你做的不是一个静态页面而是一个活的系统。你打开浏览器访问http://127.0.0.1:8000/dashboard/看到的不是一个死图而是一个带侧边栏菜单、顶部时间筛选器、中间可切换图表类型折线图/饼图/热力图、底部还能点“导出 CSV”的真实 Web 应用。它的核心逻辑藏在views.py里比如user_profile_view()这个函数不是直接画图而是先从数据库查出“近30天活跃用户中25-30岁男性的平均单曲收听时长”再把结果传给前端模板dashboard/user_profile.html模板里用 ECharts 的 JavaScript 代码把数字变成动态图表。你改一行 Python 查询逻辑整个大屏的数据就跟着变你换一个 ECharts 配置项图表样式立刻刷新——它不是“做完就扔”而是“随时可调、随时可演”。提示Django 在这里不是为了做电商或社交App而是当一个“数据中转站页面组装工”。它不处理爬虫不管数据库安装只专注做一件事把数据变成网页能懂的语言并让用户能操作。3. 第一步不写代码先让整个系统“呼吸”起来别急着改views.py或调spiders新手最容易卡在第一步环境装不对、路径搞错、服务起不来。我们跳过所有“理论上应该怎样”直接走一条95% 新手能一次成功的实操路径。你只需要一台 Windows/macOS 电脑Linux 更简单但新手用 Windows 居多和 20 分钟安静时间。3.1 安装三件套Python MySQL Git只装你需要的先确认你电脑上有没有 Python 3.8 或更高版本。打开终端Windows 是 CMD 或 PowerShellmacOS 是 Terminal输入python --version如果显示Python 3.8.10或类似OK如果报错“不是内部命令”去 python.org 下载安装包务必勾选 “Add Python to PATH”——这是你未来不踩坑的后悔药。接着装 MySQL去官网下载 MySQL Community Server选最新稳定版安装时一路“Next”在设置 root 密码那步记下你设的密码比如123456后面要用。Git 可选但强烈推荐去 git-scm.com 下载安装它能帮你干净地管理代码改动比手动复制粘贴靠谱十倍。3.2 解压即用把项目放进一个“干净角落”把下载的.zip文件解压到一个全英文、无空格、无中文的路径下比如C:\projects\netease-viz或/Users/yourname/projects/netease-viz。绝对不要放在“桌面”“下载”“我的文档”这种带空格或中文的文件夹里——Django 和 Scrapy 会在这里翻车。解压后你会看到几个关键文件夹CloudMusic-Crawler爬虫、NeteaseCloudMusicDataAnalysis主 Django 项目、data可能存着示例数据。3.3 启动数据库先让“档案馆”开门营业打开 MySQL 的命令行客户端Windows 是 MySQL Command Line ClientmacOS 可用终端输入mysql -u root -p输入你设的密码然后创建一个新库CREATE DATABASE netease_viz DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这句的意思是“建一个叫netease_viz的新档案馆支持中文、emoji、长标题别乱编码。”退出 MySQL输入exit下一步就不用再碰它了——Django 会自动用这个库。3.4 跑通 Django看到首页你就赢了一半进入NeteaseCloudMusicDataAnalysis文件夹注意不是外层那个同名文件夹是里面嵌套的、有manage.py的那个。在终端里执行pip install -r requirements.txt这会根据requirements.txt自动装好 Django、pandas、matplotlib、PyMySQL 等所有依赖。如果卡在某个包比如mysqlclient别硬扛——换成PyMySQL就行项目已适配。装完后执行python manage.py migrate python manage.py createsuperuser python manage.py runserver第一条migrate是让 Django 根据模型models.py里定义的Song,UserBehavior等自动建好数据库表第二条createsuperuser会让你设一个后台管理员账号比如用户名admin邮箱留空密码自己记牢第三条runserver启动本地服务器。这时打开浏览器访问http://127.0.0.1:8000/你应该看到一个简洁的欢迎页或者跳转到/dashboard/显示空白图表——别慌这是正常的因为还没数据。但页面能打开、链接能点、后台能登录/admin/说明 Django 这台“发动机”已经稳稳转动起来了。注意如果runserver报错django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES is not defined说明你没进对文件夹——必须确保当前路径下有manage.py且settings.py里DATABASES配置指向了你刚建的netease_viz库。4. 常见问题排查新手必踩的5个坑我替你试过了刚跑起来就报错页面空白图表不显示别怀疑人生——这些不是你不行而是几乎所有新手都会撞上的墙。我把最常发生的 5 个问题列出来按“你看到什么 → 为什么这样 → 怎么三步搞定”写清楚照着做90% 的卡点都能当场解决。4.1 现象python manage.py runserver报错ModuleNotFoundError: No module named pymysql原因requirements.txt里写了PyMySQL但 pip 没装成功或者装到了另一个 Python 环境里比如你有 Anaconda 和原生 Python 两个版本。解决先确认你在正确的 Python 环境下终端输入which pythonmacOS/Linux或where pythonWindows看路径是不是你装的那个强制重装pip uninstall pymysql pip install PyMySQL如果还报错在NeteaseCloudMusicDataAnalysis/__init__.py最上面加两行项目已自带但有时被覆盖import pymysql pymysql.install_as_MySQLdb()——这句是告诉 Django“别找mysqlclient就用PyMySQL当替身。”4.2 现象访问/dashboard/页面一片空白F12 看控制台报GET http://127.0.0.1:8000/static/js/echarts.min.js net::ERR_ABORTED原因Django 的静态文件JS/CSS/图片没收集到staticfiles文件夹ECharts 库根本没加载进来。解决在settings.py里确认STATIC_URL /static/和STATIC_ROOT os.path.join(BASE_DIR, staticfiles)存在终端执行python manage.py collectstatic --noinput重启服务器CtrlC停掉再python manage.py runserver。提示collectstatic就像把散落在各处的 JS 文件“打包进一个快递箱”Django 才知道去哪找。4.3 现象爬虫运行后data/文件夹里没生成 CSV或者 MySQL 里songs表是空的原因Scrapy 爬虫默认不往数据库写它只生成 CSV/JSON项目里需要你手动运行pipelines.py里的数据库写入逻辑或者先跑爬虫再导入。解决进入CloudMusic-Crawler文件夹运行scrapy crawl hot_spider -o data/hot_songs.json先导出 JSON比 CSV 更稳回到NeteaseCloudMusicDataAnalysis文件夹运行python manage.py load_data --file ../CloudMusic-Crawler/data/hot_songs.json项目自带这个管理命令会自动解析 JSON 并入库。——别自己写 SQL 插入用现成的命令少 80% 错误。4.4 现象登录 Django 后台/admin/点UserBehavior表报错relation netease_userbehavior does not exist原因Django 模型名和数据库表名不一致。models.py里定义的类叫UserBehavior但默认生成的表名是netease_userbehaviorapp名小写类名而爬虫脚本或旧数据可能建的是user_behavior。解决打开models.py找到UserBehavior类在内部加一行class Meta: db_table user_behavior # 强制指定表名和爬虫保持一致删除migrations/文件夹下除__init__.py外的所有文件清空迁移记录重新执行python manage.py makemigrations python manage.py migrate。——这是 Django 的经典“命名对齐”问题不改 Meta永远找不到表。4.5 现象图表显示“暂无数据”但数据库里明明有记录原因视图函数views.py里查数据时用了错误的时间范围或过滤条件比如写死了date__gte2023-01-01而你的数据是今天刚爬的。解决打开views.py找到画图的函数比如get_play_trend_data找到 SQL 或 QuerySet 里的时间过滤部分把它临时改成宽松条件# 原来可能是 behaviors UserBehavior.objects.filter(action_typeplay, date__gte2023-01-01) # 改成 behaviors UserBehavior.objects.filter(action_typeplay)[:100] # 先取100条测试保存刷新页面。如果图表出来了说明是时间条件太严再逐步放宽直到匹配你的实际数据时间。——永远先用[:100]测试别一上来就查全表既慢又难定位。5. 从“能跑”到“真懂”动手改一个功能理解整条链路现在你已经能让系统跑起来、看到页面、甚至导入了数据。下一步不是去看几十页文档而是亲手改一个最小但完整的需求“在用户画像页把‘年龄分布’饼图改成按‘城市’分组”。这个改动看似只动一个图表但它会逼你串起爬虫→数据库→模型→视图→模板→前端渲染全部环节。我带你一步步走每一步都告诉你“为什么这么改”。5.1 先看数据源头城市字段在哪有没有打开CloudMusic-Crawler/spiders/hot_spider.py搜索city或location。你会发现原始爬虫只抓了歌名、歌手、播放量没抓用户城市——因为热歌榜是公开榜单不带用户信息。但项目里data_apply/文件夹下有个sample_users.csv里面有user_id, city, age, gender示例数据。说明城市信息来自模拟数据或另一套用户采集逻辑不是热歌榜爬虫给的。所以我们要用sample_users.csv来测试。5.2 让数据库认识“城市”加字段、导数据进入NeteaseCloudMusicDataAnalysis/models.py找到User模型或类似名称的用户模型添加一个字段class User(models.Model): user_id models.CharField(max_length50, uniqueTrue) city models.CharField(max_length100, blankTrue, nullTrue) # 新增城市 age models.IntegerField(blankTrue, nullTrue) gender models.CharField(max_length10, blankTrue, nullTrue)保存后在终端执行python manage.py makemigrations python manage.py migrate接着把sample_users.csv导入数据库。项目自带load_sample_users.py脚本在scripts/下运行python scripts/load_sample_users.py它会读 CSV逐行创建User对象并保存。完成后进 MySQL 查SELECT city, COUNT(*) FROM users GROUP BY city;应该能看到北京、上海、广州等城市的数量。5.3 改视图告诉 Django“我要查城市分布”打开views.py找到用户画像相关的函数比如user_profile_view在里面加一段查询逻辑from django.db.models import Count def user_profile_view(request): # 原来的年龄分布 age_data User.objects.values(age).annotate(countCount(id)).order_by(age) # 新增城市分布 city_data User.objects.values(city).annotate(countCount(id)).order_by(-count)[:10] context { age_data: list(age_data), city_data: list(city_data), # 传给模板 } return render(request, dashboard/user_profile.html, context)注意values(city).annotate(countCount(id))的意思是“按城市分组每组数有多少人”[:10]只取前10大城市避免饼图太杂乱。5.4 改前端让图表“画出城市”打开templates/dashboard/user_profile.html找到原来画年龄饼图的 ECharts 代码块通常在script标签里。复制一份改名为cityPieChart然后把数据源从age_data换成city_data// 城市饼图 var cityChart echarts.init(document.getElementById(city-pie)); var cityOption { title: { text: 用户城市分布 Top10 }, tooltip: { trigger: item }, series: [{ name: 城市, type: pie, data: {{ city_data|safe }}, // 注意Django 模板语法传入的是 Python 列表 emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.5) } } }] }; cityChart.setOption(cityOption);同时在 HTML 里加一个容器div idcity-pie stylewidth: 600px;height:400px;/div。保存刷新页面——你应该看到第二个饼图标题是“用户城市分布 Top10”数据来自你刚导入的 CSV。5.5 验证闭环改一个参数看全链路响应现在把views.py里[:10]改成[:5]刷新页面饼图立刻变成 Top5再把models.py里city models.CharField(...)的max_length100改成50删掉迁移文件重做makemigrations再导入一次数据——你会发现超长城市名被截断了。你亲手拧动了一个螺丝整条流水线都跟着转。这就是理解系统的开始它不是一堆神秘文件而是你每次修改都能立刻看到反馈的“可触摸”系统。从那以后我每次改模型字段都强制走一遍“改模型→makemigrations→migrate→清测试数据→重导入→刷新页面”全流程哪怕只是加个blankTrue。因为跳过任何一环后面查 bug 的时间够你重做三遍。希望帮到你。6. 下一步学什么一张表理清从“能跑”到“能交毕设”的升级路径你现在能跑通系统、改一个图表、查数据库、修常见报错。接下来怎么走不靠猜不靠搜我按“毕业设计答辩能过线”的硬标准给你列一张可执行、可检查、不画饼的学习路径表。每一行都是一个具体动作完成一项你就离毕设提交近一步。没有“深入学习”“全面掌握”这种虚词只有“今天下午就能干完”的事。阶段目标具体要做的事预估耗时完成标志基础巩固让系统真正属于你1. 把sample_users.csv换成你自己爬的 100 条真实用户数据用 Scrapy 写个简单用户页爬虫只抓user_id和city2. 修改load_sample_users.py适配你的新 CSV 字段名3. 成功导入并验证数据库里有你的数据3–5 小时SELECT * FROM users WHERE city IS NOT NULL LIMIT 5;返回你爬的5条真实城市功能扩展加一个答辩时能讲清楚的亮点功能1. 在/dashboard/页面加一个新 tab“播放时段热力图”2. 用UserBehavior表里的hour字段如果没有就加一个hour models.IntegerField()字段3. 用 ECharts 的heatmap类型画出“周一到周日 × 0点到23点”的热度格子6–8 小时页面上出现一个 7×24 的彩色热力图鼠标悬停显示“周三 22点播放量 142”报告包装把代码变成答辩 PPT 里的一页图1. 用pandas和matplotlib在scripts/下写一个generate_report.py- 读user_behavior表统计“跳过率最高的5首歌”- 生成 PNG 图表保存到media/reports/2. 在 Django 后台/admin/里加一个按钮点击就运行这个脚本4–6 小时后台点一下media/reports/下自动生成top_skip_songs.png图上有清晰标题和数据标签部署演示让老师用手机也能看你的成果1. 用python manage.py collectstatic收集所有静态文件2. 用gunicorn启动服务pip install gunicorn然后gunicorn NeteaseCloudMusicDataAnalysis.wsgi3. 用ngrok免费版生成一个公网链接发给老师2–3 小时老师用微信打开你发的xxx.ngrok.io/dashboard/看到和你本地一模一样的大屏这张表里没有“学机器学习”“研究推荐算法”——那些是锦上添花不是雪中送炭。毕设答辩的核心是你独立完成了从数据获取、存储、分析到可视化的完整闭环并能解释每一步为什么这么做、出了错怎么修。你改过模型字段、调过 ECharts 配置、写过数据导入脚本、甚至用 ngrok 让老师远程看效果——这些才是答辩老师翻你代码时一眼就能看到的“真功夫”。最后一句实在话我第一次做类似项目时卡在collectstatic两天因为没删staticfiles/旧文件后来发现只要在settings.py里把DEBUG True开着Django 就会自动帮你找静态文件根本不用collectstatic——但前提是你得先让DEBUGTrue生效。所以永远先确认DEBUG状态再查静态文件问题。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?