没事儿打开百度音乐,随便点点喜欢的音乐,音乐就会加到百度音乐盒的临时列表之中了,但是想将列表中的音乐下载到本地就要登录百度账号。
那能不能不登录就将列表中的音乐下载下来?
通过fiddler抓包分析一下:

可以看到这条post,songlink,看名字莫非就是歌曲的链接。查看一下详细的响应内容:

将这里的showlink复制下来,粘贴到浏览器中,直接提示下载了,显然这就是歌曲的链接。
那就只要将json里的showlink提取出来,下载就ok了!
通过requests.post(url,data)发送请求,data可以在这条请求头部看到:

将它复制下来
songIds=568320992%2C591395845%2C242078437%2C567299854%2C554926752%2C593443305%2C577326683&hq=0&type=m4a%2Cmp3&rate=&pt=0&flag=-1&s2p=-1&prerate=-1&bwt=-1&dur=-1&bat=-1&bp=-1&pos=-1&auto=-1
这时会发现里面有一些奇怪的字符编码,这里涉及到url编码。
通过urllib.parse中unquote解码可以得到:
'songIds=568320992,591395845,242078437,567299854,554926752,593443305,577326683&hq=0&type=m4a,mp3&rate=&pt=0&flag=-1&s2p=-1&prerate=-1&bwt=-1&dur=-1&bat=-1&bp=-1&pos=-1&auto=-1'
完整代码如下:
import requests,json
from urllib import request
#爬取百度播放列表里的音乐
class mp3_downloader(object):
def __init__(self):
self.url = 'http://play.baidu.com/data/music/songlink'
self.payload = {'songIds':'568320992,591395845,242078437,567299854,554926752,593443305,577326683',
'hq':'0',
'type':'m4a,mp3',
'pt':'0',
'flag':'-1',
's2p':'-1',
'prerate':'-1',
'bwt':'-1',
'dur':'-1',
'bat':'-1',
'bp':'-1',
'pos':'-1',
'auto':'-1'}
def get_url(self):
r = requests.post(self.url,data=self.payload)
h = json.loads(r.text)
p = h['data']
#for each in p['songList']:
# print('音乐地址:' + each['songLink'])
return p['songList']
def download(self,url):
for each in url:
request.urlretrieve(each['songLink'],filename=each['songName']+'.mp3')
if __name__ == '__main__':
dp = mp3_downloader()
url = dp.get_url()
dp.download(url)