项目说明
网易云音乐歌单数据获取,获取某一歌曲风格的所有歌单,进入每个歌单获取歌单名称、创建者、播放量、页面链接、收藏数、转发数、评论数、标签、介绍、收录歌曲数、部分收录歌名,并统计播放量前十的歌单,将播放量前十的歌单以及对应的所有信息进行另外存储,对其进行可视化展示。
在做这个爬虫的时候,对于如何翻页问题和身边的人进行了探讨,有人说用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