aiohttp爬虫

本文探讨了一个基于aiohttp实现的简单异步爬虫。文章讲解了异步函数的工作原理,强调了consumer coroutine在并发控制中的作用以及process_content函数在处理HTML和保存至MySQL中的应用。同时,详细阐述了asyncio的相关概念,如await关键字的用法,以及为何需要aiohttp和aiomysql等库来支持非阻塞操作。文中还对比了await与asyncio.ensure_future/async的区别,并解释了Future对象在异步编程中的角色和运行流程。最后,提供了Tornado中使用Future对象的一个案例作为补充。

一个简单的异步爬虫. 

私信太多,统一回答一下:

关于异步函数的:

1. 真正派发任务的是  consumer 这个coroutine,所以也在内部做了并发控制. 

2. process_content 用于获取html及保存到mysql.

关于异步相关(asyncio)的 :

1.await 相当于 yield from . 

 

2.await 后面是一个coroutine, 普通函数不是coroutine,普通函数也不是通过加一个 async   / asyncio.coroutine,就能真正

成为coroutine的,就算没报错,如果内部加了阻塞函数(time.sleep / read /write ) 还是一个阻塞函数;因此,往往我们自己的

coroutine只是一个中间层的东西,所以需要aiohttp , aiomysql等这个模块来提供支持,就跟tornado的异步框架一样,如果你

在get()/post() 中加了阻塞函数调用,tornado 还是阻塞的.

 

3. 这个问题问的有点多 . 

1. await 后面可以是 Task,Future,async def xxx() ( 自定义函数) ,因此在加入loop 时,将自动封装我们自定义的coroutine成为一个 Task / Future 对象.

* 2. 无论是 await 还是  asyncio.ensure_future/async , 都将把coroutine加入loop中,但是两者有一个差别:

      await 是等待这个coroutine 运行完成, ensure_future/async 不会等待直接仍入循环体中运行. 

      这个就是下面代码中一会用await 一会用ensure_future/async .同样的也是很多人问,

      为什么在控制 coroutine 的时候: async with sem 后面用ensure_future 控制不了的原因

 

3.额外说明一下Future对象. 下面代码中没有自行创建Future对象, 其实也可以用, Future对象与Twisted中的

Defer对象极其类似. 只不过Future 对象一般都是 await Future, 当然也可以使用回调: Future.add_done_callback.

而Defer对象是使用2个回调链的方式.具体可参考我写的:Twisted

这2个对象都在Future.set_result 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值