Python 的 requests 库提供了一个简单方便的 HTTP 客户端,非常适合编写爬虫。但是 requests 使用同步 IO,这意味着它在等待响应时会阻塞线程。对于 IO 密集型的爬虫应用来说,这会大大降低性能。
aiohttp 库使用了异步 IO,可以在等待响应的同时继续执行其他任务,从而大大提高了爬虫的效率。本文将介绍如何使用 aiohttp 来编写高性能的异步爬虫。
aiohttp 基础
aiohttp 提供了 ClientSession 对象来发送 HTTP 请求:
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get('http://example.com') as response:
print(await response.text())
关键是使用 async/await 语法,这可以让我们以同步的方式编写异步代码。
异步爬取
下面是一个简单的示例,异步爬取多个 URL:
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
print(await response.text())
urls = ['http://example.com' for i in range(10)]
asyncio.run(asyncio.gather(*[fetch(url) for url in urls]))
这里我们使用 asyncio.gather 来并发运行多个协程。
提高效率的技巧
aiohttp 让编写高性能爬虫变得简单。正确使用异步 IO 和协程可以大大提升爬取效率。当然性能优化需要根据具体业务场景进行调整。