如何在Scrapy爬虫运行时监控并输出内存使用情况?
Scrapy爬虫内存监控解决方案
问题1:在爬虫代码中实时输出内存使用
可以借助psutil库直接获取当前爬虫进程的内存数据,在代码中按需输出:
- 先在项目的
requirements.txt中添加psutil,确保Heroku部署时能安装该依赖 - 在爬虫代码中实现内存获取函数,然后在需要监控的位置调用:
import psutil import os def get_current_memory(): process = psutil.Process(os.getpid()) # 转换为MB单位,保留两位小数 mem_usage_mb = process.memory_info().rss / (1024 * 1024) return f"爬虫当前内存占用:{mem_usage_mb:.2f} MB" # 在parse回调中调用示例 def parse(self, response): print(get_current_memory()) # 你的爬取逻辑代码...
如果想实现自动周期性输出,还可以编写Scrapy扩展,每隔指定请求数或时间自动打印内存数据,不用手动在每个回调中添加。
问题2:查看运行中爬虫的内存使用量
用Heroku官方工具精准查看
- 执行
heroku ps:top命令,这是Heroku官方提供的dyno进程监控工具,能直接看到当前运行的Python爬虫进程的CPU、内存实时占用数据,比本地top更准确——本地环境和Heroku dyno的资源限制、系统配置差异很大,内存增长速度自然不一致。 - 配合实时日志监控:执行
heroku logs --tail,如果已经开启MEMUSAGE_ENABLED=True,日志中会定期输出Scrapy内置的内存统计,再加上代码中psutil的输出,能实现全方位监控。
确认目标进程
如果heroku ps:top中出现多个Python进程,可通过进程的命令行参数区分:你的爬虫是通过scrapy crawl [爬虫名]启动的,进程列表中会显示完整启动命令,直接对应目标爬虫。
本地与Heroku内存增长不一致的常见原因:
- Heroku dyno有严格内存阈值,接近限制时会触发内存压缩或OOM回收,改变内存增长曲线
- 本地与Heroku的Python版本、依赖包版本存在细微差异
- 网络环境不同导致爬取队列、缓存的数据量有差异
内容的提问来源于stack exchange,提问作者Allen Y
相关产品推荐
相关产品推荐

