基于asyncio与aiohttp实现异步爬虫

之前爬虫一直用的python2.7,不用第三方框架的话只能用多线程来提升爬虫效率。自从听说python3.5原生自带异步后,就拿来实现了一下,效果还不错。

本来想使用asyncio与requests库进行爬虫,但是由于requests同步阻塞,无法异步。google后得知python中aiohttp是可以实现异步的。

附官方文档:aiohttp官方文档

部分代码如下:

asyncio

import asyncio

loop = asyncio.get_event_loop()
tasks = [    
    do_something() # 你的逻辑代码
    for i in range(5) # 需要开启的任务数,我这边就开启了5个
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

aiohttp

import aiohttp

# http post方法实现,看起来还是比较简单的,基本和requests差不多,不过多赘述
async with aiohttp.ClientSession() as session:
    async with session.post(url=url, data=formData, headers=headers) as response:
          r = await response.text()
    ...
    pass

async && await

在python3.5之后还引入了关键字async和await关键字,如果方法前没有写async,在方法内是无法定义await的。

async: 写在你要指定异步的方法def之前,等同于@asyncio.coroutine

async def doSomething():
    ...
    pass

await: 写在调用此方法前,等同于yield from

async def other_field():
    await doSomething()
    ...
    pass

之后再对上述代码进行整合,结合你自己的业务逻辑代码,就可以实现异步操作了,经过测试这种方式比多线程要给力。同个站点,以前开10个线程,一分钟大概只能爬取300条左右数据。使用上述方法后一分钟可爬取1000条左右。

如果想要在python2.7中使用异步,就需要借助第三方框架了。比较推荐celery,不过它是需要一个消息中间人的。等于说需要一个消息队列,官方文档中介绍比较推荐使用rabbitMQ。之后再做分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容