Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)

网易云歌单音频爬取

写在前面:最近学习爬虫,对小说和图片都进行过简单爬取,所以打算爬取音频,但是其中遇到点问题也解决了,写下博客记录并希望对大家也有帮助。

爬取对象:对于目前主流的几个音频播放网站,我选取的是网易云(个人对其“情有独钟”),可以在浏览器上直接搜索网易云音乐的网页即可。

我们爬取的是网易云网页上的歌单里的音频,在这里插入图片描述
如图,点击歌单出现的分类,我们随意选取其中一个歌单进行爬取,这里选取的链接是https://music.163.com/#/playlist?id=2829883282,但是我们也注意到这个链接中带有“#”字符,我们审查它的源代码,查看它的Network,刷新页面,点击带有id=2829883282的一段点击进入headers,我们可以发现它的真实地址
在这里插入图片描述
它的真实地址是https://music.163.com/playlist?id=2829883282,前者我们可以认为是个“假地址”,目的也是反爬。

获取响应
正如之前博客提到的,既然是爬虫,就要获取网页的响应,所以我们可以编写代码:

import requests
if __name__=='__main__':
	header = {
    
    
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
}#伪装爬虫
	response = requests.get("https://music.163.com/playlist?id=2829883282",headers = header)
	response.encoding = 'utf-8'
	html = response.text
	print(html)

这里与之前的不同,设置了一个header,因为网易云有防爬(虽然目前还是可以不用),还是在之前的Network的headers中在这里插入图片描述
将其加入到字典中伪装爬虫,然后还是一样的获取网页请求并打印:
在这里插入图片描述
之后也是同样要从这些信息中提取我们需要的内容,查看Response的选项在这里插入图片描述
其中在标签为<ul class="f-hide">一行,有我们需要的信息。这段标签里包括了歌单的每首歌的名字还有部分链接,说到这,我们也同样需要对每首歌的链接地址进行分析,其实每首歌都有对应的外链,我们通过外链来访问它对应的ID,我们点开一首歌,都会有一个生成外链播放器,目前似乎用不了,说是有版权要求,这里提供一个很有用的小工具:外链提取。或者可以记住这个前缀:http://music.163.com/song/media/outer/url,后面就可以添加标签里的部分链接就可以获取其外链。

所以我们可以编写代码:

import requests
from bs4 import BeautifulSoup
if __name__=='__main__':
	header = {
    
    
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
}
	response = requests.get("https://music.163.com/playlist?id=2829883282",headers = header)
	response.encoding = 'utf-8'
	html = response.text
	bf = BeautifulSoup(html,"lxml")
	texts = bf.find('ul', class_="f-hide")
	texts = texts.find_all('a')
	music_name = []
	music_url = []
	server = "http://music.163.com/song/media/outer/url"
	for i in texts:
    	music_name.append(i.string)
    	url = str(server) + i.get("href")[5:] + ".mp3"
   	 	music_url.append(url)
    	print(url)

如此我们就获取了歌单里的音频的所有外链:
在这里插入图片描述
爬取音频
获取完歌单音频的所有链接地址后,我们就可以爬取下载相应的音频歌曲了。音频的获取开始我是在其他博客学的,用的是urllib库中的urlretrieve方法,它可以直接将远程数据下载到本地,我们便可以在上述代码的前提下编写:

import urllib.request
num = len(music_name)
for i in range(num):
    urllib.request.urlretrieve(music_url[i],"%s.mp3"%music_name[i])
    #url和保存路径
print("下载完成")

运行之后我们在目录下可以看到音频在这里插入图片描述
点击之后就可以听歌了在这里插入图片描述
但是这个方法并不是时时有效,我相信很多伙伴用这个方法的时候遇到过这个问题,在这里插入图片描述
其中文件的大小也不是很大,其实很大的原因是因为网易云网站的防爬设置,所以我也用了一个方式,爬取的几率更大,我们进入歌曲的外链的网页,然后同样进入Network然后获取User-Agent,然后一样的伪装爬虫,
在这里插入图片描述
写下如下代码:

num = len(music_name)
header1 = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
}
for i in range(num):
    res = requests.get(music_url[i],headers = header1)
    with open(str(music_name[i]) + '.mp3',"ab")as f:
        f.write(res.content)
print("下载完成")

运行后结果是相同的,可以选取自己需要的方法。
当然网易云中的会员曲目这里是爬取不了的(我们还是尊重会员权益),但是你如果有自己想听的歌曲,一样记住前缀,得到它的ID就可以进行爬取下载。

希望这篇博客对大家有帮助!

猜你喜欢

转载自blog.csdn.net/gwk1234567/article/details/108196607