项目说明

网易云音乐歌单数据获取,获取某一歌曲风格的所有歌单,进入每个歌单获取歌单名称、创建者、播放量、页面链接、收藏数、转发数、评论数、标签、介绍、收录歌曲数、部分收录歌名,并统计播放量前十的歌单,将播放量前十的歌单以及对应的所有信息进行另外存储,对其进行可视化展示。

在做这个爬虫的时候,对于如何翻页问题和身边的人进行了探讨,有人说用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 = urlself.name = nameself.creator = creatorself.play = playself.collect = collectself.transmit = transmitself.comment = commentself.tag = tagself.introduce = introduceself.sing_num = sing_numself.sing_name = sing_namedef 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("SING_NAME:{}".format(self.sing_name))class Website:def __init__(self, searchUrl, resultUrl,  pUrl, absoluterUrl, nameT, creatorT, playT, collectT, transmitT, commentT, tagT, introduceT, sing_numT, sing_nameT):self.resultUrl = resultUrlself.searchUrl = searchUrlself.absoluterUrl = absoluterUrlself.pUrl = pUrlself.nameT = nameTself.creatorT = creatorTself.playT = playTself.collectT = collectTself.transmitT = transmitTself.commentT = commentTself.tagT = tagTself.introduceT = introduceTself.sing_numT = sing_numTself.sing_nameT = sing_nameT

爬取类 Crawler

from bs4 import BeautifulSoup
import re
import requests
import time
import random
import xlwt  #进行excel操作class Crawler:#爬取网页函数def getWeb(self, url):  try:  #异常处理#请求头headers_ = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}req = requests.get(url, headers = headers_)req.encoding = "utf-8"  #网页格式化,避免出现乱码except requests.exceptions.RequestException:return Nonereturn BeautifulSoup(req.text, "html.parser")#爬取所需内容的函数   def getContent(self, pageObj, selector):childObj = pageObj.select(selector)#         print("\n".join(line.text for line in childObj))return "\n".join(line.text for line in childObj)#搜索函数,主函数    def search(self, topic, site):#         爬取某种风格的歌单有多少页newurl = site.searchUrl + topicnewurl = requests.utils.quote(newurl, safe=':/?=&')  #对url链接上存在的中文字符进行处理bs = self.getWeb(newurl)result = bs.select('#m-pl-pager > div > a:nth-child(11)')  num = int("\n".join(link.text for link in result))  #某种风格歌单的页数#         翻页,选取一种歌曲风格,有多个页面加载歌单,分别读取for i in range(0, num+1):j = 35*iurl = site.searchUrl + topic + '&limit=35&offset=' + str(j)  #构造每个页面的url链接url = requests.utils.quote(url, safe=':/?=&')bs = self.getWeb(url)searchResults = bs.select(site.resultUrl)for link in searchResults:url = link.attrs["href"]#         判断是否为绝对链接if(site.absoluterUrl):bs = self.getWeb(url)else:bs = self.getWeb(site.pUrl + url)#                 print(site.pUrl + url)if(bs is None):print("something was wrong with that page or URL. Skipping")returnelse:#爬取歌曲名称 main = bs.find('ul',{'class':'f-hide'})sing_name = "\n".join(music.text for music in main.find_all('a'))#             爬取相关内容data = []  #申请一个数组,以歌单为单位,存储每个歌单里面所需要的内容url = site.pUrl + urldata.append(url)#             print(data)
#     加入一个参数,判断目前读取的数据是字符串还是整数name = self.getContent(bs, site.nameT)data.append(name)creator = self.getContent(bs, site.creatorT)data.append(creator)play = self.getContent(bs, site.playT)data.append(play)collect = self.getContent(bs, site.collectT)data.append(collect)transmit = self.getContent(bs, site.transmitT)data.append(transmit)comment = self.getContent(bs, site.commentT)data.append(comment)tag = self.getContent(bs, site.tagT)data.append(tag)introduce = self.getContent(bs, site.introduceT)data.append(introduce)sing_num = self.getContent(bs, site.sing_numT)data.append(sing_num)
#                 sing_name = self.getContent(bs, site.sing_nameT)data.append(sing_name)datalist.append(data)  #以歌单为单位存入数组中#             print(datalist)content = Content(url, name, creator, play, collect, transmit, comment, tag, introduce, sing_num, sing_name)#             content.print()#             return datalist#数据写入文档        def saveData(self, datalist, savepath):print("保存到Excel文件中!")
#         xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩music = xlwt.Workbook(encoding = 'utf-8', style_compression=0)
#     添加sheet表格,并允许重复修改sheet = music.add_sheet('网易云音乐数据爬取', cell_overwrite_ok=True)
#         定义列名col = ("url", "歌单名称", "创建者", "播放量", "收藏量", "转发量", "评论量", "标签", "介绍", "歌曲数量", "歌曲名称" )for i in range(0,11):sheet.write(0, i, col[i])  #将列名写进表格for i in range(0, len(datalist)-1):
#             print("第{}行正在写入".format(i+1))data = datalist[i]for j in range(0, 11):sheet.write(i+1, j, data[j])music.save('E:/新建文件夹/Python爬虫/网易云音乐.xls')print("数据保存成功!")crawler = Crawler()
# searchUrl, resultUrl,  pUrl, absoluterUrl, nameT, creatorT, playT, collectT, transmitT,
#                  commentT, tagT, introduceT, sing_numT, sing_nameT
#对应website类的参数,将website定义的参数进行实例化
siteData = [['https://music.163.com/discover/playlist/?cat=', 'a.msk','https://music.163.com', False, 'div.tit h2.f-ff2.f-brk', 'span.name a','strong#play-count', 'a.u-btni.u-btni-fav i', 'a.u-btni.u-btni-share i','#cnt_comment_count', 'div.tags.f-cb a i', 'p#album-desc-more','div.u-title.u-title-1.f-cb span.sub.s-fc3', 'span.txt a b']]
sites = []
datalist = []
for row in siteData:sites.append(Website(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13]))
topics = "华语"  #选择自己想要的歌曲风格
time.sleep(random.random()*3)
for targetSite in sites:crawler.search(topics, targetSite)
savepath = '网易云音乐.xls'
crawler.saveData(datalist, savepath)

爬取结果

爬取的结果

由于数据太多了,这里就只截取了一部分,有兴趣可以自己运行一下;

内容可视化

可视化代码

import pandas as pd
from pyecharts.charts import Pie  #画饼图
from pyecharts.charts import Bar  #画柱形图
from pyecharts import options as opts
import matplotlib.pyplot as plt# 读入数据,需要更改
#可视化
data = pd.read_excel('网易云音乐.xls')
#根据播放量排序,只取前十个
df = data.sort_values('播放量',ascending=False).head(10)
v = df['歌单名称'].values.tolist()   #tolist()将数据转换为列表形式
d = df['播放量'].values.tolist()
#设置颜色
color_series = ['#2C6BA0','#2B55A1','#2D3D8E','#44388E','#6A368B''#7D3990','#A63F98','#C31C88','#D52178','#D5225B']
# 实例化Pie类
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
# 设置颜色
pie1.set_colors(color_series)
# 添加数据,设置饼图的半径,是否展示成南丁格尔图
pie1.add("", [list(z) for z in zip(v, d)],radius=["30%", "135%"],center=["50%", "65%"],rosetype="area")
# 设置全局配置项
# TitleOpts标题配置项
# LegendOpts图例配置项  is_show是否显示图例组件
# ToolboxOpts()工具箱配置项 默认项为显示工具栏组件pie1.set_global_opts(title_opts=opts.TitleOpts(title='播放量top10歌单'),legend_opts=opts.LegendOpts(is_show=False),toolbox_opts=opts.ToolboxOpts())
# 设置系列配置项
# LabelOpts标签配置项  is_show是否显示标签;  font_size字体大小;
# position="inside"标签的位置,文字显示在图标里面; font_style文字风格
# font_family文字的字体系列
pie1.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12,formatter="{b}:{c}播放量", font_style="italic",font_weight="bold", font_family="Microsoft YaHei"),)
# 生成html文档
pie1.render("E:/玫瑰图.html")
print("玫瑰图保存成功!")print("-----"*15)
# print(df['创建者'].values.tolist())
bar = (Bar().add_xaxis([i for i in df['创建者'].values.tolist()]).add_yaxis('播放量排名前十对应的评论量', df['评论量'].values.tolist())
)
bar.render("E:/条形图.html")
print("柱形图保存成功!")

词云代码

import wordcloud
import pandas as pd
import numpy as npdata = pd.read_excel('网易云音乐.xls')
#根据播放量排序,只取前十个
data = data.sort_values('播放量',ascending=False).head(10)
print(data["歌单名称"])
#font_path指明用什么样的字体风格,这里用的是电脑上都有的微软雅黑
w1 = wordcloud.WordCloud(width=1000,height=700,background_color='white',font_path='msyh.ttc')
txt = "\n".join(i for i in data['歌单名称'])
w1.generate(txt)
w1.to_file('E:\\词云.png')`

玫瑰图

柱形图

词云

结束,有兴趣的朋友可以来交流一下,这期的内容就到这了,大家晚安,拜拜!

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

喜欢网易云的都是什么人群?今天爬取网易云数据并且可视化展示!相关推荐

  1. 爬虫python代码网易云_爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  2. 用python爬取网易云评论10w+的歌曲名_Python3爬取网易云音乐评论

    |下载W3Cschool手机App,0基础随时随地学编程>>戳此了解| 导语 利用Python为自己喜欢的音乐制作专属词云.至于词的来源嘛,当然是对应歌曲的所有评论或者热门评论啦!!!毕竟 ...

  3. 用python爬取网易云评论10w+的歌曲名_Python爬取网易云音乐评论热门歌曲和ID

    一.构造歌手个人主页的URL 前段时间我们获取了网易云音乐全部歌手的id号,今天我们就利用全部歌手的id号来构造歌手个人主页的URL,从而实现用爬取全部歌手的热门歌曲及其id号的目的.以歌手 薛之谦的 ...

  4. 用Python爬取网易云音乐歌曲

    前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...

  5. 毕设总结2:使用python scrapy 爬取 网易云音乐

    网易云音乐爬取教程 爬取网易云热歌榜 分析网页结构 爬取网易云热歌榜 分析网页结构 先还是通过 [scrapy genspider music https://music.163.com/discov ...

  6. python爬取网易云热评

    在爬取了妹子图之后,感觉总想再爬点什么东西增加编程兴趣,因为平时喜欢听歌嘛,然后就想到了爬取网易云热评,一首歌无数个故事23333- 首先打开网易云音乐网页版,找到自己想要爬取的那首歌(我这里搜的是隔 ...

  7. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  8. python爬虫音乐图片的感受_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  9. Python爬虫——selenium爬取网易云评论并做词云

    大家好!我是霖hero 到点了上号网易云,很多人喜欢到夜深人静的时候,在网易云听音乐发表评论,正所谓:自古评论出人才,千古绝句随口来,奈何本人没文化,一句卧槽行天下!评论区集结各路大神,今天我们来爬取 ...

最新文章

  1. 游戏中每日刷新实现思路浅析
  2. Ubuntu14下安装svn仓库,以及权限配置
  3. python 包和模块的区别_3分钟带你搞懂Python模块、包的区别和使用
  4. php pcntl 多进程学习
  5. 计算机系统结构结构相关实验报告,计算机系统结构实验报告.doc
  6. oracle用户管理实例
  7. HTML的基本知识(一)——标题标签
  8. JQuery判断元素是否存在
  9. python不带颜色的图形_用python给黑白图像上色
  10. 你被选中了——晚会上的随机点名
  11. 【学术分享】40个科研学术网站,收藏必备,予取予求!
  12. 倒车入库- 通过后视镜调整方向盘
  13. python异常值处理四分位法_Python清除异常值四分位法
  14. Gartner 魔力象限:云基础设施和平台服务 2020年
  15. 银河麒麟服务器操作系统V10SP2安装搭建OpenVP
  16. 利用Sympy计算sin1°的最小多项式
  17. 关于java开发邮件接收程序的一点总结
  18. linux 字符串数组初始化,Linux命令行 – 数组
  19. Java使用SWFTools转换PDF为SWF
  20. UML--协作图详解

热门文章

  1. Ruby alias 语句
  2. [Android] 介绍一个gradle插件shrinker: 快速无副作用去除apk包中多余的 R类
  3. 2022就业趋势分析,内地平均工资最高的城市是北京达为9227元
  4. C++: 实现随机数生成器(附完整源码)
  5. 科技云报道:大模型的中场战事,深入垂直行业腹地
  6. 环保数据造假屡禁不止?大数据全链条建立“黑名单”
  7. 第七届蓝桥杯决赛JavaA组第五题_广场舞
  8. linux设置为桥接后ipv4不见,centOS不显示ipv4地址的解决办法
  9. 暑假第六次周赛--阿福场
  10. 黑客攻防技术宝典(十九)