基于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。之后再做分析

你可能感兴趣的:(基于asyncio与aiohttp实现异步爬虫)