欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-23 18:11:45
...

网易云歌单音频爬取

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

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

我们爬取的是网易云网页上的歌单里的音频,Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
如图,点击歌单出现的分类,我们随意选取其中一个歌单进行爬取,这里选取的链接是https://music.163.com/#/playlist?id=2829883282,但是我们也注意到这个链接中带有“#”字符,我们审查它的源代码,查看它的Network,刷新页面,点击带有id=2829883282的一段点击进入headers,我们可以发现它的真实地址
Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
它的真实地址是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中Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
将其加入到字典中伪装爬虫,然后还是一样的获取网页请求并打印:
Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
之后也是同样要从这些信息中提取我们需要的内容,查看Response的选项Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
其中在标签为<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)

如此我们就获取了歌单里的音频的所有外链:
Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
爬取音频
获取完歌单音频的所有链接地址后,我们就可以爬取下载相应的音频歌曲了。音频的获取开始我是在其他博客学的,用的是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("下载完成")

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

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就可以进行爬取下载。

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

相关标签: 爬虫