
提升 Python 网络爬虫效率,核心在于减少等待、复用资源、合理并发和避免重复请求。不是单纯堆线程数,而是让每一次 HTTP 请求更“聪明”。
用 Session 复用连接,省掉重复握手
每次用 requests.get() 都会新建 TCP 连接(含三次握手 + TLS 握手),开销不小。换成 requests.Session() 可自动复用底层连接,尤其对同一域名的多次请求效果明显。
- Session 默认启用连接池,支持 keep-alive
- 可统一设置 headers、cookies、超时等,代码更简洁
- 搭配
urllib3.util.Retry还能自动重试失败请求
控制并发粒度,别盲目上 asyncio 或多进程
IO 密集型爬虫(如大量 HTTP 请求)适合异步,但 asyncio 并非万能:DNS 解析阻塞、SSL 开销、目标站限流都可能拖慢整体速度。先测瓶颈再选方案。
- 少量请求(ThreadPoolExecutor 足够,简单稳定
- 高频请求(尤其同域名)优先考虑
aiohttp + asyncio,但记得限制并发数(如asyncio.Semaphore(10)) - CPU 密集型任务(如解析复杂 HTML、解密 JS)才考虑
multiprocessing
精简响应内容,只取所需字段
服务器返回的 HTML 或 JSON 常含大量冗余数据,下载和解析全量内容既耗带宽又拖慢速度。
立即学习“Python免费学习笔记(深入)”;
- 用
requests.get(url, stream=True)流式读取,配合Content-Length或分块判断提前终止 - API 接口优先加
?fields=title,link类参数,或用 GraphQL 精确指定字段 - HTML 解析前先用正则或字符串方法粗筛(如
response.text[:5000]),再交给lxml或BeautifulSoup
加缓存 & 去重,避免反复抓相同页面
动态内容少的站点(如新闻归档、商品目录),重复请求纯属浪费。本地缓存 + URL 去重能显著降低请求数。
- 用
requests-cache自动缓存响应,支持 SQLite、Redis 后端 - URL 去重建议用布隆过滤器(
bloom-filter库),内存占用低、查询快 - 对带参数的 URL,标准化后再去重(如排序 query 参数、剔除 utm_ 类跟踪参数)
不复杂但容易忽略。真正快的爬虫,往往花在设计请求策略上的时间,比写解析逻辑还多。










