asyncio库和aiohttp库的学习

本文详细介绍了如何在Python中结合asyncio和aiohttp库进行爬虫开发。首先,由于requests库与asyncio不兼容,因此需要使用aiohttp。接着,文章展示了基本的步骤,包括导入库、建立任务、创建协程、封装任务和事件循环。通过创建事件循环并使用`asyncio.run()`执行任务,实现了高效的爬虫协程。协程接收外部传入的URL,并利用aiohttp进行异步请求。实践表明,这种方式能显著提高爬取速度。
摘要由CSDN通过智能技术生成

前面博客讲的太泛了,对于我搞爬虫就细化学习理解一波,基于这篇博客的学习
由于requests库和asyncio库是不能一起使用的,所以我们要安装一点小插件pip install aiohttp
先上代码

import asyncio
import aiohttp
async def func(url):
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    print('开始下载',url)
    async with aiohttp.ClientSession() as session:
        async with await session.get(url=url,headers=headers) as response:
            data = await response.read()
            name = url.split('/')[-1]
            with open(name,'wb') as fp:
                fp.write(data)
    print('下载完成',url)
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
        'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
        'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
        ]
tasks=[]
for url in urls:
    a = func(url)
    task = asyncio.ensure_future(a)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

基本步骤:

  • 导入库

这里注意不使用requests了,直接使用aiohttp

import asyncio
import aiohttp
  • 建立任务单
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
        'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
        'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
        ]
  • 用循环对每一条任务进行操作
for url in urls:
  • 创建协程对象
a = func(url)
  • 将任务封装

使用asyncio.ensure_future()来封装
ensure_future 其实是用来创建任务的

tasks = [] # 这个写在循环外面
task = asyncio.ensure_future(a)
tasks.append(task)
  • 建立事件循环

利用asyncio.get_event_loop()创建事件循环

loop = asyncio.get_event_loop()
  • 把任务列表放到事件循环里面运行

运用这个函数执行运行任务单.run_until_complete()
这个函数的参数是future或者协程
这个函数asyncio.wait()叫简单等待
如果参数可以是一个任务单列表,如果里面有协程(或者其他的可等待对象)它将自动作为任务加入日程。

loop.run_until_complete(asyncio.wait(tasks))
  • 定义一个爬虫协程

这个爬虫的特点是url要从外面导入
注意的是aiohttp的使用
格式比较固定,套着用就是了

async def func(url):
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    print('开始下载',url)
    # 类似于上下文管理器,就是with open,with前面一定要加async,固定写法
    # as session是类似起名字一样
    async with aiohttp.ClientSession() as session:
        # async with跟上面同理,await是手动挂起,因为向图片发起请求是IO操作
        async with await session.get(url=url,headers=headers) as response:
            # 同样的,对返回的数据进行解析也是IO操作
            # 不同于requests模块,read()指的是解析二进制数据
            # text() 就是我们平时用的text
            # 而json对象则要用json()
            data = await response.read()
            name = url.split('/')[-1]
            with open(name,'wb') as fp:
                fp.write(data)
    print('下载完成',url)
  • 运行一波
    在这里插入图片描述
    啪的一下很快啊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huamanggg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值