Scrapy爬虫关闭后仍运行并输出0条目/分钟统计信息求助
检查Playwright进程残留:直接查看系统进程列表(Linux用
ps aux | grep chromium,Windows打开任务管理器),确认是否存在未关闭的浏览器实例。若有,手动终止后观察统计输出是否停止。同时检查爬虫代码中的资源释放逻辑,确保爬虫结束时调用了browser.close()和context.close(),不要遗漏任何打开的页面或上下文。排查Scrapy统计调度器的后台触发:将Scrapy日志级别设为
DEBUG(LOG_LEVEL='DEBUG'),查看是否有后台线程在持续向StatsCollector上报数据,定位触发统计输出的组件。另外检查自定义中间件、扩展,确认是否存在爬虫关闭后仍在运行的模块。验证爬虫结束信号的处理:Scrapy会发送
spider_closed信号,需确保Playwright的清理逻辑绑定了该信号。例如在爬虫类中注册信号回调,彻底关闭浏览器和上下文:
from scrapy import signals class YourSpider(scrapy.Spider): # ... @classmethod def from_crawler(cls, crawler, *args, **kwargs): spider = super().from_crawler(crawler, *args, **kwargs) crawler.signals.connect(spider.cleanup_playwright, signal=signals.spider_closed) return spider def cleanup_playwright(self, spider): if hasattr(self, 'browser'): yield self.browser.close() # 异步场景下需用await处理关闭操作
清理未完成的异步任务:Playwright为异步框架,若爬虫主线程结束后仍有未完成的异步任务(如页面加载、请求),任务完成后会上报统计数据。可在
spider_closed回调中用asyncio.gather()等待所有任务结束,或设置超时强制取消。同时给page.wait_for_*这类操作添加合理超时,避免任务挂起。禁用第三方扩展排查:部分监控、统计类第三方扩展可能在爬虫关闭后仍运行,导致持续输出统计。临时注释
settings.py中EXTENSIONS配置里的非核心扩展,逐个排查是否为扩展导致的问题。重新检查meta-refresh跳转:虽之前解决过此类问题,但可能存在动态生成的meta-refresh,Playwright加载页面后才触发跳转。可给页面添加
framenavigated事件监听,观察爬虫关闭后是否有异常跳转:
page.on("framenavigated", lambda frame: self.logger.info(f"跳转URL: {frame.url}"))
内容的提问来源于stack exchange,提问作者Nekender Shekhawat

