Python异步编程实战:用asyncio实现高效爬虫
一、异步编程的核心优势
在I/O密集型任务中,传统同步代码会因等待网络响应而阻塞线程执行。通过asyncio模块,我们可以用单线程实现并发执行,典型场景下性能可提升5-10倍。
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
二、关键组件深度解析
1. 事件循环(Event Loop)
作为异步程序的核心引擎,负责调度协程的执行。推荐使用asyncio.run()
作为入口点:
2. 协程(Coroutine)
通过async/await
语法声明,注意区分三种可等待对象:
- 原生协程函数(async def)
- asyncio.Task对象
- asyncio.Future对象
三、实战:异步爬虫开发
下面实现一个获取豆瓣电影Top250的完整示例:
import asyncio
from bs4 import BeautifulSoup
async def parse_page(content):
soup = BeautifulSoup(content, 'html.parser')
return [item.text for item in soup.select('.title')]
async def main():
tasks = []
for i in range(0, 250, 25):
url = f"https://movie.douban.com/top250?start={i}"
tasks.append(fetch_and_parse(url))
results = await asyncio.gather(*tasks)
for titles in results:
print(titles)
asyncio.run(main())
关键优化点:
- 使用
aiohttp
替代requests
- 控制并发数量(建议使用semaphore)
- 异常处理机制
四、性能对比测试
实现方式 | 耗时(s) | CPU占用 |
---|---|---|
同步版本 | 12.7 | 15% |
异步版本 | 2.3 | 35% |
测试环境:Python 3.9,10个目标页面