在不使用爬虫框架的前提下,如何高效爬取500w条数据

使用线程池实现多任务+多任务异步协程 来实现高效爬取. 下面 以爬取音频数据做示范

高效爬取大量音频数据

主要思路:
<==以下的变量名跟代码中不一样,只是方便表述所示==>
1. 首先 获取所有音频url地址,放进两个url_list中,用来模拟多个任务 <比如有500W个任务,就将他们分成两个任务列表去分别执行>
2. 创建协程函数:主要实现 获取音频数据,返回个字典 <音频名,音频bytes>
3. 创建回调函数_1:主要实现 音频数据持久化存储
4. 协程_obj_list 存放 实例化协程对象
5. task_list 中存放 封装好的 协程任务,并在此阶段绑定 回调函数_1
6.实例化 事件循环对象
7. func_args_list 中存放字典,字典内容为:事件循环对象,协程任务对象
8. 创建pool_func :主要实现 多任务异步协程 执行爬取任务
9.实例化线程池,开启线程池,将事件循环对象和协程任务对象交给pool_func函数,正式开始执行爬取任务

import aiohttp
import requests
import asyncio
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
}
url = 'https://www.ximalaya.com/revision/play/album?albumId=20337620&pageNum=1&sort=1&pageSize=30'
json_data = requests.get(url=url,headers=headers).json()

urls = [] #30个音频的url和name
for dic in json_data['data']['tracksAudioPlay']:
    audio_url = dic['src']
    audio_name = dic['trackName']
    urls.append({'name':audio_name,'url':audio_url})

async def request(dic):
    async with aiohttp.ClientSession() as s:
        #proxy='http://ip:port' 代理操作
        async with await s.get(dic.get('url'),headers=headers) as response:
            audio_data = await response.read()
            name = dic.get('name')
            return {'data':audio_data,'name':name}

def saveData(task):
    dic = task.result()  #音频的数据和名字
    fileName = dic.get('name')+'.m4a'
    data = dic.get('data')
    with open(fileName,'wb') as fp:
        fp.write(data)
    print(fileName,'下载完成!')

tasks = []
for dic in urls:
    c = request(dic)
    task = asyncio.ensure_future(c)
    task.add_done_callback(saveData)
    tasks.append(task)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

转载于:https://www.cnblogs.com/lgw1171435560/p/11106151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值