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 首次发布