更高效的异步爬虫
import asyncio import aiohttp import time #回调函数:解析响应的数据 def callback(task): print("这是解析的回调") #获取到响应数据 page_text = task.result() # print("进行解析",page_text) return "hhahah" #定义一个特殊的函数,协程 async def get_page(url): #用aiohttp 发送请求 aiohttp支持异步 async with aiohttp.ClientSession() as request: async with request.get(url=url) as response: page_text = await response.text() # read() json() return page_text s = time.time() tasks = [] urls = ['https://www.baidu.com', 'https://uland.taobao.com', 'https://www.jd.com'] # 创建一个事件循环对象 loop = asyncio.get_event_loop() for url in urls: c = get_page(url) task = asyncio.ensure_future(c) # 给任务对象绑定回调函数用于解析相应数据 task.add_done_callback(callback) tasks.append(task) # 蒋多个任务对象对应的列表注册到事件循环中 loop.run_until_complete(asyncio.wait(tasks)) print(time.time() - s)View Code
-
event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足条件发生的时候,就会调用对应的处理方法。
-
coroutine:中文翻译叫协程,在 Python 中常指代为协程对象类型,我们可以将协程对象注册到时间循环中,它会被事件循环调用。我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。
-
task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。
-
future:代表将来执行或没有执行的任务的结果,实际上和 task 没有本质区别。
- async:async 定义一个协程。
- await:await 用来挂起阻塞方法的执行。
- aiohttp:支持异步发送请求
注意:
async/await 关键字,它是从 Python 3.5 才出现的,专门用于定义协程。
asyncio只能发tcp级别的请求,不能发http协议。
requests不是异步请求方式,发送请求要用到aiohttp。