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

网易云歌单音频爬取

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

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

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

    一行,有我们需要的信息。这段标签里包括了歌单的每首歌的名字还有部分链接,说到这,我们也同样需要对每首歌的链接地址进行分析,其实每首歌都有对应的外链,我们通过外链来访问它对应的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爬取文件不能播放问题)_第6张图片
    爬取音频
    获取完歌单音频的所有链接地址后,我们就可以爬取下载相应的音频歌曲了。音频的获取开始我是在其他博客学的,用的是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爬取文件不能播放问题)_第7张图片
    点击之后就可以听歌了Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)_第8张图片
    但是这个方法并不是时时有效,我相信很多伙伴用这个方法的时候遇到过这个问题,Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)_第9张图片
    其中文件的大小也不是很大,其实很大的原因是因为网易云网站的防爬设置,所以我也用了一个方式,爬取的几率更大,我们进入歌曲的外链的网页,然后同样进入Network然后获取User-Agent,然后一样的伪装爬虫,
    Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)_第10张图片
    写下如下代码:

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

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

你可能感兴趣的:(爬虫)