周末,打开手机听听音乐放松下,发现手机里的音乐好久没换了,想听点其他歌却不知道换什么歌,你们有没有遇到这样的听歌慌,今天就用 python 爬虫来爬取网易云音乐里不同类型歌手的 top 50 热门歌曲。

项目环境

语言环境:python 3.6

编辑工具:PyCharm

模块导入:BeautifulSoup、re、selenium、csv

爬取结果

爬取的数据只用了两列,第一列显示歌手姓名,第二列显示该歌手在网易云音乐里的 top 50 热门歌曲。

程序结构

程序主要是由 6 个函数组成:

get_singer():提取源码中歌手的名字。

song_url():拼接各个歌手的 top 50 歌曲的url。

song_name():根据上面函数提供的歌曲 url 提取 50 首热门歌曲的歌名。

get_data():处理需要保存的数据。

download2csv:将歌曲保存为 csv 文件。

源码提取

分析源码发现需要提取的歌手信息只在 Elements 里面出现,源代码中找不到这些信息,说明这些信息没有放在源代码中,对于这种情况,我们就不能用之前的 requests 方法来提取源码信息了,我们这次用 selenium 自动化测试库来模拟人工打开页面,这种方法提取的就是 Elements 出现的信息,也就是我们需要的信息。关于这两种方法的区别,下篇文章会详细分析。

Python

browser = webdriver.Chrome()

wait = WebDriverWait(browser,5) #设置等待时间

1

2

browser=webdriver.Chrome()

wait=WebDriverWait(browser,5)#设置等待时间

我用的是 chrome 浏览器,此处需要把 chromedriver 驱动下载好放在 python 3 的安装目录下方可操作浏览器。

Python

browser.get(url)

browser.switch_to.frame('g_iframe')

html = browser.page_source

soup=BeautifulSoup(html,'lxml')

1

2

3

4

browser.get(url)

browser.switch_to.frame('g_iframe')

html=browser.page_source

soup=BeautifulSoup(html,'lxml')

用 selenium 操作浏览器需要注意切换框架,因为有可能我们需要的元素的不在主框架里,需要用 switch_to.frame 方法切换到包含元素的子框架。

Python

info=soup.select('.nm.nm-icn.f-thide.s-fc0')

sname=[]

songids=[]

for snames in info:

name=snames.get_text()

songid=str(re.findall('href="(.*?)"',str(snames))).split('=')[1].split('\'')[0]

sname.append(name)

songids.append(songid)

return sname,songids

1

2

3

4

5

6

7

8

9

info=soup.select('.nm.nm-icn.f-thide.s-fc0')

sname=[]

songids=[]

forsnamesininfo:

name=snames.get_text()

songid=str(re.findall('href="(.*?)"',str(snames))).split('=')[1].split('\'')[0]

sname.append(name)

songids.append(songid)

returnsname,songids

用 BeautifulSoup 和 re 库从源码中提取出歌手名字和 top 50 歌曲的链接 id。

获取 top 50 歌曲名

先通过上面 get_singer() 函数返回的 songids 来拼接 top 50 歌曲 url,每个歌手对应的 top 50 歌曲 是唯一的。

Python

def song_url():

sname, songids = get_singer(url)

top50urls=[]

for id in songids:

top50url = 'http://music.163.com/#/artist?id={}'.format(id)

top50urls.append(top50url)

return top50urls

1

2

3

4

5

6

7

defsong_url():

sname,songids=get_singer(url)

top50urls=[]

foridinsongids:

top50url='http://music.163.com/#/artist?id={}'.format(id)

top50urls.append(top50url)

returntop50urls

1

歌曲 url 有了,我们就可以用 selenium 库方法提取歌曲名字。

Python

def song_name():

songnames=[]

for top50url in song_url():

browser.get(top50url)

browser.switch_to.frame('g_iframe')

html = browser.page_source

soup = BeautifulSoup(html, 'lxml')

songinfo = soup.select('div div div span a b')

songname=re.findall('title="(.*?)"',str(songinfo))

songnames.append(songname)

return songnames

1

2

3

4

5

6

7

8

9

10

11

defsong_name():

songnames=[]

fortop50urlinsong_url():

browser.get(top50url)

browser.switch_to.frame('g_iframe')

html=browser.page_source

soup=BeautifulSoup(html,'lxml')

songinfo=soup.select('div div div span a b')

songname=re.findall('title="(.*?)"',str(songinfo))

songnames.append(songname)

returnsongnames

提取了歌曲名信息后,我们再把信息整合下。

Python

def get_data():

sname, songids=get_singer(url)

songnames=song_name()

data=[]

for snames,songs in zip(sname,songnames):

info = {}

info['歌手名字']=snames

info['top50歌曲'] =songs

for i in info:

for j in info[i]:

info2={i:j}

data.append(info2)

return data

1

2

3

4

5

6

7

8

9

10

11

12

13

defget_data():

sname,songids=get_singer(url)

songnames=song_name()

data=[]

forsnames,songsinzip(sname,songnames):

info={}

info['歌手名字']=snames

info['top50歌曲']=songs

foriininfo:

forjininfo[i]:

info2={i:j}

data.append(info2)

returndata

再把信息保存为 csv 文件。

Python

def download2csv():

print('保存歌手信息中...请稍后查看')

with open('E:\\歌手top50.csv','w',newline='',encoding='utf-8') as f:

fieldnames = ['歌手名字', 'top50歌曲']

writer=csv.DictWriter(f,fieldnames=fieldnames)

writer.writeheader()

data=get_data()

writer.writerows(data)

print('保存成功')

1

2

3

4

5

6

7

8

9

defdownload2csv():

print('保存歌手信息中...请稍后查看')

withopen('E:\\歌手top50.csv','w',newline='',encoding='utf-8')asf:

fieldnames=['歌手名字','top50歌曲']

writer=csv.DictWriter(f,fieldnames=fieldnames)

writer.writeheader()

data=get_data()

writer.writerows(data)

print('保存成功')

最后,调用函数就可以去保存想听的类型歌手的信息了。

Python

idlist=[1001,1002,1003,2001,2002,2003,4001,4002,4003,6001,6002,6003,7001,7002,7003]

#1开头:华语;2开头:欧美,4:其他;6:日本;7:韩国

id=1001

url='http://music.163.com/#/discover/artist/cat?id={}&initial=-1'.format(str(id))

download2csv()

1

2

3

4

5

idlist=[1001,1002,1003,2001,2002,2003,4001,4002,4003,6001,6002,6003,7001,7002,7003]

#1开头:华语;2开头:欧美,4:其他;6:日本;7:韩国

id=1001

url='http://music.163.com/#/discover/artist/cat?id={}&initial=-1'.format(str(id))

download2csv()

id 表示歌手的类型,1001 1002 1003 分别表示华语男歌手、女歌手、组合/乐队,2001 2002 2003 分别表示欧美男歌手、女歌手、组合/乐队,6001 6002 6003 分别表示日本男歌手、女歌手、组合/乐队,7001 7002 7003 分别表示韩国男歌手、女歌手、组合/乐队,4001 4002 4003 分别表示其他男歌手、女歌手、组合/乐队。需要保存哪种类型歌手的信息,修改 id 的值即可。

保存后就可以用 Excel 文件形式打开保存的 csv 歌曲信息了,看看自己哪些歌没听过,听听你那些年错过的好歌,解决掉你的听歌慌。

完整代码可以在我公众号后台回复「网易云音乐」获取。

python爬虫网易云_Python爬虫网易云音乐Top50热门歌单相关推荐

  1. Python Scrapy 多线程爬取网易云音乐热门歌单信息(手把手教学)

    下面我将向大家介绍使用 Scrapy 爬虫获取 网易云音乐 的热门歌单信息. 这里是网易云音乐的歌单页面,可以看到歌单信息非常得结构化,是非常适合爬虫来爬取的. URL:全部歌单 - 歌单 - 网易云 ...

  2. python要学什么英文歌_Python分析网易云音乐近5年热门歌单

    由于同一歌单可能会有不同的分类,所以按这72种分类抓取的数据会有重复数据,剔重之后6.6万个热门歌单. 我按不同分类下歌单的相似度做了排行榜如下(红色部分表示相似度): 从相似度排行榜中看出流行音乐. ...

  3. 零基础如何用 15 行 Python 代码搞定网易云热门歌单?

    健身.吃饭.敲代码:等车.撸猫.下午茶--若能佐以合适的音乐当"配餐",总是惬意非常.本文就将带你爬一爬网易云的那些热门歌单! 作者 | 上海小胖 责编 | 仲培艺 心情好或心情坏 ...

  4. 网易教程python_15行Python代码实现网易云热门歌单实例教程

    0. 引言 马上314情人节就要来了,是否需要一首歌来抚慰你,受伤或躁动的心灵.来吧,今天教你用15行代码搞定热门歌单.学起来并听起来吧. 本文使用的是Selenium模块,它是一个自动化测试工具,利 ...

  5. python核心编程:大神如何用15行Python代码实现网易云热门歌单实例教程

    这篇文章主要给大家介绍了关于利用15行Python代码实现网易云热门歌单的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学 ...

  6. Python分析网易云音乐近5年热门歌单

    專 欄 ❈作者:瑶妹妹先生,知乎专栏:折数,关于网络编程.数据挖掘,数据可视化,摄影后期等. ❈ 网易云音乐几乎是我唯一的听歌消遣的平台了,平时剪辑寻找BGM时也上云村.它的特点就是体验.视角效果都很 ...

  7. 使用Puppeteer轻松爬取网易云音乐、QQ音乐的精品歌单

    背景 最近在学习Puppeteer进行自动化操作,另一方面为了防止上班时间被打扰,是时候爬点歌单在上班的时候,用来抵抗外界的干扰了. 地址 项目完整代码地址:github.com/BingKui/We ...

  8. 爬取下载网易云热门歌单的音乐

    这个小程序最难的有2部分. 第一部分,爬取网易云网页源码. 在第一次通过requests请求https://music.163.com/ 发现返回的 源码和网页的源码完全不相同,然后通过查找资料,了解 ...

  9. python基础教程网易云_Python爬虫教程:网易云音乐歌词

    开发工具 **Python版本:**3.5.4 相关模块: requests模块: bs4模块: win_unicode_console模块: jieba模块: matplotlib模块: xlwt模 ...

最新文章

  1. 树莓派开发3-wiring库控制继电器和继电器组
  2. linux 文件 目录 默认权限
  3. keepalived-1.2.2 编译出错问题解决
  4. c# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
  5. GraphQL 入门第一篇
  6. 【thymeleaf】模板中定义变量
  7. C++中各种智能指针的实现及弊端(五)
  8. python学习笔记(七)函数
  9. C#常用正则表达式收藏
  10. qq降龙电脑版_分享 | 如何利用QQ群上课 简单操作步骤
  11. vue项目首屏加载过久处理笔记
  12. 谷歌开源Allstar 项目,保护GitHub 仓库安全
  13. 用卷积神经网络识别实际田间条件下茶叶病虫害(自然环境下拍摄的数据集不用太多预处理)
  14. spark性能调优05-troubleshooting处理
  15. 洛谷OJ P1802 5倍经验日 动态规划
  16. 网站生成EXE文件运行——PHP网站打包工具PHPWAMP
  17. 遥感原理与应用_综述:遥感技术在病虫害防治中的应用
  18. IP地址规划设计技术
  19. 你以为链家只是一个中介,但其实……
  20. linux权限管理的设计,Linux权限管理漫谈之用户切换

热门文章

  1. RabbitMQ-集群
  2. 一、elastic-job、elastic-job-lite-console使用案例
  3. time(),ctime()和mktime()函数使用
  4. C语言实现两个整数相除的四舍五入和进一法
  5. linux内核去掉pty,Linux tty pty pts观念区别
  6. 计算机科学与应用专业介绍,专业介绍 | 计算机科学与技术
  7. 牛客wannaflay挑战赛22 签到题 计数器 Wolf and Rabbit HDU 1222
  8. J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)
  9. oxygen 生成java对象_Eclipse 4.7 Oxygen 正式发布!带来大量更新
  10. 前端开发常见笔试题(附答案)