Python制作爬虫绕过版权限制批量下载网易云音乐歌单歌曲


关键字:python爬虫 绕过网易云音乐版权限制 python批量下载

不多说直接上代码:

#导入库
import requests
from bs4 import BeautifulSoup
import urllib.request

#伪造浏览器头部
headers = {
	'Referer':'http://music.163.com/',
	'Host':'music.163.com',
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
	'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
	}
	
# 歌单的url地址
# 演示歌单地址:http://music.163.com/playlist?id=2182968685
playlist_url = input('输入歌单链接: ')
play_url = str(playlist_url)

# 获取页面内容
s = requests.session()
response=s.get(play_url,headers = headers).content

#使用bs4匹配出对应的歌曲名称和地址
s = BeautifulSoup(response,'lxml')
main = s.find('ul',{'class':'f-hide'})

#创建一个空列表用来音乐名称以及地址
lists=[]

#遍历找到的所有链接
for music in main.find_all('a'):
	list=[]
    musicUrl='http://music.163.com/song/media/outer/url'+music['href'][5:]+'.mp3'
	musicName=music.text
	# 单首歌曲的名字和地址放在list列表中
	list.append(musicName)
	list.append(musicUrl)
	# 全部歌曲信息放在lists列表中
	lists.append(list)	
print(lists)

# 下载列表中的全部歌曲,并以歌曲名命名下载后的文件,文件位置为当前文件夹
for i in lists:
	url=i[1]
	name=i[0]
	try:
		print('正在下载',name)
		urllib.request.urlretrieve(url,'./%s.mp3'% name)
		print('下载成功')
	except:
		print('下载失败')

如果你看懂了上面的代码,那下面的思路分析就可以不用看了,主要是讲一下思路给不会的小伙伴。

1、首先我们安装一下需要用到的库(不知道库用来干嘛的自行谷歌百度 啧啧啧)

#安装bs4: $ pip install bs4
#安装requests: $ pip install requests

2、其次我们导入刚刚下载的库

import requests
from bs4 import BeautifulSoup
import urllib.request

3、接着我们伪造一个浏览器的请求头部(头部内容可以自己定义你想要的浏览器)

headers = {
	'Referer':'http://music.163.com/',
	'Host':'music.163.com',
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
	'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
	}

4、要求用户输入歌单地址

playlist_url = input('输入歌单链接: ')
play_url = str(playlist_url)

5、接着我们用requests来获取网页的内容

注:这里简单说一下requests的使用。其实在加载网页的时候, 有几种类型, 而这几种类型就是你打开网页的关键. 最重要的类型 (method) 就是 get 和 post (当然还有其他的, 比如 headdelete). 刚接触网页构架的朋友可能又会觉得有点懵逼了. 这些请求的方式到底有什么不同? 他们又有什么作用?

我们就来说两个重要的, getpost, 95% 的时间, 你都是在使用这两个来请求一个网页。

下面简单介绍一下两种请求方式的具体表现:

  • post
    • 账号登录
    • 搜索内容
    • 上传图片
    • 上传文件
    • 往服务器传数据 等
  • get
    • 正常打开网页
    • 往服务器传数据

这里我们用get的方法来,因为我们并不是向服务器发送数据,而是提取服务器发送给我们的数据。

s = requests.session()
response=s.get(play_url,headers = headers).content

6、拿到内容后开始用bs4提取我们需要用到的内容

注:网易云音乐的歌曲地址存在ul(unordered list)内

s = BeautifulSoup(response,'lxml')
main = s.find('ul',{'class':'f-hide'})

7、遍历main中所有存在的超链接并存储到music变量中。

for music in main.find_all('a'):
#创建一个空列表
	list=[]

8、因为网易云音乐的文件会固定存在与http://music.163.com/song/media/outer/url这个目录内,所以我们在前面直接加上这个路径,然后帮这些音乐文件加上文件后缀名(.mp3)并储存在musicUrl这个变量中。

    musicUrl='http://music.163.com/song/media/outer/url'+music['href'][5:]+'.mp3'
	musicName=music.text
	# 单首歌曲的名字和地址放在list列表中
	list.append(musicName)
	list.append(musicUrl)
	# 全部歌曲信息放在lists列表中
	lists.append(list)	
print(lists)

9、用for循环分离lists列表中的url和文件名。

for i in lists:
	url=i[1]
	name=i[0]

10、开始尝试下载文件,下载位置默认为运行文件夹。

注:这里要用到 urllib.request.urlretrieve,请看以下描述或自行百度。

#文档:https://docs.python.org/3/library/urllib.request.html
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
		try:
		print('正在下载',name)
		urllib.request.urlretrieve(url,'./%s.mp3'% name)
		print('下载成功')
	except:
		print('下载失败')

END:到这里就大功告成了,当然你也可以再加上timeout,当等待时间过长自动跳过或放弃,这里只是简单讲一下思路,你可以自由发挥。

放一张效果图:

效果图

小结:试了一下,因为我们是通过直接访问文件来下载音乐的,所以这样是可以绕过版权和IP限制的,音质暂时还不清楚,不过估计是普通音质的文件。祝你玩得开心!

  • 分享:
评论
还没有评论
    发表评论 说点什么