分析方法有道云笔记:
http://note.youdao.com/noteshare?id=e9d8f4e67a615a653c22df20c2187cc0
代码 :
from multiprocessing import Pool
import requests
class Qq:
def __init__(self):
self.base_url = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?'
self.header = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'https://y.qq.com',
'Referer': 'https://y.qq.com/n/yqq/playsquare/7256830841.html',
'Sec-Fetch-Mode': 'cors',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
}
self.param = {
'type': '1',
'json': '1',
'utf8': '1',
'onlysong': '0',
'new_format': '1',
'disstid': '7256830841',
'g_tk': '680346545',
'loginUin': '',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0',
}
self.parse_mid()
def parse_mid(self):
response = requests.get(self.base_url, params=self.param, headers=self.header)
#返回的是json格式的字符串
str_json = response.json()
mid_list = []
for mids in str_json['cdlist'][0]['songlist']:
mid = mids['mid']
name = mids['name']
mid_list.append((mid,name))
# print(mid_list)
p = Pool(4)
#map函数自带打散功能,就相当于帮我们遍历了这里mid_list是元组列表过去下一个函数就只是个元组
p.map(self.parse_purl,mid_list)
def parse_purl(self,mid_info):
mid = mid_info[0]
name = mid_info[1]
url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?'
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'https://y.qq.com',
'Referer': 'https://y.qq.com/portal/player.html',
'Sec-Fetch-Mode': 'cors',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
}
param = {
'g_tk': '680346545',
'loginUin': '1154344105',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0',
'data': '{"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"742841678","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"742841678","songmid":["'+ mid +'"],"songtype":[0],"uin":"1154344105","loginflag":1,"platform":"20"}},"comm":{"uin":1154344105,"format":"json","ct":24,"cv":0}}',
}
response = requests.get(url,params=param,headers=headers)
# print(response.text)
str_json = response.json()
# print(str_json)
purl = str_json['req_0']['data']['midurlinfo'][0]['purl']
print(name,purl)
self.load(purl,name)
def load(self,purl,name):
url = 'http://isure.stream.qqmusic.qq.com/' + purl
if purl:
print(name,url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}
response = requests.get(url,headers=headers)
#文件存储路径和名字
filename = 'D:\\qq_music2\\{}.{}'.format(name,'m4a')
try:
#读取音频需要二进制
with open(filename,'wb') as k:
#获取返回的内容
k.write(response.content)
print('下载成功')
except:
print('下载失败')
if __name__ == '__main__':
q = Qq()