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

您所在的位置:网站首页 爬取网易云音乐 Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)

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

2023-10-25 00:58| 来源: 网络整理| 查看: 265

网易云歌单音频爬取

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

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

我们爬取的是网易云网页上的歌单里的音频,在这里插入图片描述 如图,点击歌单出现的分类,我们随意选取其中一个歌单进行爬取,这里选取的链接是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的选项在这里插入图片描述 其中在标签为一行,有我们需要的信息。这段标签里包括了歌单的每首歌的名字还有部分链接,说到这,我们也同样需要对每首歌的链接地址进行分析,其实每首歌都有对应的外链,我们通过外链来访问它对应的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就可以进行爬取下载。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3