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
(当然还有其他的, 比如 head
, delete
). 刚接触网页构架的朋友可能又会觉得有点懵逼了. 这些请求的方式到底有什么不同? 他们又有什么作用?
我们就来说两个重要的, get
, post
, 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限制的,音质暂时还不清楚,不过估计是普通音质的文件。祝你玩得开心!