异步协程爬取qq音乐,搜索想要查询的歌手即可

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&notice=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('请输入你要查找的歌手')))
### 如何使用协程实现高效的视频爬虫 为了构建一个高效的视频爬虫,可以充分利用 Python异步协程功能。Python 中的 `asyncio` 和第三方库如 `aiohttp` 提供了强大的支持来处理高并发的任务[^3]。 以下是具体的方法: #### 1. 使用 `asyncio` 和 `aiohttp` `asyncio` 是 Python 自带的一个用于编写异步应用程序的模块,它允许程序在等待 I/O 操作时切换到其他任务上工作。而 `aiohttp` 则是一个基于 `asyncio` 的 HTTP 客户端/服务器框架,非常适合用来抓取网页或下载文件。 以下是一个简单的例子展示如何用协程实现视频爬取: ```python import asyncio import aiohttp async def fetch_video(session, url): try: async with session.get(url) as response: if response.status == 200: content = await response.read() save_video(content) print(f"Video downloaded from {url}") else: print(f"Failed to download video from {url}, status code: {response.status}") except Exception as e: print(f"Error downloading video from {url}: {e}") def save_video(data): # 假设这里保存视频逻辑已经定义好 pass async def main(video_urls): async with aiohttp.ClientSession() as session: tasks = [] for url in video_urls: task = asyncio.create_task(fetch_video(session, url)) tasks.append(task) await asyncio.gather(*tasks) if __name__ == "__main__": urls = [ "https://example.com/video1.mp4", "https://example.com/video2.mp4", "https://example.com/video3.mp4" ] asyncio.run(main(urls)) ``` 这段代码展示了如何创建多个异步任务并行地从不同的 URL 下载视频文件[^4]。 #### 2. 处理大量请求时需要注意的地方 当面对大量的视频链接时,可能需要考虑以下几个方面: - **连接数限制**:过多的同时打开的 TCP 连接可能会导致目标网站拒绝服务或者触发反爬机制。可以通过设置 `TCPConnector(limit=...)` 来控制最大同时连接数量。 - **错误重试机制**:网络不稳定可能导致某些请求失败,因此应该加入适当的重试策略。 - **速率限制**:为了避免被封禁 IP 地址,合理调整请求频率是非常重要的。 这些都可以通过扩展上述基础代码进一步优化性能和稳定性[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值