爬取网易云数据并且可视化展示

项目说明

网易云音乐歌单数据获取,获取某一歌曲风格的所有歌单,进入每个歌单获取歌单名称、创建者、播放量、页面链接、收藏数、转发数、评论数、标签、介绍、收录歌曲数、部分收录歌名,并统计播放量前十的歌单,将播放量前十的歌单以及对应的所有信息进行另外存储,对其进行可视化展示。
在做这个爬虫的时候,对于如何翻页问题和身边的人进行了探讨,有人说用selenium模拟点击,但是通过观察网页,我发现即使是不用模拟点击翻页也能历遍爬完歌单的信息,接下来我就带着大家一起如何爬取数据。

代码框架

在这里插入图片描述

第三方库说明

在项目中用到的一些第三方库的介绍:

#      bs4
'''
BS4全称是Beautiful Soup,它提供一些简单的、
python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱,通过解析文档为Beautiful Soup自动将输入文档转换为
Unicode编码,输出文档转换为utf-8编码。
'''

#     requests
'''
用requests库来访问网页,获取网页内容,支持HTTP特性
'''

#     time
'''
Time库是与时间处理有关的模块,
在这个项目中是用来强制网页访问间隔时间的。
'''

#     random
'''
Random库主要功能是提供随机数,在项目中和time库配合使用,
生产随机强制访问的间隔时间的
'''

#     xlwt
'''
Python访问Excel时的库,其功能是写入xls文件,
在本项目中是用于写入爬取的数据
'''

#      pandas  
'''
Pandas库是基于NumPy的一种工具,用于读取文本文件的,
可以快速便捷的处理数据的库。
'''

#     pyecharts.charts
'''
pyecharts.charts是用于数据可视化的库,其中包含很多种画图工具,
在本项目中应用到的是画柱状图是Bar,圆饼图是Pie
'''

#    matplotlib.pyplot
'''
matplotlib也是可视化的库,由各种可视化的类构成,
matplotlib.pyplot是绘制各类可视化图形的命令子库
'''

内容爬取说明

爬取链接:https://music.163.com/discover/playlist/?cat=

页面详情

观察网页内容是我们进行爬虫项目的首要步骤,这里我选择了华语类型的歌单来观察一下;
在这里插入图片描述
在这里插入图片描述
华语风格的歌单总共有37页,每页有35个歌单,那总共大约有1295个歌单。一个风格的歌单是代表不了全部的,我们在做爬虫的时候要避免以偏概全,多看一个页面,找出规律,这样才能写出结构化的爬虫,当网页的内容发生变化,但总体框架没有变化时,我们的代码就能继续运行,这也是考验代码健壮性的一方面(跑偏了)。
在选择其他歌单类别后,可以看到每个类别的歌单基本都是用37或38个页面来存放歌单,每个页面有35个歌单,那如何历遍每一个页面呢?
我当时面对这个问题的时候也是想了很久,又不想用selenium模拟点击,那我们就要多观察源代码,看看有没有蛛丝马迹。

老规矩 F12 进入开发者选项:

在这里插入图片描述
在这里插入图片描述
在源代码中,我们可以看到每个页面对应的链接是有规律的,

例如:“https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%8D%8E%E8%AF%AD&limit=35&offset=35”

通过网页链接观察,我发现对于网页翻页的重点在于“&limit=35&offset=35”的数字35,每个页面是以链接后面的数字决定当前是在第几个页面,是以0为首页面,35为倍数的规律,第一个页面为 “&limit=0&offset=0”, 第二个页面为 “&limit=35&offset=35”,第三个页面为 “&limit=35&offset=70”,以此类推,只要知道当前类别的歌单有多少个页面,就可以通过for循环来循环翻页,遍历每一个页面。

既然我们已经知道了翻页的规律了,那现在的重点就是获取歌单的页数。我们可以在箭头指引的地方,用开发者选项自带的复制方式,直接右键选择copy,copy selector直接复制CSS选择器语句;

标签: #m-pl-pager > div > a:nth-child(11)

#获取歌单网页的页数
result = bs.select('#m-pl-pager > div > a:nth-child(11)') 

那接下来就是对单个歌单进行内容爬取了,由于我们爬取的内容较多,所以这里就不一一列举了,大家可以自行对比参照,不懂可以私信。

获取歌单名称
在这里插入图片描述
进入每一个页面,获取该页面的每一个歌单,进入单个歌单中,歌单名称,创建者,播放量等数据都存放在网页的同一个div内,

id='content-operation'

通过selector选择器选择各个内容的,由于是在网易云的网页版,因此在歌单内的歌曲并没有显示所有歌曲,只显示了10条歌曲,因此在爬取的时候每个歌单只获取了10条歌曲。如果还想要爬取每天歌曲更多详细内容,可以进入歌曲的url链接,获取更多的内容

完整代码

这里我会定义一个内容类Content 和 网页信息类Website,进行结构化爬虫,如果不是很理解的话,可以看看我之前发过的内容,

爬取三联生活周刊新闻

Content类和 Website类

class Content:
    def __init__(self, url, name, creator, play, collect, transmit, comment, tag,
                introduce, sing_num, sing_name):
        self.url = url
        self.name = name
        self.creator = creator
        self.play = play
        self.collect = collect
        self.transmit = transmit
        self.comment = comment
        self.tag = tag
        self.introduce = introduce
        self.sing_num = sing_num
        self.sing_name = sing_name
        
    def print(self):
        print("URL: {}".format(self.url))
        print("NAME:{}".format(self.name))
        print("CRAETOR:{}".format(self.creator))
        print("PLAY:{}".format(self.play))
        print("COLLECT:{}".format(self.collect))
        print("TRANSMIT:{}".format(self.transmit))
        print("COMMENT:{}".format(self.comment))
        print("TAG:{}".format(self.tag))
        print("INTRODUCE:{}".format(self.introduce))
        print("SING_NUM:{}".format(self.sing_num))
        print("SIN
编写一个复杂的代码爬取网易云音乐的数据并实现可视化,通常需要分几个步骤: 1. **需求分析**: - 确定需要抓取的具体数据,如歌曲信息、歌词、评论等。 2. **网络请求库选择**: - Python 中可以使用 requests 库发起 HTTP 请求获取网页内容。 3. **解析 HTML**: - 使用 BeautifulSoup 或 lxml 这样的库解析 HTML 格式的网页数据。 4. **登录机制处理**: - 如果数据需要登录才能访问,可能需要模拟登录过程,使用如 selenium 或者 PyAutoGUI。 5. **数据提取**: - 编写函数针对每个页面元素查找对应的 API 路径或HTML标签,提取所需的数据。 6. **数据存储**: - 将数据保存到文件(CSV、JSON 或数据库)中,方便后续处理。 7. **数据分析和可视化**: - 可以使用 pandas 数据库操作库对数据清洗和预处理,然后用 matplotlib 或 seaborn 进行统计图表绘制,比如歌曲热度图、评论情感分析等。 ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt # 登录功能省略... def fetch_music_data(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 提取你需要的数据 songs_info = soup.find_all('div', class_='music-item') # 示例,根据实际页面结构找节点 return [parse_song_info(s) for s in songs_info] def parse_song_info(song_element): title = song_element.find('span', class_='title').text # 其他信息类似,根据实际HTML结构填充 return {'title': title} # 获取初始数据 initial_url = 'https://music.163.com/#/discover/toplist' songs_list = fetch_music_data(initial_url) # 存储数据 data_df = pd.DataFrame(songs_list) data_df.to_csv('netEase_music.csv') # 数据可视化示例 comments_df = pd.read_csv('netEase_comments.csv') # 假设我们有另一个评论数据csv文件 plt.figure(figsize=(10, 5)) plt.hist(comments_df['rating'], bins=range(1, 6), rwidth=0.8) plt.xlabel('评论评分') plt.ylabel('频数') plt.title('网易云音乐歌曲评论分布') plt.show() ```
评论 68
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值