博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、技术栈

后端:Flask、PyMySql、pandas、requests、bs4
前端:HTML、Jquery、Ajax、LayUI、Echarts

本项目实现了以下主要功能:
网易云歌单数据的采集和处理,包括歌单基本信息、歌曲列表、评论数、分享量、创建时间等多种数据。
将数据保存到MySQL数据库中,以便后续进行数据分析和管理。
实现了数据可视化分析功能,包括歌单创建省份数量中国地图、最受欢迎的歌单类型TOP7,歌单分享量和评论数变化,歌单歌曲数量范围,最受欢迎的歌单TOP5、歌单收藏量变化、语种类型歌单播放量等多种分析图表。
实现了后台数据管理功能,包括用户登陆注册、用户管理、公告管理以及歌单数据管理等多种功能。

在这里插入图片描述

2、项目截图

0、数据分析大屏

在这里插入图片描述

1、用户管理界面

在这里插入图片描述

2、歌曲管理界面

在这里插入图片描述

3、注册登录界面

在这里插入图片描述

4、后台首页
在这里插入图片描述

5、数据采集爬虫界面
在这里插入图片描述

3、说明

随着互联网技术的发展,音乐成为了人们生活中不可或缺的一部分,而网易云音乐作为国内最受欢迎的音乐平台之一,积累了大量的用户和歌单数据。针对这些数据,开发者们可以进行各种分析和挖掘,从而更好地理解用户需求和市场趋势。
本项目就是基于这个背景而设计的,旨在通过Python技术实现对网易云音乐热门歌单数据的采集、清洗、处理和可视化分析,并将结果保存到MySQL数据库中,最终通过Flask构建的数据服务接口实现数据的展示和管理。

运行环境:推荐Python3.6及以上,推荐python3.7;
开发工具:PyChram(推荐);
操作系统:windows 10 8G内存以上(其他windows以及macOS支持,但不推荐);
浏览器:Firefox(推荐)、Google Chrome(推荐)、Edge;
数据库:MySQL8.0(推荐)及其他版本(支持,但容易异常尤其MySQL5.7(不含)以下版本);
数据库可视化工具:Navicat Premium 15(推荐)以及其他Navicat版本

本项目主要采用了Python的request库、bs4库实现了网易云歌单数据的采集,然后使用pymysql将数据保存到MySQL数据库中。在数据清洗和处理方面,采用了Pandas等库来进行数据清洗和处理,从而得到干净、规范的数据。
在可视化分析方面,采用了Echarts技术实现歌单创建省份数量中国地图、最受欢迎的歌单类型TOP7,歌单分享量和评论数变化,歌单歌曲数量范围,最受欢迎的歌单TOP5、歌单收藏量变化、语种类型歌单播放量等多种分析图表,使得数据更加直观、易于理解。
在后台数据管理方面,采用了Layui技术实现了用户登陆注册、用户管理、公告管理以及歌单数据管理等多种功能,方便管理员对数据进行管理和维护。

本项目实现了以下主要功能:
网易云歌单数据的采集和处理,包括歌单基本信息、歌曲列表、评论数、分享量、创建时间等多种数据。
将数据保存到MySQL数据库中,以便后续进行数据分析和管理。
实现了数据可视化分析功能,包括歌单创建省份数量中国地图、最受欢迎的歌单类型TOP7,歌单分享量和评论数变化,歌单歌曲数量范围,最受欢迎的歌单TOP5、歌单收藏量变化、语种类型歌单播放量等多种分析图表。
实现了后台数据管理功能,包括用户登陆注册、用户管理、公告管理以及歌单数据管理等多种功能。

在这里插入图片描述

4、核心代码

# -*- coding: utf-8 -*-
import re
import csv
import json
import time
import pymysql
import requests
from bs4 import BeautifulSoup

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.52'
}

# 歌单类型链接
type_url = "https://music.163.com/discover/playlist"

# 连接数据库
db = pymysql.connect(
    host="localhost",
    user="root",
    password="123456",
    port=3306,
    db="cloud_music"
)

cursor = db.cursor()

csv_data = []
"""获取歌单类型"""


def get_playlist_type(url):
    response = requests.get(url=url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    types = [t.text for t in soup.select("a.s-fc1")][1:]
    return types


"""获取歌单id"""


def get_playlist_id(url):
    response = requests.get(url=url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    ids = [re.sub(r"\D+", "", i['href']) for i in soup.select("a.msk")]
    t = re.search('https.*cat=(.*)&limit', url).group(1)
    get_playlist_info(ids, t)


"""获取歌单信息"""


def get_playlist_info(ids, t):
    playlist_url = "https://api.obfs.dev/api/netease/playlist?id={}"
    urls = [playlist_url.format(i) for i in ids]

    for url in urls:
        try:
            response = requests.get(url=url, headers=headers)
            json_text = response.text
            json_playlist = json.loads(json_text)["playlist"]
        except:
            continue

        # 歌单ID、歌单名、歌单类型、标签、创建时间、最后更新时间、播放量、收藏量、转发量、评论数
        # 用户名、性别、用户类型、VIP类型、省份、城市
        playlistID = str(json_playlist["id"])
        name = json_playlist["name"]
        playlistType = t
        tags = "、".join(json_playlist["tags"])
        createTime = time.strftime("%Y-%m-%d", time.localtime(int(str(json_playlist["createTime"])[:-3])))
        updateTime = time.strftime("%Y-%m-%d", time.localtime(int(str(json_playlist["updateTime"])[:-3])))
        tracks_num = len(json_playlist["trackIds"])
        playCount = json_playlist["playCount"]
        subscribedCount = json_playlist["subscribedCount"]
        shareCount = json_playlist["shareCount"]
        commentCount = json_playlist["commentCount"]
        nickname = json_playlist['creator']['nickname']
        gender = str(json_playlist['creator']['gender'])
        userType = str(json_playlist['creator']['userType'])
        vipType = str(json_playlist['creator']['vipType'])
        province = str(json_playlist['creator']['province'])
        city = str(json_playlist['creator']['city'])

        # 匹配性别、省份、城市代码
        if gender == '1':
            gender = '男'
        else:
            gender = '女'

        # 打开行政区代码文件
        with open("country.csv", encoding="utf-8") as f:
            rows = csv.reader(f)

            for row in rows:
                if row[0] == province:
                    province = row[1]
                if row[0] == city:
                    city = row[1]

            if province == '香港特别行政区':
                city = '香港特别行政区'
            if province == '澳门特别行政区':
                city = '澳门特别行政区'
            if province == '台湾省':
                city = '台湾省'
            if province == str(json_playlist['creator']['province']):
                province = '海外'
                city = '海外'
            if city == str(json_playlist['creator']['city']):
                city = province

        playlist = [playlistID, name, playlistType, tags, createTime, updateTime,
                    tracks_num, playCount, subscribedCount, shareCount, commentCount,
                    nickname, gender, userType, vipType, province, city]
        print(playlist)
        csv_data.append(playlist)
        playlists = playlist[0:11]
        users = playlist[11:17]
        save_to_musiclist(playlist)
        save_to_playlists(playlists)
        save_to_users(playlists, users)


"""保存到数据库"""


def save_to_musiclist(playlist):
    sql = """insert into musiclist(id, name, type, tags, create_time, update_time,tracks_num, play_count, 
                subscribed_count, share_count, comment_count,nickname,gender, user_type, vip_type, province, city)
                values (%s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""
    try:
        cursor.execute(sql, (
            playlist[0], playlist[1], playlist[2], playlist[3], playlist[4], playlist[5], playlist[6], playlist[7],
            playlist[8], playlist[9], playlist[10], playlist[11], playlist[12], playlist[13], playlist[14],
            playlist[15],
            playlist[16]))
        db.commit()
    except:
        db.rollback()


def save_to_playlists(playlists):
    sql = """insert into playlists(id, name, type, tags, create_time, update_time, 
                tracks_num, play_count, subscribed_count, share_count, comment_count)
                values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""
    try:
        cursor.execute(sql, (
            playlists[0], playlists[1], playlists[2], playlists[3], playlists[4], playlists[5], playlists[6],
            playlists[7],
            playlists[8], playlists[9], playlists[10]))
        db.commit()
    except:
        db.rollback()


def save_to_users(playlists, users):
    sql = """insert into users(id,nickname,gender, user_type, vip_type, province, city)
                values (%s,%s, %s, %s, %s, %s, %s)"""
    try:
        cursor.execute(sql, (playlists[0], users[0], users[1], users[2], users[3], users[4], users[5]))
        db.commit()
    except:
        db.rollback()


def main():
    types = get_playlist_type(type_url)
    for t in types:
        for i in range(42):
            url = "https://music.163.com/discover/playlist/?order=hot&cat={0}&limit=35&offset={1}".format(t, i * 35)
            get_playlist_id(url)
        time.sleep(1)


if __name__ == "__main__":
    main()

5、源码获取方式

https://mbd.pub/o/author-aWiYmGxnZA==/work

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐