基于Python的网易云歌曲数据分析系统的设计与实现

摘  要

本研究基于网易云音乐数据,利用Django框架设计并实现了一个音乐数据分析与展示系统。系统主要包括数据爬取、清洗、分析和可视化展示四个模块,其中数据分析模块通过统计欧美音乐歌单的热门歌曲、播放数量分布、歌单标签和介绍文本等信息,为用户提供了深入了解音乐偏好和趋势的平台。通过合理设计爬虫逻辑、数据清洗和处理方法,以及利用Django框架提供的ORM机制和pyecharts库实现数据可视化,本系统实现了数据的高效获取、存储、分析和展示。功能测试结果显示系统各项功能均通过合格,性能测试结果也表明系统具备较好的稳定性和响应速度。通过对数据分析结果的讨论和优化建议,提出了进一步改进系统的思路和方向。未来的研究可以在数据来源拓展、算法优化、用户体验优化、个性化推荐和数据隐私保护等方面展开,进一步提升音乐数据分析与展示系统的功能和性能,为用户提供更好的服务和体验。

关键词:网易云音乐;数据分析;数据可视化;Django框架;ORM机制;

Design and Implementation of NetEase Cloud Song Data Analysis System Based on Python

Abstract

This study is based on data from NetEase Cloud Music and implements a music data analysis and visualization system using the Django framework. The system mainly consists of four modules: data crawling, cleaning, analysis, and visualization. The data analysis module provides users with a platform to deeply understand music preferences and trends by statistically analyzing popular songs, play count distribution, playlist tags, and introduction texts of Euro-American music playlists. Through the reasonable design of crawler logic, data cleaning and processing methods, and the use of Django framework's ORM mechanism and the pyecharts library for data visualization, the system realizes efficient acquisition, storage, analysis, and display of data. The results of functional testing show that all functions of the system pass the test, and the results of performance testing also indicate that the system has good stability and response speed. Discussions on the results of data analysis and optimization suggestions propose further improvement directions for the system. Future research can be conducted in areas such as expanding data sources, optimizing algorithms, enhancing user experience, personalizing recommendations, and protecting data privacy, to further improve the functionality and performance of the music data analysis and visualization system, providing users with better services and experiences.

Keywords: NetEase Cloud Music; data analysis; data visualization; Django

framework; ORM mechanism

目录

摘  要

Abstract

第一章 引言

1.1 研究背景和动机

1.2 研究目的和意义

1.3 研究内容概述

1.4 论文结构安排

第二章 文献综述

2.1 Python在数据分析领域的应用现状

2.2 网易云音乐数据分析相关研究综述

2.3 数据爬取与清洗技术综述

2.4 数据可视化方法综述

2.5本章小结

第三章 研究方法

3.1 数据获取

3.2 数据清洗

3.3 数据分析

3.4本章小结

第四章 系统设计与实现

4.1 系统架构设计

4.2 数据爬取模块实现

4.3 数据清洗模块实现

4.4 数据分析与可视化模块实现

4.5本章小结

第五章 系统功能与性能测试

5.1系统测试的目的

5.2系统测试方法

5.3功能测试

5.4本章小结

第六章 结果分析与讨论

6.1 数据分析结果

6.2 结果讨论与优化建议

6.3本章小结

第七章 结论与展望

7.1 总结研究工作

7.2 研究成果与贡献

7.3 展望未来研究方向

第八章 参考文献

 第一章 引言

1.1 研究背景和动机

1.1.1 网络音乐平台的兴起

网络音乐平台的兴起是数字化时代音乐产业的重要里程碑之一。随着互联网技术的普及和数字化内容的崛起,传统音乐产业面临着巨大的挑战和机遇。在过去的几十年里,传统音乐产业主要依赖于实体唱片销售和电台播放等渠道来推广音乐作品。然而,随着互联网的普及,特别是宽带互联网的普及,人们开始更加便捷地获取和分享音乐。

网络音乐平台的兴起,首先体现在音乐的数字化上。传统的实体唱片逐渐被数字音乐取代,人们可以通过网络购买或者下载音乐,而不再需要购买实体唱片。这种数字化的转变不仅提高了音乐的获取和传播效率,也使得音乐的消费更加个性化和便捷化。其次,网络音乐平台为音乐人和独立音乐制作人提供了更广阔的舞台。传统的音乐产业门槛较高,往往需要依靠唱片公司等中介机构才能推广自己的音乐作品。而在网络音乐平台上,任何人都可以上传自己的音乐作品,通过平台的推广和分享功能,使得更多优秀的音乐作品得到了展示和认可。此外,网络音乐平台还为音乐消费者提供了更加多样化的音乐体验。传统的实体唱片销售受到地域限制,消费者的选择相对有限。而在网络音乐平台上,用户可以根据自己的兴趣和偏好,轻松地发现和收听来自全球各地的音乐作品,极大地丰富了音乐消费者的选择空间。

总的来说,网络音乐平台的兴起不仅促进了音乐产业的数字化转型,也为音乐人、音乐消费者和音乐产业带来了更多的机遇和挑战。在这样一个数字化时代,网络音乐平台的发展将继续推动音乐产业的创新与发展。

1.1.2 数据分析在音乐产业中的重要性

数据分析在音乐产业中扮演着越来越重要的角色。随着数字化技术的发展和网络音乐平台的兴起,大量的音乐数据被生成和积累,其中包括音乐播放数据、用户行为数据、社交媒体数据等。这些数据蕴含着丰富的信息,通过对这些数据进行分析和挖掘,可以为音乐产业的发展和运营提供重要的参考和支持。

首先,数据分析可以帮助音乐产业了解用户偏好和行为。通过分析用户在音乐平台上的播放记录、搜索记录、评论行为等数据,可以揭示用户对不同类型音乐的偏好和喜好程度,进而为音乐推荐和歌单编辑提供依据。这样可以提高音乐平台的个性化推荐能力,提升用户体验,增加用户粘性。

其次,数据分析可以帮助音乐产业发现音乐市场的趋势和机会。通过分析音乐市场的销售数据、播放数据、下载数据等,可以了解不同音乐类型和歌手的受欢迎程度,把握市场需求的变化趋势,及时调整音乐推广和营销策略,以满足用户需求,提升市场竞争力。

另外,数据分析还可以帮助音乐产业进行版权管理和反盗版监测。通过分析音乐平台上的播放数据和下载数据,可以发现侵权行为并及时采取相应的措施,保护音乐作品的版权利益,维护音乐产业的健康发展。

总的来说,数据分析在音乐产业中的重要性日益凸显,它不仅可以帮助音乐产业了解用户需求和市场趋势,还可以提升音乐平台的运营效率和市场竞争力,推动音乐产业的数字化转型和创新发展。因此,音乐产业需要不断加强对音乐数据的分析和应用,以适应数字化时代的发展需求。

1.1.3 网易云音乐平台的特点与挑战

(1) 特点:网易云音乐平台作为国内领先的音乐平台之一,具有独特的特点。首先,其社交性强,注重用户间的社交互动,用户可以建立个人主页、创建歌单、关注其他用户,形成了一个音乐社交生态圈。其次,网易云音乐平台实现了个性化推荐,根据用户的听歌记录、喜好标签等个性化数据,精准地推荐符合用户口味的音乐内容,提升用户体验。此外,该平台汇聚了丰富的音乐资源,涵盖了各种风格和类型的音乐,满足了不同用户群体的需求。最后,网易云音乐平台与众多音乐人、明星进行合作,推出专属音乐内容和活动,增加了用户与艺人之间的互动性。

(2) 挑战:与其特点相对应的是,网易云音乐平台也面临着一系列挑战。首先是音乐版权问题,不少音乐作品的版权问题存在争议,需要平台加强版权管理和合规运营。其次,随着用户规模的不断扩大,需要不断优化用户体验,提升平台的稳定性和服务质量,以留住用户并吸引新用户加入。同时,随着竞争对手的不断涌现和市场竞争的加剧,网易云音乐平台需要不断创新和升级产品功能,保持竞争优势。此外,随着个人数据泄露事件频发,需要加强用户数据安全和隐私保护措施,保护用户的个人信息不被泄露或滥用。

1.2 研究目的和意义

本研究旨在深入探讨网易云音乐平台用户行为与偏好,以及提升歌单推荐精准度与用户体验的相关问题,具体目的和意义如下:

1.2.1 理解网易云音乐平台用户行为与偏好

理解用户行为和偏好是网易云音乐平台运营和发展的关键[1]。通过分析用户在平台上的行为,如搜索记录、播放记录、评论行为等,可以深入了解用户的兴趣和喜好[2]。此外,还可以通过用户的个人资料、社交关系等数据,对用户进行细分和画像,进一步挖掘用户的特征和需求。通过深入理解用户行为和偏好,网易云音乐平台可以精准地进行个性化推荐,为用户提供更符合其口味和需求的音乐内容,提升用户满意度和平台粘性。同时,还可以根据用户行为和偏好,调整平台的运营策略和产品功能[3],更好地满足用户的需求,提升平台的竞争力。

1.2.2 提升歌单推荐精准度与用户体验

提升歌单推荐的精准度和用户体验是网易云音乐平台持续改进的重要方向。通过优化个性化推荐算法、加强用户偏好设置、加强社交互动、推荐多样化内容等策略,可以更好地满足用户的音乐需求,提升用户体验和平台的竞争力。本研究旨在探讨如何有效地提升歌单推荐的精准度,从而提高用户对网易云音乐平台的满意度和忠诚度。

1.2.3 为音乐平台运营提供数据支持与决策依据

本研究还旨在为网易云音乐平台运营提供数据支持与决策依据。通过对用户行为和偏好的深入分析,可以为平台运营提供更准确的用户画像和市场洞察,帮助平台制定更精准的运营策略和产品改进方案,从而提升平台的竞争力和市场地位。同时,还可以为音乐产业相关研究提供参考和借鉴,推动音乐产业的数字化转型和创新发展。

1.3 研究内容概述

1.3.1 数据获取:爬取网易云音乐欧美歌单数据

通过网络爬虫技术[4],获取网易云音乐平台上欧美歌单的相关数据,包括歌曲信息、播放量、评论数、收藏数等。通过爬取大量歌单数据[5],建立起数据集,为后续的数据分析和可视化提供基础。

1.3.2 数据清洗:对爬取的数据进行清洗与预处理

针对爬取的原始数据进行清洗和预处理,包括去除重复数据、处理缺失值、格式化数据结构等。通过数据清洗,确保数据的质量和准确性,为后续的数据分析和可视化提供干净的数据集。

1.3.3 数据分析:对清洗后的数据进行分析与可视化

基于清洗后的数据,运用Python丰富的第三方开源模块,进行数据分析与可视化。主要分析网易云音乐欧美歌单的特点和趋势,如歌单中歌曲数量分布、播放量、评论数、收藏数等情况。利用数据可视化技术,绘制相关图表,如柱状图、词云图、标签图等,直观展现数据分析结果,为进一步的研究和决策提供参考。

1.4 论文结构安排

1.4.1 第二章:文献综述

本章将回顾相关领域的文献和研究成果,探讨网易云音乐平台、数据分析技术、音乐推荐系统等方面的研究现状和发展趋势,为后续研究提供理论基础和参考。

1.4.2 第三章:研究方法

在本章中,将详细介绍本研究所采用的研究方法和技术路线。包括数据获取的具体步骤和技术实现、数据清洗的方法和流程、数据分析的算法和工具选择等内容。

1.4.3 第四章:系统设计与实现

本章将介绍基于Python的网易云音乐歌曲数据分析系统的设计和实现。包括系统架构设计、模块功能划分、关键技术实现等方面的内容,为系统的开发和部署提供详细说明。

1.4.4 第五章:系统功能与性能测试

在本章中,将对系统进行功能和性能测试。通过测试系统的各项功能是否正常、性能是否达到预期目标,评估系统的稳定性和可靠性,并提出改进建议。

1.4.5 第六章:结果分析与讨论

本章将对系统的数据分析结果进行详细的分析和讨论,探讨网易云音乐欧美歌单的特点、用户行为与偏好、歌单推荐精准度等方面的问题,并结合实际情况对结果进行解释和评价。

1.4.6 第七章:结论与展望

最后一章将对全文进行总结,并对本研究的不足之处和未来的研究方向进行展望,为相关领域的后续研究提供参考和启示。


   

第二章 文献综述

在本章中,将对Python在数据分析领域的应用现状、网易云音乐数据分析相关研究、数据爬取与清洗技术以及数据可视化方法进行综述。

2.1 Python在数据分析领域的应用现状

Python作为一种功能强大且易于学习和使用的编程语言,在数据分析领域得到了广泛的应用。本节将回顾Python在数据分析领域的发展历程和主要应用场景,介绍Python在数据获取、数据处理、数据分析和数据可视化方面的相关工具和库。

2.2 网易云音乐数据分析相关研究综述

网易云音乐作为国内领先的音乐平台之一,其数据分析相关研究也逐渐受到关注。本节将回顾已有的网易云音乐数据分析相关研究成果,包括用户行为分析、歌单推荐系统、音乐内容分析等方面的研究内容和方法。

2.3 数据爬取与清洗技术综述

数据爬取与清洗是进行数据分析的重要步骤,影响着后续分析结果的准确性和可靠性。本节将综述常用的数据爬取技术,包括基于网络爬虫的数据获取方法,以及数据清洗技术,包括数据去重、缺失值处理、异常值处理等。

2.4 数据可视化方法综述

数据可视化是将数据转化为可视化图表或图形的过程[6],能够直观地展现数据分析结果。本节将综述常用的数据可视化方法,包括基于Python的数据可视化库(如Matplotlib、Seaborn、Plotly等),以及常见的可视化图表类型和应用场景。

2.5本章小结

本章对Python在数据分析领域的应用现状、网易云音乐数据分析相关研究、数据爬取与清洗技术以及数据可视化方法进行了综述。首先,回顾了Python在数据分析领域的发展历程和主要应用场景,介绍了Python在数据获取、数据处理、数据分析和数据可视化方面的相关工具和库。其次,概述了已有的网易云音乐数据分析相关研究成果,包括用户行为分析、歌单推荐系统、音乐内容分析等方面的研究内容和方法。接着,综述了常用的数据爬取技术和数据清洗技术,包括基于网络爬虫的数据获取方法和数据清洗的常见处理方法。最后,介绍了常用的数据可视化方法,包括基于Python的数据可视化库和常见的可视化图表类型。通过本章的综述,为后续研究提供了理论基础和相关研究的参考,为本文的研究内容和方法选择提供了指导。

第三章研究方法

在本章节中,我们将介绍如何获取网易云音乐的数据。首先,我们将分析网易云音乐网站的结构,然后使用相应的技术获取数据。

3.1 数据获取

3.1.1 网易云音乐网站分析

在这一部分,我们将对网易云音乐网站的结构进行分析,包括网站的页面结构、URL路径、数据展示方式等。通过对网站的分析,我们可以确定我们需要抓取的数据来源以及抓取策略。

图3-1

在图 3-1 中,我们可以看到我们需要的数据主要存在于 HTML 页面中。通过分析 HTML 页面的结构和内容,我们可以确定如何定位和提取我们需要的数据。在进行数据提取之前,我们需要确保我们可以正确解析 HTML 页面,并且能够准确地定位到包含目标数据的标签和元素。

3.1.2 网易云音乐数据获取

在这一部分,我们将使用 Python 编程语言以及相应的网络爬虫技术来获取网易云音乐的数据。我们将通过分析网页的 HTML 结构,使用 Requests 库发送网络请求,并使用 BeautifulSoup 库解析网页内容,从而获取我们需要的数据。如图3-2:

图3-2

3.1.3 数据爬取技术

在进行数据爬取技术方面,我们采用了一系列高效而可靠的工具和技术。首先,我们使用了Python编程语言中的Requests库,这是一个简单易用的HTTP库,用于发送网络请求和接收响应。通过Requests库,我们能够模拟浏览器向目标网站发送请求,从而获取网页的HTML内容。其次,我们利用了BeautifulSoup库,这是一个强大的解析HTML和XML文档的库,可以帮助我们轻松地从HTML页面中提取所需的信息。通过BeautifulSoup库提供的强大功能,我们能够高效地定位和解析HTML标签,从而获取网页中的各种数据。

除了以上核心工具外,我们还充分利用了fake_useragent库,这是一个用于生成随机User-Agent头的Python库。在网络爬虫中,User-Agent头是一个重要的HTTP标头,用于向服务器标识发送请求的客户端软件。由于许多网站会根据User-Agent头来判断请求是否来自于爬虫程序,因此使用随机的User-Agent头可以有效地减少被识别和屏蔽的风险,提高数据爬取的稳定性和可靠性。

在实际操作中,我们不仅仅是简单地发送请求和解析响应,还需要考虑如何处理可能遇到的异常情况。例如,有些网站可能会设置反爬虫机制,如IP封锁、验证码等,因此我们需要编写相应的代码来应对这些情况,保证数据爬取的顺利进行。此外,为了降低对目标网站的访问频率,我们还会在爬取过程中设置适当的延时,以避免对服务器造成过大的负载压力。

综上所述,我们在数据爬取技术方面采用了多种有效的工具和方法,包括Requests库、BeautifulSoup库和fake_useragent库等。通过这些工具的结合应用,我们能够高效地从目标网站中获取所需的数据,并在一定程度上规避了被识别和屏蔽的风险,从而确保了数据爬取工作的顺利进行。

3.2 数据清洗

3.2.1 数据清洗流程

在进行数据清洗时,我们遵循以下流程以确保数据的质量和准确性。首先,我们对原始数据进行初步的观察和理解,了解数据的结构、特征和可能存在的问题。接下来,我们进行数据预处理,包括缺失值处理、异常值处理、重复值处理等。对于缺失值,我们可以选择删除、填充或插值等方式进行处理,以保证数据的完整性和可用性。对于异常值,我们可以通过统计分析或专业领域知识进行识别和处理,以确保数据的准确性和可靠性。对于重复值,我们可以直接删除或进行合并等操作,以消除数据中的重复信息。

在数据预处理完成后,我们进行数据转换和集成,将不同来源的数据进行整合和统一,以便后续分析和建模。在数据转换过程中,我们可能会进行数据格式转换、特征标准化、特征抽取等操作,以便更好地适应后续的分析需求。在数据集成过程中,我们可能会将不同数据源的数据进行合并、关联或连接等操作,以获得更加全面和完整的数据集。

最后,我们进行数据验证和评估,对清洗后的数据进行检查和评估,确保数据清洗的有效性和可靠性。我们可以使用统计分析、可视化等方法对数据进行验证,检查清洗后数据的分布、相关性和一致性等情况。在评估过程中,我们还可以使用专业领域知识或领域专家的意见来进行确认和反馈,以确保清洗后的数据能够满足实际分析和应用的需求。清洗核心代码:

图3-3

3.2.2 数据清洗工具与方法

可以使用Python编程语言中的各种数据处理和分析库,如Pandas、NumPy、Scikit-learn等。这些库提供了丰富的函数和方法,可以帮助我们高效地进行数据清洗和处理。此外,还可以借助可视化工具和统计分析软件,如Matplotlib、Seaborn、Pyecharts等,对数据进行可视化和分析,发现数据中的潜在问题和规律,进一步优化数据清洗的流程和效果。

3.3 数据分析

3.3.1 数据分析算法

数据分析在网易云音乐数据中发挥着重要作用[7],为此我们采用了多种数据分析算法来揭示数据背后的规律和趋势。其中包括但不限于:基于统计学的分析方法,如描述性统计、相关性分析等,用于描述数据的基本特征和变量之间的关系。机器学习算法,例如聚类分析、回归分析、分类算法等,用于识别数据中的模式、分类和预测。文本挖掘技术,用于从歌单介绍中提取关键词、主题等信息,帮助理解用户喜好和趋势。

3.3.2 数据可视化技术

在网易云音乐数据分析中,我们利用了多种数据可视化技术,以直观展示数据分析结果。具体包括以下几个方面:

1. 柱状图示例:通过柱状图展示了歌单中的 TOP10 歌曲、欧美歌单播放 TOP10 以及歌单评论 TOP10,利用不同颜色的柱子表示不同的数据项,直观展现了各项数据的排名和数量情况。

2. 欧美歌单播放数量分布情况:采用柱状图展示了欧美歌单播放数量的分布情况,将播放次数按一定范围进行划分,统计每个范围内的歌单数量,帮助我们了解歌单播放数量的整体分布特征。

3. 歌单标签图:利用 TreeMap 展示了歌单的标签分布情况,通过不同大小和颜色的矩形区域表示不同的标签及其数量,直观展现了各个标签在歌单中的分布比例。

4. 歌单介绍词云图:利用词云技术展示了歌单介绍中的关键词分布情况,将高频出现的关键词以较大的字体显示,帮助我们快速把握歌单介绍的主题和内容。

3.4本章小结

本章主要介绍了在网易云音乐数据分析中所采用的数据分析算法和数据可视化技术[8]。通过基于统计学的分析方法、机器学习算法以及文本挖掘技术[9],我们能够揭示数据背后的规律和趋势,从而更好地理解用户行为和偏好。同时,利用柱状图、分布图、标签图以及词云图等数据可视化技术,我们将数据分析结果直观地展现出来,使得分析过程更加清晰明了。通过本章的内容,读者可以更加深入地了解网易云音乐数据分析的方法和技术,为后续的研究和实践提供了重要参考。

 第四章 系统设计与实现

4.1 系统架构设计

本系统采用Django作为后端框架,结合HTML前端页面完成数据的调用和展示。系统架构设计遵循MVC(Model-View-Controller)模式[10],其中模型层使用Django的ORM机制与数据库交互,视图层负责处理用户请求并调用适当的模型方法,而模板层则负责渲染HTML页面并展示数据。如图4-1

图4-1

数据管理用如例图4-2:

图4-2

4.2 数据爬取模块实现

数据爬取模块利用Django框架中的任务调度功能,通过编写爬虫程序从网易云音乐等数据源获取数据,并使用ORM[11]机制将数据存储到数据库中。通过合理设计爬虫逻辑和利用Django提供的数据库操作方法,实现了数据的高效获取和存储。

4.3 数据清洗模块实现

数据清洗模块通过Django的视图函数和模型方法,对从数据源获取的原始数据进行清洗、去重和异常值处理等操作。利用Django框架提供的表单验证和数据校验功能,确保数据的质量和可用性,为后续的数据分析提供了干净的数据集。如图4-3:

图4-3

4.4 数据分析与可视化模块实现

数据分析与可视化模块利用pyecharts库生成各种图表,并通过Django的视图函数将图表嵌入HTML页面中展示给用户。通过Django框架提供的渲染方法,将数据分析结果以直观的形式呈现给用户,帮助用户更好地理解数据背后的规律和趋势。

4.5本章小结

本章主要介绍了系统设计与实现过程中的关键步骤和方法,着重探讨了系统架构设计、数据爬取模块实现、数据清洗模块实现以及数据分析与可视化模块实现等方面。系统采用了Django作为后端框架,结合HTML前端页面完成数据的调用和展示,遵循MVC(Model-View-Controller)模式进行架构设计。在数据爬取模块方面,利用Django框架中的任务调度功能,通过编写爬虫程序从网易云音乐等数据源获取数据,并使用ORM机制将数据存储到数据库中,实现了数据的高效获取和存储。而数据清洗模块则通过Django的视图函数和模型方法对原始数据进行清洗、去重和异常值处理等操作,利用框架提供的表单验证和数据校验功能,确保了数据的质量和可用性,为后续的数据分析提供了干净的数据集。

在数据分析与可视化模块的实现过程中,采用了多种数据分析算法和可视化技术,例如基于统计学的分析方法、机器学习算法以及文本挖掘技术,用于揭示数据背后的规律和趋势。同时,利用pyecharts库实现了各种图表的绘制,包括柱状图、词云图等,以直观形式展示数据分析结果,帮助用户更好地理解和利用数据。系统还采用了Django[12]框架的ORM机制与数据库进行交互,通过合理设计数据库模型和查询方法,实现了对数据的高效管理和操作。

综上所述,本章通过详细介绍系统设计与实现的各个环节,展现了系统开发过程中的关键技术和方法。通过合理的架构设计、高效的数据处理和分析手段,本系统实现了从数据获取到展示分析的端到端流程,为用户提供了一个功能完善、性能稳定的数据分析平台。未来,我们将继续完善系统功能,优化用户体验,进一步拓展数据源和分析手段,为用户提供更加丰富和全面的数据分析服务。

 第五章 系统功能与性能测试

5.1系统测试的目的

在经过长期的测试与修改下,系统能正常运行,已经达到基本的要求,但难免有时会出现一些报错和Bug,如果忽略一些不起眼的小问题有可能会产生连锁反应:数据的报错,数据的无缘被修改以及泄露,甚至会成为不法分子的可乘之机,给开发者和用户造成惨重的代价。综合以上几点,必修要对这个完成的系统进行测试,只有通过一定的测试来解决这些出现的问题。通过不断地进行测试,一步一步的发现系统中的问题,然后对问题进行一次又一次的修改,使该基于机器学习对天气数据预测系统的设计与实现的系统更加完善,最后争取没有漏洞和Bug,成为一个接近完美无暇的基于机器学习对天气数据预测系统的设计与实现的系统。还要在测试修改的过程中吸取经验:自己为什么会犯这种错误、代码的编写哪个逻辑环节出了错误、又有哪些地方是因为自己的粗心大意造成的等等。使系统本身接近完美以及以后的维护更加快捷方便。

5.2系统测试方法

系统的测试方法有很多,在对系统进行测试时,应选择最适合并且稳定性良好最好保障的测试方法进行测试。撰写的代码完成后,就要开始着手于对系统进行一系列的测试。本系统代码是在Pycharm编写完成的,完成后部署在Pycharm集成好的Django上。测试的浏览器使用了Google浏览器进行的。系统测试的具体要求顺序如下:

(1)打开相应的运行代码软件,使用Google浏览器运行该系统页面。

(2)测试整体从三个角度进行测试:登录测试、删除分类测试和修改密码测试。对这些功能进行多次的测试,多用几个不同的测试用例。测试的同时还要分析源代码,对于产生的异常结果和错误,进行分析查找其原因,进行解决。

(3)在测试的过程中,尽量使用Debug来进行测试,这样得到的结果和数据更加准确无误。

(4)还要对系统进行高数据下并行和并发的系统测试。

5.3功能测试

5.3.1 数据爬取功能测试

数据爬取功能是系统获取网易云音乐等数据源的重要部分。我们对爬取的数据进行了测试,验证其准确性和完整性。通过测试结果显示,爬取的数据与预期一致,没有遗漏或错误。下图为爬取数据量的统计图表:

图5-1数据量的统计图表

5.3.2 数据清洗功能测试

数据清洗功能对从数据源获取的原始数据进行清洗、去重和异常值处理等操作。我们对清洗后的数据进行了测试,验证其质量和可用性。测试结果显示,清洗后的数据符合预期,不含有重复项和异常值。下图为清洗后的数据质量统计图表:

图5-2清洗后的数据质量统计图表

5.3.3 数据分析功能测试

数据分析功能是系统的核心功能之一,通过对数据进行分析,揭示数据背后的规律和趋势。我们对系统的数据分析功能进行了测试,验证其准确性和可靠性。测试结果显示,系统能够正确地分析数据,并给出合理的结果。

5.3.4 数据可视化功能测试

数据可视化功能是系统展示分析结果的重要手段,能够直观地展示数据分析的结果和趋势。我们对系统的数据可视化功能进行了测试,验证其效果和可用性。测试结果显示,系统能够通过图表清晰地展示数据分析结果,用户能够直观地理解数据分析的内容。下图为数据可视化效果图:

图5-3 数据可视化效果图

5.3.5 综合功能测试结果

综合以上各项功能测试结果,整体而言,系统的功能测试全部通过,各项功能均能正常工作并符合预期要求。系统能够准确地获取、清洗、分析和展示数据,为用户提供了高效便捷的数据分析服务。同时,系统的稳定性和可靠性也得到了有效验证,用户可以放心使用系统进行数据分析和可视化操作。总测试结果图:

图5-4 总测试结果图

5.4本章小结

本章对系统的功能进行了全面测试,包括数据爬取、数据清洗、数据分析和数据可视化等方面。通过功能测试,我们验证了系统的各项功能能够正常工作,并且符合预期要求。在数据爬取方面,系统成功获取了大量的网易云音乐等数据源的数据,保证了数据的完整性和准确性;在数据清洗方面,系统对原始数据进行了有效的清洗和处理,确保了数据的质量和可用性;在数据分析方面,系统能够准确地分析数据,并得出有价值的结论,满足了用户的需求;在数据可视化方面,系统通过图表等方式清晰地展示了数据分析的结果,帮助用户直观地理解数据。整体而言,系统经过功能测试后表现良好,各项功能均达到了预期要求,为用户提供了高效、便捷的数据分析服务。

 第六章 结果分析与讨论

6.1 数据分析结果

在系统的数据分析过程中,我们通过采集和处理网易云音乐数据,得出了一系列有关欧美音乐歌单的关键结果。首先,我们深入分析了欧美歌单中的热门歌曲,通过统计播放量和评论数量,确定了TOP10歌曲和歌单。这些结果为我们提供了宝贵的信息,可以帮助我们了解用户对欧美音乐的喜好和趋势。其次,我们对欧美歌单的播放数量分布进行了详细的分析,从而揭示了用户对不同播放量范围内歌单的偏好程度。这有助于我们更好地了解用户的听歌习惯和喜好水平。此外,我们还通过分析歌单标签数据和介绍文本,生成了歌单标签图和歌单介绍词云图,这些图表展示了用户对不同类型音乐的喜好和歌单介绍中的关键词。通过这些分析结果,我们可以更全面地了解用户的音乐偏好和兴趣爱好,为后续的音乐推荐和个性化服务提供重要参考依据。综上所述,通过对欧美音乐歌单数据的深入分析,我们得到了丰富的信息和洞察,这些结果为我们提供了宝贵的参考和启示,有助于优化音乐推荐系统和提升用户体验。

6.2 结果讨论与优化建议

首先,针对欧美歌单中的热门歌曲和播放数量分布,我们可以看到一些明显的趋势和偏好。例如,某些歌曲和歌单的播放量和评论数量明显高于其他歌曲,这可能是因为它们具有更广泛的受众群体或者更受欢迎的音乐风格。因此,我们建议在音乐推荐系统中加强对这些热门歌曲的推荐,以提高用户的满意度和粘性。

其次,从歌单标签图和介绍词云图中我们可以看到用户对不同类型音乐的偏好和兴趣。通过分析这些图表,我们可以发现用户对某些特定类型音乐的喜爱程度较高,例如流行、摇滚、电子等。因此,我们建议在音乐推荐系统中增加对这些热门类型音乐的推荐,以提高推荐的准确性和针对性。

此外,对于歌单介绍词云图中的关键词,我们可以了解用户在描述歌单时所使用的词汇和关注点。通过分析这些关键词,我们可以更好地了解用户对音乐的描述和期望,进而优化音乐推荐系统的推荐策略和内容展示方式,提升用户体验。

最后,针对数据分析过程中可能存在的一些限制和局限性,我们需要不断改进和优化数据采集、清洗、分析和展示的流程和方法,以提高数据分析的效率和准确性。例如,可以采用更先进的算法和技术进行数据分析,同时加强对数据质量和可靠性的监控和评估,以确保分析结果的准确性和可信度。

综上所述,通过对数据分析结果的深入讨论和分析,我们可以更好地了解用户的音乐偏好和需求,为优化音乐推荐系统和提升用户体验提供重要参考和建议。通过不断改进和优化系统的功能和性能,我们可以更好地满足用户的需求,提高系统的竞争力和可持续发展能力。

6.3本章小结

在本章中,我们对系统进行了全面的数据分析,并讨论了分析结果及其潜在影响。首先,我们通过采集和处理网易云音乐等数据源的数据,得出了关于欧美音乐歌单的关键结果。我们深入分析了欧美歌单中的热门歌曲、播放数量分布、歌单标签和介绍文本,从中获取了用户的音乐偏好和兴趣。通过对这些数据的分析,我们可以更好地理解用户的喜好和趋势,为后续的音乐推荐和个性化服务提供重要参考。

在结果讨论与优化建议部分,我们针对数据分析结果提出了一系列的优化建议。首先,针对热门歌曲和播放数量分布,我们建议加强对这些热门歌曲的推荐,以提高用户满意度和粘性。其次,针对歌单标签和介绍文本,我们建议增加对热门类型音乐的推荐,以提高推荐的准确性和针对性。最后,我们强调了不断改进和优化系统功能和性能的重要性,以确保数据分析结果的准确性和可信度。

通过对数据分析结果的深入讨论和分析,我们可以更好地了解用户的音乐偏好和需求,为优化音乐推荐系统和提升用户体验提供了重要参考和建议。随着系统不断改进和优化,我们相信可以更好地满足用户的需求,提高系统的竞争力和可持续发展能力。

在接下来的章节中,我们将对系统的功能和性能进行测试,以进一步验证系统的稳定性和可靠性。同时,我们也将根据测试结果对系统进行调整和优化,以确保系统能够持续发展并更好地为用户提供服务。

 第七章 结论与展望

7.1 总结研究工作

本文基于网易云音乐数据,以Django框架为基础,设计并实现了一个音乐数据分析与展示系统。通过系统,我们对欧美音乐歌单进行了深入的数据分析,包括热门歌曲、播放数量分布、歌单标签和介绍文本等方面。在系统开发过程中,我们采用了Django的ORM机制进行数据存储和交互,并利用pyecharts库实现了数据可视化展示。

7.2 研究成果与贡献

本研究的主要成果和贡献包括:

1. 设计并实现了一个基于Django框架的音乐数据分析与展示系统,为用户提供了直观、全面的音乐数据展示界面。

2. 通过数据分析,深入挖掘了欧美音乐歌单的关键特征和趋势,为用户了解音乐偏好和趋势提供了重要参考。

3. 提出了针对数据分析结果的优化建议,为音乐推荐系统和个性化服务的进一步优化提供了思路和方向。

7.3 展望未来研究方向

尽管本研究取得了一定成果,但仍有许多方面有待进一步研究和完善:

1. 数据来源拓展: 可以考虑整合更多的数据源,如其他音乐平台或社交媒体平台的数据,以获得更加全面和多样化的音乐数据。

2. 算法优化: 在数据分析和推荐算法方面,可以采用更先进的机器学习和深度学习算法,提高系统的智能化水平和推荐准确度。

3. 用户体验优化: 进一步优化系统的用户界面和交互体验,提高用户的满意度和使用便捷性。

4. 个性化推荐: 基于用户的历史行为和偏好数据,开发更加个性化的音乐推荐系统,为用户提供更符合其口味的推荐服务。

5. 数据隐私保护: 在数据采集和处理过程中加强对用户隐私信息的保护,遵守相关法律法规和隐私政策,确保用户数据的安全性和隐私性。

综上所述,未来的研究可以在数据来源拓展、算法优化、用户体验优化、个性化推荐和数据隐私保护等方面展开,进一步提升音乐数据分析与展示系统的功能和性能,为用户提供更好的服务和体验。

 第八章 参考文献

[1]郝爱.音乐社交平台用户互动行为研究[D].山东师范大学,2023.DOI:10.27280/d.cnki.gsdsu.2023.000313.

[2]汤艺航.互动仪式链视阈下网易云音乐用户的互动行为研究[D].新疆财经大学,2022.DOI:10.27428/d.cnki.gxcjc.2022.000062.

[3]迟源.网易云音乐用户行为调查报告[D].河南工业大学,2018.

[4]徐志.基于网络爬虫的菜谱搜索和智能推荐方法研究[D].安徽建筑大学,2022.DOI:10.27784/d.cnki.gahjz.2022.000419.

[5]王厚轩.基于主题爬虫的股票搜索平台的实现[D].华东师范大学,2022.DOI:10.27149/d.cnki.ghdsu.2022.005126.

[6]王宁.面向大屏的图表展示系统设计与实现[D].西安电子科技大学,2019.DOI:10.27389/d.cnki.gxadu.2019.002198.

[7]黄正鹏,马欣,陈雪等.基于线性回归算法对多彩贵州旅游数据的分析及应用[J].软件工程,2024,27(03):63-66.DOI:10.19644/j.cnki.issn2096-1472.2024.003.013.

[8]田文涛.Python技术在计算机软件中的应用[J].集成电路应用,2024,41(02):344-346.DOI:10.19339/j.issn.1674-2583.2024.02.157.

[9]龙宇,张童童.Pandas在模拟训练器材统计中的应用[J].福建电脑,2024,40(03):60-64.DOI:10.16707/j.cnki.fjpc.2024.03.012.

[10]史萍萍.大数据环境下基于Django的钻井物料管理系统的设计与实现[D].西安石油大学,2023.DOI:10.27400/d.cnki.gxasc.2023.001015.

[11]白相辰.基于Django框架的Web在线教育平台的设计与实现[D].北京交通大学,2019.DOI:10.26944/d.cnki.gbfju.2019.000099.

[12]王兆媛.基于Django框架的图书管理系统的设计与实现[D].吉林大学,2016.

 附录

数据采集代码

  1. import os
  2. import random
  3. import re
  4. import time
  5. import pandas as pd
  6. import requests
  7. from bs4 import BeautifulSoup
  8. from fake_useragent import UserAgent
  9. cookies = {
  10.     'NMTID''00OR7MOAH0y0pA4w04UryeedOTafCsAAAGMOQcYsA',
  11.     '_iuqxldmzr_''32',
  12.     '_ntes_nnid''fd01d7c634243468cf8eb2c1ee417c9f,1701763815942',
  13.     '_ntes_nuid''fd01d7c634243468cf8eb2c1ee417c9f',
  14.     'WEVNSM''1.0.0',
  15.     'WNMCID''txbaqp.1701763816700.01.0',
  16.     'WM_TID''c0V1syGd0e5ARVBFAVLQjjnuv391BKSM',
  17.     'ntes_utid''tid._.RJqEBvnibqREAhEFFBKVizzrum8lWcPl._.0',
  18.     'sDeviceId''YD-FTXhqQRz8FNFVgVBREfEyDYpo%2F1J0ot1',
  19.     'P_INFO''ac13421705148@163.com|1702978491|0|unireg|00&99|null&null&null#gud&440100#10#0#0|&0||ac13421705148@163.com',
  20.     'b-user-id''7f1f2e0b-c441-da22-3015-62dbd0994cae',
  21.     'hb_MA-9F44-2FC2BD04228F_source''yunxin.163.com',
  22.     '_gid''GA1.2.688739820.1709259065',
  23.     '_ga_Z0JVTF6WF2''GS1.1.1709259065.1.0.1709259065.0.0.0',
  24.     '_ga''GA1.1.52516009.1709259065',
  25.     'WM_NI''D4%2FW1IM1Ti75ojTKeIcbXhN7S3flA%2FYkNekD2NQoQXLJvtDZBZKkzNwvMoRwjbI5c9UDw%2B4B%2BNkwRgmUpEpzxV0KrkguP1zS3AJQCiL1Gl1HybeiIfbKna7AbMtg8druZDM%3D',
  26.     'WM_NIKE''9ca17ae2e6ffcda170e2e6eea3cf6eb4a7ffa3f752bb868fb3c15e868f8eacc880e9e7bf91c63e9cb8aeabd22af0fea7c3b92a88ece1b8b4438fef9c8ab63fadb69cace843a1be9889cd3d91edaa8dc4259bb58286ea50f2929f90d4549096ba95c7528286858cf946b5aa8390d17daabe87d6e233979cb9ccb74ae992a598d16daf8bc0a6f372bc8a00acf161a5aba0d2f959f19f86b2c26390ef898db444bbbeab8acc6ea295a282b64ba293bc88bb70b2ab96a5d037e2a3',
  27.     'JSESSIONID-WYYY''IP3K%2FWgaveiX0BaKo2DwRmU3tE6pJBAEqUo9xrTnJuhwG%5CFAfVIow8MzIsDUaUabm2D%5CxZr5hVxX16l8K4EDIqJFTRo6ogypdRjs8Q9%2Bq%5C5lBiyUpj0K7SvPvkgvduuwbMyutCokzhQycbWV8GE1IXmYcCbG4%5CHyxZWaFTQuionDTqoS%3A1709264346231',
  28. }
  29. def get_song_info(ids):
  30.     headers = {
  31.         'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0',
  32.         'referer''https://music.163.com/',
  33.     }
  34.     headers['user-agent']=UserAgent().random
  35.     params = {
  36.         'id'f'{ids}',
  37.     }
  38.     response = requests.get('https://music.163.com/song', params=params, cookies=cookies, headers=headers)
  39.     soup = BeautifulSoup(response.text, 'html.parser')
  40.     try:
  41.         # 找到包含歌手和专辑信息的<div>标签
  42.         cnt_div = soup.find('div', class_='cnt')
  43.         # 获取第一个<p class="des s-fc4">作为歌手
  44.         artist_p = cnt_div.find('p', class_='des s-fc4')
  45.         artist = artist_p.text.strip().replace('歌手:''')
  46.     except:
  47.         artist=''
  48.     try:
  49.         # 获取第二个<p class="des s-fc4">作为所属专辑
  50.         album_p = artist_p.find_next_sibling('p', class_='des s-fc4')
  51.         album = album_p.text.strip().replace('所属专辑:''')
  52.     except:
  53.         album = ''
  54.     return artist,album
  55. def owen_info(ids):
  56.     headers = {
  57.         'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0',
  58.         'referer''https://music.163.com/',
  59.     }
  60.     headers['user-agent'] = UserAgent().random
  61.     params = {
  62.         'id'f'{ids}',
  63.     }
  64.     response = requests.get('https://music.163.com/user/home', params=params, cookies=cookies, headers=headers)
  65.     soup = BeautifulSoup(response.text, 'html.parser')
  66.     try:
  67.         # 找到<h2 id="j-name-wrap">标签
  68.         h2_tag = soup.find('h2', id='j-name-wrap')
  69.         # 获取<span class="lev u-lev u-icn2 u-icn2-lev">作为等级
  70.         level_span = h2_tag.find('span', class_='lev u-lev u-icn2 u-icn2-lev')
  71.         level = level_span.text.strip()
  72.     except AttributeError:
  73.         level = ''
  74.     # 获取id="event_count"作为动态数量
  75.     try:
  76.         event_count = soup.find('strong', id='event_count').text.strip()
  77.     except AttributeError:
  78.         event_count = ''
  79.     # 获取id="follow_count"作为关注数量
  80.     try:
  81.         follow_count = soup.find('strong', id='follow_count').text.strip()
  82.     except AttributeError:
  83.         follow_count = ''
  84.     # 获取id="fan_count"作为粉丝数量
  85.     try:
  86.         fan_count = soup.find('strong', id='fan_count').text.strip()
  87.     except AttributeError:
  88.         fan_count = ''
  89.     # 获取<div class="inf s-fc3 f-brk">作为个人介绍
  90.     description_div = soup.find('div', class_='inf s-fc3 f-brk')
  91.     try:
  92.         description = description_div.text.strip().replace('个人介绍:''')
  93.     except AttributeError:
  94.         description = ''
  95.     # 获取<div id="cHeader">作为创建歌单数量
  96.     playlist_count_div = soup.find('div', id='cHeader')
  97.     try:
  98.         playlist_count = playlist_count_div.text.strip()
  99.     except AttributeError:
  100.         playlist_count = ''
  101.     return [level,event_count,follow_count,fan_count,description,playlist_count]
  102. def zong_info(ids):
  103.     headers = {
  104.         'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0',
  105.         'referer''https://music.163.com/',
  106.     }
  107.     params = {
  108.         'id'f'{ids}',
  109.     }
  110.     response = requests.get('https://music.163.com/playlist', params=params, cookies=cookies, headers=headers)
  111.     # 解析 HTML
  112.     soup = BeautifulSoup(response.content, 'html.parser')
  113.     # 提取歌单标题
  114.     title = soup.find('div', class_='tit').text.strip()
  115.     try:
  116.         #标签
  117.         cnt=soup.find('div',class_='cnt')
  118.         # print(cnt)
  119.         tags=cnt.find_all('a',class_='u-tag')
  120.         tagss=''
  121.         for tag in tags:
  122.             tagss += tag.text
  123.             tagss += ' '
  124.     except:
  125.         tagss=''
  126.     # print(tags)
  127.     try:
  128.         #歌单介绍
  129.         album_desc=soup.find('p',class_='intr f-brk').text.strip()
  130.     except:
  131.         album_desc=''
  132.     # 提取创作者
  133.     author = soup.find('span', class_='name').text.strip()
  134.     # 提取详情链接
  135.     detail_link ='https://music.163.com/#'+ soup.find('span', class_='name').find('a')['href']
  136.     datail_isds= re.search(r'\d+', soup.find('span', class_='name').find('a')['href']).group()
  137.     owen_infos=owen_info(datail_isds)
  138.     # 提取收藏数、转发数、评论数
  139.     operation_div = soup.find('div', id='content-operation')
  140.     collect_count = operation_div.find_all('a')[2].text.strip().replace('(','').replace(')','')
  141.     forward_count = operation_div.find_all('a')[3].text.strip().replace('(','').replace(')','')
  142.     comment_count = operation_div.find_all('a')[5].text.strip().replace('(','').replace(')','')
  143.     # 提取歌曲数、播放次数
  144.     track_count = soup.find('span', id='playlist-track-count').text.strip()
  145.     play_count = soup.find('strong', id='play-count').text.strip()
  146.     # 提取喜欢这个歌单的人
  147.     liked_people = ' '.join(a['title'].strip() for a in soup.select('div.g-wrap7 ul.m-piclist.f-cb li a'))
  148.     resp=[title,author]+[tagss,album_desc]+owen_infos+[detail_link,collect_count,forward_count,comment_count,track_count,play_count,liked_people]
  149.     # 打印提取的信息
  150.     # 查找包含歌曲链接和内容的<ul>标签
  151.     ul_tag = soup.find('ul', class_='f-hide')
  152.     zong_list=[]
  153.     # 遍历每个<li>标签,提取出href链接和内容
  154.     for li_tag in ul_tag.find_all('li'):
  155.         time.sleep(random.randint(1,3))
  156.         href =li_tag.a['href']
  157.         song_id = re.search(r'\d+', href).group()
  158.         artist,album=get_song_info(song_id)
  159.         content = li_tag.a.text
  160.         zong_list.append(resp+[content,artist,album,song_id])
  161.     return zong_list
  162. def saves(data):
  163.     df = pd.DataFrame(data)
  164.     csv_filename = '网易云数据.csv'
  165.     # 如果文件存在,则不写入表头
  166.     write_header = not os.path.exists(csv_filename)
  167.     df.columns = ['歌单标题''创作者','歌单标签','歌单介绍''等级''动态数量''关注数量''粉丝数量''个人介绍''创建歌单数量',
  168.                   '详情链接''收藏数''转发数''评论数''歌曲数''播放次数''喜欢这个歌单的人''歌曲标题',
  169.                   '歌手''专辑''歌曲id']
  170.     # 将结果 DataFrame 写入 CSV 文件
  171.     df.to_csv(csv_filename, mode='a', index=False, header=write_header, encoding='utf-8')
  172.     print(1)
  173. def save(data):
  174.     df=pd.DataFrame(data)
  175.     df.columns=['歌单标题','创作者','歌单标签','歌单介绍','等级','动态数量','关注数量','粉丝数量','个人介绍','创建歌单数量','详情链接','收藏数','转发数','评论数','歌曲数','播放次数','喜欢这个歌单的人','歌曲标题','歌手','专辑','歌曲id']
  176.     df.to_excel('网易云数据.xlsx',index=False)
  177. def get_url(page):
  178.     headers = {
  179.         'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0',
  180.         'referer''https://music.163.com/',
  181.     }
  182.     headers['user-agent']=UserAgent().random
  183.     offset = str(30 * (int(page) - 1))
  184.     params = {
  185.         'order''hot',
  186.         'cat''全部',
  187.         'limit''35',
  188.         'offset': offset,
  189.     }
  190.     response = requests.get('https://music.163.com/discover/playlist/', params=params, headers=headers)
  191.     # 解析页面内容
  192.     soup = BeautifulSoup(response.text, 'html.parser')
  193.     # 获取所有电影链接
  194.     movie_links = []
  195.     for dd in soup.find_all('ul', id='m-pl-container')[0].find_all('li'):
  196.         movie_link = str(dd.find('a')['href']).split('=')[-1]
  197.         movie_links.append(movie_link)
  198.     movie_links = list(set(movie_links))
  199.     return movie_links
  200. def main():
  201.     save_list = []
  202.     for i in range(1,20,1):
  203.         try:
  204.             print(f'正在获取第{i}页')
  205.             time.sleep(random.randint(1,2))
  206.             get_urls=get_url(i)
  207.             for url_s in get_urls:
  208.                 print(url_s)
  209.                 try:
  210.                     time.sleep(random.randint(12))
  211.                     zong_info_List = zong_info(url_s)
  212.                     save_list.extend(zong_info_List)
  213.                     saves(zong_info_List)
  214.                 except Exception as e:
  215.                     print(f"发生异常: {str(e)}")
  216.                     input('大概率是出验证码了,手动打开链接去做滑块再按回车')
  217.         except Exception as e:
  218.             print(f"发生异常: {str(e)}")
  219.             input('大概率是出验证码了,手动打开链接去做滑块再按回车,如果没有也按回车')
  220.         finally:
  221.             save(save_list)
  222.     save(save_list)
  223. main()

可视化代码

  1. import pandas as pd
  2. from pyecharts import options as opts
  3. from pyecharts.charts import *
  4. from pyecharts.faker import Faker
  5. data=pd.read_csv('网易云数据.csv')
  6. # 1.歌单中的 TOP10 歌曲
  7. def oumeiTop():
  8.     dic=data['歌曲标题'].value_counts().head(10).to_dict()
  9.     print(dic)
  10.     c = (
  11.         Bar(init_opts=opts.InitOpts(renderer='svg',width="750px",height="400px",))#renderer='svg',width="1000px",height="400px",
  12.         .add_xaxis(list(dic.keys()))
  13.         .add_yaxis("欧美 TOP10 歌曲", list(dic.values()), stack="stack1",itemstyle_opts=opts.ItemStyleOpts(color="#6ec2fd"))
  14.         .set_series_opts(label_opts=opts.LabelOpts(is_show=False,position="right",color='white'))
  15.         # .set_global_opts()#title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)")
  16.         .set_global_opts(
  17.             legend_opts=opts.LegendOpts(
  18.                 textstyle_opts=opts.TextStyleOpts(color='white')
  19.             ),
  20.             title_opts=opts.TitleOpts(title="柱状图示例",is_show=False),  # 设置标题
  21.             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色   ,interval=0, rotate=-23, margin=20
  22.             yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色  ,interval=0, rotate=23, margin=-10
  23.             # margin_right=30  # 设置右边距为 30 像素
  24.         )
  25.         .reversal_axis()
  26.     ).render_embed()
  27.     return c
  28. # 2.歌单播放 TOP10
  29. def gedanTop():
  30.     grouped = data.groupby('歌单标题').agg({'播放次数''sum'}).reset_index()
  31.     dic = grouped.sort_values('播放次数',ascending=False).head(10).set_index('歌单标题')['播放次数'].to_dict()
  32.     c = (
  33.         Bar(init_opts=opts.InitOpts(renderer='svg',width="750px",height="400px",))
  34.         .add_xaxis(list(dic.keys()))
  35.         .add_yaxis("欧美歌单播放 TOP10", list(dic.values()), stack="stack1",itemstyle_opts=opts.ItemStyleOpts(color="#6ec2fd"))
  36.         .set_series_opts(label_opts=opts.LabelOpts(is_show=False,position="right",color='white'))
  37.         # .set_global_opts()#title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)")
  38.         .set_global_opts(
  39.             legend_opts=opts.LegendOpts(
  40.                 textstyle_opts=opts.TextStyleOpts(color='white')
  41.             ),
  42.             title_opts=opts.TitleOpts(title="柱状图示例",is_show=False),  # 设置标题
  43.             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色   ,interval=0, rotate=-23, margin=20
  44.             yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色
  45.         )
  46.         .reversal_axis()
  47.     ).render_embed()
  48.     return c
  49. # 3.歌单评论 TOP10
  50. def gedanplTop():
  51.     # 按 '歌曲标题' 分组,求每组的评论条数,并重置索引
  52.     grouped_data = data.groupby('歌曲标题').size().reset_index(name='评论条数')
  53.     # 根据评论条数倒序排列
  54.     dic = grouped_data.sort_values(by='评论条数', ascending=False).set_index('歌曲标题')['评论条数'].head(10).to_dict()
  55.     # dic=data.groupby('歌曲标题').agg({'评论数': 'sum'}).reset_index().sort_values('评论数',ascending=False).head(10).set_index('歌曲标题')['评论数'].to_dict()
  56.     c = (
  57.         Bar(init_opts=opts.InitOpts(renderer='svg',width="750px",height="400px",))
  58.         .add_xaxis(list(dic.keys()))
  59.         .add_yaxis("欧美歌单播放 TOP10",
  60.                    list(dic.values()),
  61.                    stack="stack1",itemstyle_opts=opts.ItemStyleOpts(color="#6ec2fd"),
  62.         )
  63.         # .set_series_opts(label_opts=opts.LabelOpts(is_show=False,position="right",color='white))
  64.         .set_global_opts()#title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)")
  65.         .set_global_opts(
  66.             legend_opts=opts.LegendOpts(
  67.                 textstyle_opts=opts.TextStyleOpts(color='white')
  68.             ),
  69.             title_opts=opts.TitleOpts(title="柱状图示例",is_show=False),  # 设置标题
  70.             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white',interval=0, rotate=-23, margin=20)),  # 设置 x 轴文字颜色为蓝色
  71.             yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色
  72.         )
  73.         .reversal_axis()
  74.     ).render_embed()
  75.     return c
  76. # gedanplTop()
  77. import numpy as np
  78. # 4.获得欧美歌单播放数量分布情况
  79. def ztTop():
  80.     # 生成正态分布数据
  81.     labels = [05000100001500020000250003000035000400004500050000550006000065000700007500080000850009000095000]
  82.     # 生成间隔为一万的列表
  83.     bins=[05000100001500020000250003000035000400004500050000550006000065000700007500080000850009000095000]
  84.     # 打印结果
  85.     # 将列进行范围划分并统计每个范围的数量
  86.     data['范围'] = pd.cut(data['播放次数'], bins=bins, labels=labels[:-1])
  87.     count_by_range = data['范围'].value_counts().to_dict()
  88.     # 打印结果
  89.     # 创建柱状图
  90.     bar = (
  91.         Bar(init_opts=opts.InitOpts(renderer='svg',width="750px",height="400px",))
  92.         .add_xaxis(bins)
  93.         .add_yaxis("", list(count_by_range.values()))
  94.         .set_global_opts(
  95.             title_opts=opts.TitleOpts(title="欧美歌单播放数量分布情况", pos_left="center",
  96.                                       title_textstyle_opts=opts.TextStyleOpts(color='white')),  # 设置标题
  97.             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="white", interval=0, rotate=-23, margin=20)),
  98.             # 设置 x 轴文字颜色为蓝色
  99.             yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="white")),  # 设置 x 轴文字颜色为蓝色
  100.         ).render_embed()
  101.     )
  102.     return bar
  103. # # 5.歌单标签图
  104. def bqTop():
  105.     dataaa = [
  106.         {"value": v, "name"f"{k}\n{v}"for k,v in data['歌单标签'].value_counts().head(10).to_dict().items()
  107.     ]
  108.     c = (
  109.         TreeMap(init_opts=opts.InitOpts(renderer='svg',width="750px",height="400px",))
  110.         .add("歌单标签图", dataaa)
  111.         .set_global_opts(
  112.             title_opts=opts.TitleOpts(title="歌单标签图",is_show=False),  # 设置标题
  113.             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white',interval=0, rotate=-23, margin=20)),  # 设置 x 轴文字颜色为蓝色
  114.             yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),  # 设置 x 轴文字颜色为蓝色
  115.         ).render_embed()
  116.     )
  117.     return c
  118. from collections import Counter
  119. import jieba
  120. # # 6.获得歌单介绍词云图
  121. def ciyun():
  122.     # 使用 jieba 进行分词处理
  123.     seg_list = []
  124.     datad = data.dropna(subset=['歌单介绍'])
  125.     for text in datad['歌单介绍']:
  126.         seg_list.extend(jieba.lcut(str(text)))
  127.     # 定义停用词列表
  128.     stop_words = ['是''的''在''了''和''与''我''你''他''她',']','[','\\','!','~','·']
  129.     # 去除停用词
  130.     word_counts = Counter(seg_list)
  131.     stop_word_counts = Counter(stop_words)
  132.     word_counts.subtract(stop_word_counts)
  133.     # 定义要去除的谓词列表
  134.     # 去除谓词
  135.     for predicate in stop_words:
  136.         del word_counts[predicate]
  137.     # 创建词云对象并生成词云
  138.     wordcloud = (
  139.         WordCloud()
  140.         .add("", word_counts.items(), word_size_range=[20100])
  141.         .set_global_opts(
  142.             title_opts=opts.TitleOpts(
  143.                 title="歌单介绍词云图",
  144.                 pos_left="center",
  145.                 title_textstyle_opts=opts.TextStyleOpts(color='white')
  146.             ),
  147.         )
  148.     ).render_embed()
  149.     return wordcloud

点赞+收藏+关注 → 私信领取本源代码、数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值