前言

大家好,我是Samaritan。
平时写代码的时候,作为云村用户的一员,我当然也是最爱开着网易云音乐(以下简称网易云)。
大家都知道在网易云里你可以查看好友或是任意用户的听歌排行(假使Ta设置全部可见),但是如果想知道Ta喜欢哪些歌手,其中又有哪几个是Ta的最爱呢?很可惜,网易云并没有直接提供信息。
如果不会编程,你将怎么做?

一、网易云和词云

想知道Ta在网易云所有时间喜爱和最爱的歌手,逻辑上讲:
你可以基于Ta的所有时间听歌排行,手动记录他排行中前100首听得最多的歌曲的歌手/音乐人(以下统称为歌手),然后根据记录的信息统计重复出现的歌手次数,以此可以推断出Ta更喜欢的歌手,而余下这些不重复人名也都是Ta喜欢的歌手。
不过显然这样用眼睛看、记录、比对非常的麻烦,几乎不具有可行性。但是我们用python去实现上述逻辑,就没有很大的难度,这里会用到爬虫技术来代替我们去看、去记录,再使用词云图展示和对比出Ta喜爱的歌手。

词云是什么?
简单介绍一下:“词云”,英文’wordle’,这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)提出。他一直很关注网络内容发布的最新形式——即那些只有互联网可以采用而报纸、广播、电视等其它媒体都望尘莫及的传播方式。“词云”就是通过形成“关键词云层”或“关键词渲染”,对网络文本中出现频率较高的“关键词”的视觉上的突出。
词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。

来看一种最简单的词云图

是不是还蛮有趣的?
网上能做词云图的工具不少,虽然它们看起来也很好用,可功能都有些单一,适用范围有限。选择用Python来制作词云,不仅上手简单便利,而将各种模块组合起来合理调用,更是功能强大且自定义广。
看完了这篇文章,你马上就能做出一张比上面示例图更好看的词云图。
说完了思路,现在来跟着我动手吧~

二、用户听歌排行

在正式开始之前,先说明一下,博主使用的IDE是pycharm,如果你用vscode或者jupyter notebook之类的都是没影响的,如有软件操作问题,请自行百度解决哦。

回到正题,我们先来看网易云:
进入网易云音乐随便找一个用户:


点击进入Ta的主页:

在用户主页如果能看到听歌排行,那就说明Ta设置为可见。那我们接着就可以点右下角查看更多,前往完整听歌排行的页面。注意右上角,这些操作都是不需要我们登录自己账号的,这样在爬取时很方便。
随意进入一个用户的完整听歌排行页面:

可以看到url发生了变化,同时展示的歌曲比主页多了很多,最多为Ta听歌排行的前100首。
我们要爬取的就是这个页面,来观察此时的url:
https://music.163.com/#/user/songs/rank?id=412091xxxx
(隐私问题我隐藏了用户最后四位数字)
可以看出url结构最后**?id=xxxx**,当用户设置听歌排行可见时,每次爬取不同用户的url的区别只是最后的id变更,至于id你可以通过访问该用户的任何页面从url最后获取(每人都是唯一且不同的)。

还记得吗?我们今天的目标是爬取所有时间听歌排行,所以请找到右上角最近一周的边上,点击切换到所有时间,再观察页面url:https://music.163.com/#/user/songs/rank?id=412091xxxx
哎呀,什么变化都没是吗?没关系。
对于这样的动态页面,我决定使用selenium来进行爬取比较偷懒 方便~

Selenium模块
简介:Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。简单来说它可以模拟人对浏览器的操作包括点击,输入删除文字,或是滚动屏幕等等。
要使用它,你需要先pip install selenium安装该模块,并且拥有上述浏览器中的一种,然后下载安装对应的驱动webdriver文件。具体安装细节,不会的朋友请自行搜索教程,非常简单,本篇不再赘述。
Tip:使用selenium可以异步加载动态网页,将它变成静态网页后再交由bs4解析,是我常用的好搭档。

回到正题,我们有了url,也决定了使用什么方法爬取,接着我们来找每一首音乐的歌手在网页的位置:
开局一个F12,所有标签全靠ctrl+f~
打开开发者工具(F12)后,到Elements里找歌手信息位置:

使用工具里箭头选中歌手名字看到:

标出来的标签和属性都是可以方便我们等下定位到歌手信息的,而且找到一个就可以找到全部了,所有的歌手信息最后都藏在< li >里:

现在url、爬取方法、信息标签定位都已经齐全,可以开始写代码了!

三、爬取歌手代码

以我用的chrome浏览器为例写代码。
先来导入模块,我们先要用到selenium、bs4和time模块:

import time
from selenium import webdriver
from bs4 import BeautifulSoup

构建url以及设置等下要用到的变量名:

uid = '41209xxxx'#随时可替换用户id
url_recd = 'https://music.163.com/#/user/songs/rank?id='+uid#构建爬取url
unknown = '未知'#特殊情况下错误提示用
asingerlist = []#储存所有时间排行中所有歌手的列表
start = time.time()#设置计时器
samaritan =webdriver.Chrome()#webdriver实例化

接着创建一个负责爬取目标用户所有时间听歌排行的方法好像就可以成功了?因为我们刚刚已经定位到了歌手文本信息。
可是这里有个坑~如果你直接用selenium定位或bs4解析定位尝试刚才的标签的话会什么都找不到。
因为仔细看elements里:

这里是iframe页面嵌套,如果不能进入iframe里面,是不能定位到任何在它里面的标签的。
幸运的是这对selenium来说仍然不是问题:

def get_record():#创建获取歌手信息的方法samaritan.get(url_recd)#实例化对象访问urlsamaritan.switch_to.frame('g_iframe')#找到指定iframe标签(这里是g_iframe)然后跳入samaritan.implicitly_wait(10)#隐式等待checkall = samaritan.find_element_by_id('songsall')#定位到切换到所有时间的按钮标签checkall.click()#模拟鼠标点击查看所有时间下的听歌排行samaritan.implicitly_wait(10)#隐式等待time.sleep(0.5)#这里还需要强制等待加载时间,一般一秒内就可以了htmlrec = samaritan.page_source#此时网页成为静态页面,获取所有页面信息pagerec = BeautifulSoup(htmlrec, 'html.parser')#使用bs4解析静态网页allrec = pagerec.find(class_="g-wrap p-prf").find(class_="m-record").find(class_="j-flag").find_all('li')#定位该位置下所有<li>的标签try:#使用try except结构防止意外报错中断运行for i in allrec:#遍历刚才位置下每一个<li>标签内信息asinger = i.find(class_="s-fc8").text.replace('-', '')#定位并获取歌手文本信息,再用replace方法清洗文本去掉歌名和各种之间连结的'-'asingerlist.append(asinger)#将干净的歌手文本加入列表except:print(unknown)#如遇到意外,提示'未知'。

最后调用方法以及查看结果:

get_record()#调用爬取方法
samaritan.close()#关闭浏览器
end = time.time()#结束计时
print(asingerlist)#打印所有歌手列表
print(f'总共用时:{end-start}秒')#打印程序用时输出结果:
[' Matteo', ' Russ', ' 永彬Ryan.B/AY楊佬叁', ' DP龙猪/宝楽CNBALLER/CLOUDWANG\xa0王云',' 音阙诗听', ' Deep\xa0Chills/IVIE', ' 白小白', ' Fly\xa0Project', ' 金志文'...... #以下省略]总共用时:4.079788398742676

只要四秒钟,我们就完成了对目标用户所有时间听歌排行的歌手爬取。
但是这样一点看不清啊,而且怎么知道哪些歌手更被偏爱呢?
接下去我们就要把这个歌手列表里的内容制作成一目了然的词云图了~

四、制作歌手词云

制作词云我们还需要用到以下模块:
os
PIL
numpy
matplotlib
wordcloud

这些模块的安装使用也不在本篇讲解了,只是展示给大家这种实战情况下如何调用,有兴趣的一样可以自行搜索深入学习。

开始制作词云,依旧先导入模块:

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
from wordcloud import WordCloud

我们用wordcloud的方法处理文本,以生成词云。
无论是你从表格文件还是txt文本还是直接爬取到的数据,只要是字符串就可以给他处理,所以这一步先要将刚才的歌手列表变成wordcloud可以处理的字符串:

astext = ','.join(asingerlist)
#将列表所有元素依序合并成字符串,并用'逗号'连接

是的你没看错,一行代码就ok了!因为我们在加入列表前已经做了数据清洗。
我之前说了,这个词云图要做出比上面举例的那张好看才行,所以我们给它戴一个’面具’mask:
模板图片love.png

d = path.dirname(__file__)
#获取当前文件路径
alice_mask = np.array(Image.open(path.join(d,"love.png")))
#读取模板的图片

非常简单,就两行代码。这里我用了PIL模块读取的图片,也可以使用别的模块比如imageio、opencv等等都一样的。读取以后等下我们会在wordcloud参数设置里套用上它。
现在我们再来美化一下这个词云,我可以使它的颜色在丰富一些:

color_list=['r','g','b','y','pink','purple','orange','black']
#建立颜色数组,列表中的颜色可以随便改动,除了常用颜色英文名外,也可以直接使用RGB色值,例如'#FDF5E6'
colormap=colors.ListedColormap(color_list)
#调用颜色数组

万事俱备啦,现在设置wordcloud对象参数:

wc = WordCloud(
#创建wordcloud实例font_path='wqy-microhei.ttc',#设置字体路径,如果要制作的词云中有中文我们需要下载字体文件调用background_color="white",#设置图片背景色,默认为黑色,这里我觉得用白色比较好看max_words=1000,#设置显示最大单词数colormap=colormap,#设置字体颜色mask=alice_mask,#设置模板图片,戴上'面具'
)
wc.generate(astext)
#根据所有歌手信息的文本生成词云

词云到这里就做好啦,不过别急,现在运行是什么都看不见的哦!
我们需要通过matplotlib模块来展示图片:

plt.imshow(wc, interpolation='bilinear')
#生成词云图片
plt.axis("off")
# 关闭图像坐标系
plt.figure('singer')
#指定所绘图名称
plt.show()
#显示图片

准备好运行看看了吗,下面就是见证奇迹的时刻:

是不是一目了然?
Ta在网易云数据中最喜欢的歌手依次排序就是薛之谦、邓紫棋、Justin Bieber、ED Sheeran等~
字号从大到小可以说非常直观了。

结尾

到此为止整个实战项目全部完成,你已经掌握对任意网易云用户迅速了解其喜爱歌手的方法以及制作帅气的词云图。
接下去,无论想要爬取更多网易云上的信息也好,还是制作更加酷炫的词云图也罢,你需要不断的深入学习。但看到好的一面是,你能够以我这篇博文为基础拓展出去,兴趣会促使你自主学习更多的东西。
比如jieba模块,用来中文分词后制作词云,本篇没有到是因为中文都是歌手名字,不需要分词。如果你的文本是句子等,就会需要先用jieba模块,要去学习如何分词。
又比如wordcloud参数,你可以有更多设置选择:

max_font_size=50,
min_font_size=10,
#设置最大、最小字体
collocations=False,
#设置是否过滤重复关键字
stopwords=stopwords
#设置忽略显示的词,比如无意义的噪声词(因为、所以、这些、哪些、said、the等)

以及如果要保存你刚制作的词云图到指定路径:

wc.to_file(path.join(d,"wordcloud.jpg"))

等等、等等…
以上,这些一篇文章是远远说不完的,但是今天应该也讲了不少实用的干货~
最后,如果你还没动手写的话,别磨蹭了~
赶紧去制作一张Ta的词云图,分享给你的网易云好友来个惊喜吧!

题外话:
各位在写代码时喜欢听哪些音乐呢?
有好的音乐也请务必和我交流分享!
我主要就是电子纯音~

感谢您的耐心阅读,欢迎关注我共同讨论python和爬虫~学习编程这条路,我们一起走一段。

【Python实战】爬取网易云音乐用户听歌排行,来制作一张Ta最爱歌手的词云图相关推荐

  1. 爬取网易云音乐用户听歌排行,来制作一张Ta最爱歌手的词云图!

    平时写代码的时候,作为云村用户的一员,我当然也是最爱开着网易云音乐(以下简称网易云).大家都知道在网易云里你可以查看好友或是任意用户的听歌排行(假使Ta设置全部可见),但是如果想知道Ta喜欢哪些歌手, ...

  2. Python爬虫—爬取网易云音乐【热歌榜】歌曲的精彩评论(写入txt文本文件或者MySQL数据库)

      最近在学Python爬虫,看了Blibili爬取网易云音乐评论的视频,视频中是将一首歌的评论存入json文件,我在此代码的基础上扩展了三点:     1.爬取热歌榜200首歌曲的精彩评论:     ...

  3. python网易云_用python爬虫爬取网易云音乐

    标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...

  4. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  5. python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇

    image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了- 思 ...

  6. python爬虫----爬取网易云音乐

    使用python爬虫爬取网易云音乐 目录 使用python爬虫爬取网易云音乐 需要使用的模块 开始工作 运行结果 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页 ...

  7. python 批量爬取网易云音乐,java解密

    每天一点点,记录学习 python 批量爬取网易云音乐 网易云音乐,排行榜,右键,显示网页源代码,并不能找到任何一首歌的id,是因为java加密了 随便找一首id为1374061038的歌,在网页源代 ...

  8. 来跟我学爬虫,爬取网易云音乐的邓紫棋歌单MP3,注意:VIP歌曲不可以爬取

    @Author:Runsen 我又回来了写几个爬虫案例了,这次是写一个简单的爬虫,我来教你如何爬取网易云音乐的歌单MP3,正所谓下载一个mp3很麻烦,你们的女朋友想听歌,秀即使帮她爬取所有MP3,从此 ...

  9. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

最新文章

  1. PHP 截取字符串专题
  2. 20分钟教你搞懂Git!
  3. 从零开始学习hadoop之发行版选择
  4. python画二维数组散点图_Python散点图二维数组
  5. 基于OpencvTensorflow实现实时查找停车位置
  6. SmartQuery WebPart 2.0 发布。
  7. CG CTF WEB 单身一百年也没用
  8. CSS代码重构与优化之路(转)
  9. web安全day43:网络扫描和Nmap的使用
  10. python读取二进制文件_python中读写二进制文件
  11. 注册表如何管理右键菜单
  12. 阴阳师服务器维护2月20,《阴阳师》手游2月20日维护更新公告
  13. AI新技术:利用神经网络对图片进行超级压缩
  14. 大一计算机专业学生自我月小结,大学生学习过程月度总结
  15. JNI详解---从不懂到理解
  16. ICPC 沈阳M - United in Stormwind SOSDP+FWT+容斥
  17. 【模拟+线段树】 hdu4262 Juggler
  18. 小程序之统计网页访问人数
  19. 计算机技术与应用实例教程,多媒体技术与应用案例教程(ppt).ppt
  20. 汤晓丹的第四版计算机操作系统--第一章总结概述

热门文章

  1. 随机森林的特征 是放回抽样么_通过随机森林的例子解释特征重要性
  2. 分子动力学(三)-非键相互作用
  3. 二次报价谈判怎么谈_如何不破坏报价谈判
  4. 三星android怎么获取root,三星GT-i9128完美获取root权限教程最新版
  5. 自动驾驶全球布局(3)传统汽车厂商
  6. 复盘_9月—(第2周工作复盘)
  7. 如何使用Teamviewer软件,远程控制手机与电脑
  8. 斗破苍穹文字页游php_浅谈斗破影视化下的网络文学二次创作
  9. QQ汉字验证码原理(C#随机中文汉字验证码)
  10. YCSB测试levedb