以下面这个歌单为例:下载赵雷的所有音乐。其实我们只需获取这个歌单中所有音乐的id。
我们查找一下歌曲的id信息:
这样就找到了歌曲的id信息:
接下来要做的就是用程序获取这些id:
1.请求本歌单的网址https://music.163.com/playlist?id=98332770(注意:要将#号去掉)
这里才是我们要请求的网址:
import requests
import time
from bs4 import BeautifulSoup
headers = {
'Host': 'music.163.com',
'Referer': 'https://music.163.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
url="https://music.163.com/playlist?id=98332770"
response = requests.get(url=url, headers=headers)
html=response.content.decode(encoding="utf-8")
#print(html)
soup = BeautifulSoup(html, 'lxml')
results = soup.find('ul',{'class':'f-hide'})
results=results.find_all('a')
print(results)
for music in results:
print(music.text, music['href'])
到这里,已经拿到了歌曲名及歌曲的id。
接下来是下载:
网易云歌曲一般会有一个外链,专门用于下载音乐音频的,以赵雷的歌曲《成都》为例,《成都》的外链URL是:http://music.163.com/song/media/outer/url?id=436514312.mp3,其中436514312这个数字是《成都》这首歌曲的ID。也就是说只要我们将歌曲的ID传入到外链URL中,就可以找到该歌曲的下载地址。
import requests
import time
from bs4 import BeautifulSoup
import urllib.request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0',
}
url="https://music.163.com/playlist?id=98332770"
response = requests.get(url=url, headers=headers)
html=response.content.decode(encoding="utf-8")
#print(html)
soup = BeautifulSoup(html, 'lxml')
results = soup.find('ul',{'class':'f-hide'})
results=results.find_all('a')
print(results)
for music in results:
#print(music.text, music['href'])
#下载歌曲
music_url="http://music.163.com/song/media/outer/url?id={}.mp3".format(music['href'].split("=")[1])
print(music_url)
urllib.request.urlretrieve(music_url,music.text+'.mp3')
运行结果:
改进版:直接输入歌单的URL即可!!
完整代码:
from tkinter import *
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
def download():
url = entry.get()
new_url = url.replace('/#', '')
header = {
'Host': 'music.163.com',
'Referer': 'https://music.163.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
}
res = requests.get(new_url, headers=header).text
r = BeautifulSoup(res, "html.parser")
music_dict = {}
result = r.find('ul', {'class', 'f-hide'}).find_all('a')
for music in result:
#print(music)
music_id = music.get('href').strip('/song?id=')
print(music_id)
music_name = music.text
music_dict[music_id] = music_name
for song_id in music_dict:
song_url = "http://music.163.com/song/media/outer/url?id=%s" % song_id
print(song_url)
path = r" %s.mp3" % music_dict[song_id]
# 添加数据
text.insert(END, "正在下载:%s" % music_dict[song_id])
text.see(END)
text.update()
urlretrieve(song_url, path)
root = Tk()
root.title("网易云音乐下载器")
root.geometry("550x400+550+230")
label = Label(root, text="歌单URL", font=('宋体', 15))
label.grid()
entry = Entry(root, font=('微软雅黑', 20))
entry.grid(row=0, column=1)
text = Listbox(root, font=("微软雅黑", 15), width=45, height=10)
text.grid(row=1, columnspan=2)
button = Button(root, text="开始下载", font=("微软雅黑", 15), command=download)
button.grid(row=2, column=0, sticky=W)
button1 = Button(root, text="退出", font=("微软雅黑", 15), command=root.quit)
button1.grid(row=2, column=1, sticky=E)
mainloop()