#知识复盘
要实现异步机制的爬虫,离不开协程!
一、协程的基本概念:
协程(单线程),英文叫coroutine,又称微线程、纤程,是一种运行在用户状态的轻量级线程。它拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存到其他地方,等切回来时,再恢复到先前保存的寄存器上下文和栈。因此,协程能保留上一次调用时的状态,所有局部状态的一个特定组合,每次过程重入,就相当于进入上一次调用的状态。
1. event_loop:事件循环,相当于一个无限循环,我们可以把一个函数注册到这个事件循环上,当满足发生条件的时候,就调用对应的处理方法。
2. coroutine:协程,指代协程对象类型,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用async关键字来定义一个方法,这个方法再调用时不会被立即执行,而是返回一个协程对象
3. task:任务,这是协程对象的进一步封装,包含协程的各个状态
4. future:代表将来执行或者没有执行的任务的结果,实际上和task没有本质区别
二、准备工作
安装asyncio和aiphttp,相关命令如下:
pip install asyncio
pip install aiphttp
三、简单运用asyncio和aiohttp
假如爬取一个网站,同时执行10个请求,每个请求6s,若是按照顺次执行的方式,则花费总时间:大约60s左右。若是按照异步爬取,则只需大约6的时间,具体代码如下:
# 协程爬取
import asyncio
import aiohttp
import time
start = time.time()
# aiohttp的client封装
async def get(url):
se