与异步爬虫的相见
文章目录
- 一、asynico是什么?
- 二、使用步骤
- 1.普通用法
- 2,在爬虫里面的用法
一、asynico是什么?
简言之,就是用这个库可以来实现异步IO
二、使用步骤
1,普通用法
1,下面我们来看一个案例:
import asyncio async def sex(x): print(x) name=sex('男生') print(name) #打印出来为一个协程对象,而不是像以前一样打印内容(先不执行) print('上面是一个协程对象') #看英文意思我们就可以知道,get_event_loop得到一个事 件循环,也即所有含async的等待列表 loop=asyncio.get_event_loop() #下面这个意思就是逐步执行loop里面所等待的内容 ,sex函数也在事件循环里面,所以下面才会执行 loop.run_until_complete(name)#asynico.run(name)这个是等价于上面两行的
打印结果如下:
2,在爬虫里面的用法
asynico模块就是支持异步IO的,是在Python3.4之后才有的模块,功能相当强大,但是目前它不支持发送http请求,只支持tcp请求,如果要发送http请求,就要自己再tcp基础之上封装自己的http请求,当然这啃不动不用我们自己写啊,谁叫我们用了Python呢,早就有人为我们封装了这个模块,那就是aiohttp,我们直接用就好了。
这告诉我们----要想异步url,需要使用aiohttp
代码如下:
import time,asyncio,aiohttp #导入库 start=time.time() async def get_url(url): session=aiohttp.ClientSession() #确定clien对象 res=await session.get(url) #异步等待 await res.text() await session.close() return res async def request(): url='https://www.httpbin.org/delay/5' #该网站爬取十次不用异步需要六十秒 res=await get_url(url) tasks=[asyncio.ensure_future(request()) for i in range(10)] #列表解析式 loop=asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) end=time.time() print(end-start)
下面是运行结果: