之前爬虫一直用的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。之后再做分析