import json
import time
import requests
import aiohttp
import asyncio
import aiofiles
async def aio_muisc(purl,failname):
url='https://dl.stream.qqmusic.qq.com/'+purl
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
async with aiofiles.open(failname,'wb') as file:
await file.write( await resp.content.read())
print(f'{failname}下载完毕')
async def download_music(name):
tasks = []
for i in range(1,11):
url=f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.top&searchid=56680992704294447&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p={str(i)}&n=10&w={name}&_=1632819737137&cv=4747474&ct=24&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&uin=1246021400&g_tk_new_20200303=1459076162&g_tk=1459076162&hostUin=0&loginUin=1246021400'
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36'}
resp=requests.get(url,headers=headers).text
#print(resp.text)
resp_json_dict=json.loads(resp)
#print(resp_json_dict)
music_list=resp_json_dict['data']['song']['list']
# print(music_list)
for item in music_list:
#print(item)
song_mid=item.get('mid') #歌曲mid
song_name=item.get('name') #歌的名字
singer_name=item.get('singer')[0].get('name') #歌手名字
#print(song_mid,song_name,singer_name)
url2='https://u.y.qq.com/cgi-bin/musicu.fcg'
params1 = {
'_': time.time() * 1000,
'sign': 'zzakgej75pk8w36d82032784bdb9204d99bf6351acb7d',
"data": '{"req":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"7469768631","songmid":["' + song_mid + '"],"songtype":[0],"uin":"1164153961","loginflag":1,"platform":"20"}}}'
}
response=requests.get(url2,params=params1,headers=headers)
dict=json.loads(response.text)
#print(dict)
#purl就是下载地址的一部分
purl=response.json()['req']['data']['midurlinfo'][0]['purl']
#print(purl)
if purl=='':
print('无法下载')
filename = 'qq音乐/' + song_name + '--' + singer_name + '.mp3'
task=asyncio.create_task(aio_muisc(purl,filename))
tasks.append(task)
await asyncio.wait(tasks)
if __name__ == '__main__':
asyncio.run(download_music(name=input('请输入你要查找的歌手')))
异步协程爬取qq音乐,搜索想要查询的歌手即可
于 2021-10-08 20:56:17 首次发布





