性能问题¶
如何提升爬取速度?¶
1. 调整并发数¶
注意:并发数不是越高越好,需要考虑: - 目标网站承受能力 - 本地资源(CPU/内存/网络) - 是否有代理支持
2. 减少下载延迟¶
3. 使用更快的下载器¶
4. 禁用不需要的中间件¶
5. 优化选择器¶
6. 使用连接池¶
内存占用过高怎么办?¶
原因分析¶
- 队列积压:pending 请求过多
- 数据未清理:Item 缓存过多
- 连接未关闭:数据库连接泄漏
- 浏览器未关闭:Playwright 实例泄漏
解决方案¶
1. 限制队列大小¶
2. 启用背压系统¶
3. 使用高效的Pipeline¶
# settings.py
PIPELINES = {
'crawlo.pipelines.MySQLPipeline': 300, # MySQL批量存储
}
MYSQL_BATCH_SIZE = 100 # 每100条保存一次
4. 定期清理缓存¶
如何优化并发?¶
网络并发¶
数据库并发¶
文件 IO 并发¶
爬虫运行很慢怎么办?¶
诊断步骤¶
1. 检查日志¶
查看: - 请求延迟是否正常 - 是否有大量重试 - 是否有错误异常
2. 检查网络¶
3. 检查资源使用¶
4. 检查队列状态¶
# 在爬虫中打印队列状态
async def parse(self, response):
queue_size = await self.crawler.scheduler.queue.size()
self.logger.info(f"队列大小: {queue_size}")
常见原因和解决方案¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 请求慢 | 目标网站响应慢 | 增加超时时间、使用代理 |
| 大量重试 | 网站反爬 | 降低并发、使用浏览器渲染 |
| 队列积压 | 生产慢于消费 | 增加数据库连接池、启用背压 |
| CPU 高 | 选择器复杂 | 优化选择器、使用 CSS 代替 XPath |
| 内存高 | 队列过大 | 限制队列大小、启用背压 |
如何监控爬虫性能?¶
1. 启用统计¶
2. 查看统计信息¶
日志中会显示:
INFO: Crawled 1234 pages (123 pages/min)
INFO: Success rate: 98.5%
INFO: Average response time: 0.5s
3. 使用扩展监控¶
# settings.py
EXTENSIONS = {
'crawlo.extension.StatsExtension': 100,
'crawlo.extension.PerformanceExtension': 200,
}
如何提高成功率?¶
1. 启用重试¶
2. 使用代理¶
3. 设置合理的 User-Agent¶
4. 添加随机延迟¶
5. 使用浏览器渲染¶
大规模爬取的最佳实践?¶
1. 分批次爬取¶
# 将 URL 列表分成多批
batches = [urls[i:i+1000] for i in range(0, len(urls), 1000)]
for batch in batches:
# 创建爬虫处理这一批
pass
2. 使用分布式模式¶
config = CrawloConfig.distributed(
project_name='myproject',
redis_host='redis.example.com',
concurrency=32
)
3. 监控和告警¶
# settings.py
NOTIFICATION_ENABLED = True
NOTIFICATION_CHANNELS = ['feishu', 'email']
NOTIFICATION_ON_ERROR = True
4. 断点续爬¶
还有其他性能问题? 查看 调度指南 或提交 GitHub Issue。