没事儿打开百度音乐,随便点点喜欢的音乐,音乐就会加到百度音乐盒的临时列表之中了,但是想将列表中的音乐下载到本地就要登录百度账号。
那能不能不登录就将列表中的音乐下载下来?
通过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)