无论是在QQ音乐还是酷狗音乐上,我们都可以找到一些喜欢的音乐,但是有时候想要下载的时候却要付费,为了方便爬虫下载音乐,我们可以用Python实现下载QQ付费音乐这一个功能。
一、获取音乐的URL
首先,我们需要找到需要下载的音乐的URL。找到音乐URL之后,我们就可以使用Python来实现下载。可以使用开发者工具查看请求过程中发生的信息,如以下请求:
http://y.qq.com/n/yqq/song/002J9Gyl1vZHp2.html
该请求返回了音乐的基本信息,包括音乐的名称,歌手,专辑等信息。
二、获取音乐下载地址
获取音乐下载地址的方式十分简单。根据音乐的URL,我们可以进行如下请求,即可获取到音乐的下载地址:
http://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"6151940654","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"6151940654","songmid":["003w26Hk1OpGMN"],"songtype":[0],"uin":"25106012","loginflag":1,"platform":"20"}},"comm":{"uin":25106012,"format":"json","ct":24,"cv":0}}
在请求中,参数guid是一个随机的16位整数,songmid表示音乐的MID值。完成请求之后,我们便可以得到音乐的下载地址。
三、下载音乐
下载音乐的方式有很多,但是最简单的方法是使用Python的urllib库进行下载。可以使用如下程序代码来下载音乐:
import urllib.request
url = 'http://dl.stream.qqmusic.qq.com/M800003w26Hk1OpGMN.mp3?vkey=B03500B0BCF186E93C9D5D0A5A8ABE7E5D84F46105C9DE38F1AD855C93DA5D9D2AED57804D7F2E271A10A3BDB5A6F72E4D1D9A6EB94C11D&guid=6151940654&fromtag=8'
urllib.request.urlretrieve(url, 'song.mp3')
该程序会从获取的音乐下载地址中下载音乐,然后保存为song.mp3
四、完整示例代码
下面是完整的Python代码,可以直接使用:
import requests
import json
import urllib.request
headers = {
'referer': 'http://y.qq.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
}
songmid = '003w26Hk1OpGMN'
url = 'http://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"6151940654","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"6151940654","songmid":["'+ songmid +'"],"songtype":[0],"uin":"25106012","loginflag":1,"platform":"20"}},"comm":{"uin":25106012,"format":"json","ct":24,"cv":0}}'
response = requests.get(url, headers=headers)
jsonMusic = json.loads(response.text)
purl = jsonMusic['req_0']['data']['midurlinfo'][0]['purl']
url = 'http://dl.stream.qqmusic.qq.com/'+ purl
print('正在下载')
urllib.request.urlretrieve(url, 'song.mp3')
print('下载完成')