如何在Scrapy中获取finish_reason、elapsed_time_seconds统计数据?
Scrapy获取爬虫结束统计数据并保存到数据库的实现
问题原因
你在parse方法里拿不到finish_reason和elapsed_time_seconds是因为这两个统计字段是爬虫完全结束后才生成的,而parse是爬虫运行过程中处理请求的方法,此时这些字段还未被统计生成,自然返回None;而log_count/DEBUG是实时累计的,所以能正常获取。
解决方案:利用Scrapy的spider_closed信号(推荐在Pipeline中实现)
Scrapy提供了spider_closed信号,当爬虫终止时会触发该信号,此时所有统计数据都已生成完毕。我们可以在Pipeline中监听这个信号,获取完整的统计数据并保存到数据库。
具体代码实现(pipeline.py)
from scrapy import signals from scrapy.crawler import Crawler class StatsSavePipeline: def __init__(self): self.stats = None @classmethod def from_crawler(cls, crawler: Crawler): pipeline = cls() # 绑定爬虫结束信号到处理方法 crawler.signals.connect(pipeline.on_spider_closed, signal=signals.spider_closed) # 保存stats对象供后续使用 pipeline.stats = crawler.stats return pipeline def process_item(self, item, spider): # 保留你原本处理Item的逻辑 return item def on_spider_closed(self, spider): # 此时可以完整获取所有统计字段 finish_reason = self.stats.get_value("finish_reason") elapsed_time = self.stats.get_value("elapsed_time_seconds") debug_log_count = self.stats.get_value("log_count/DEBUG") # 以下是保存到数据库的示例逻辑(请替换为你的数据库操作代码) # 示例:使用SQLAlchemy # from your_project.models import CrawlerStats # from your_project.db_session import session # # stats_entry = CrawlerStats( # spider_name=spider.name, # finish_reason=finish_reason, # elapsed_time=elapsed_time, # debug_log_count=debug_log_count # ) # session.add(stats_entry) # session.commit() # 打印日志确认数据 spider.logger.info(f"统计数据已获取:finish_reason={finish_reason}, 耗时={elapsed_time}秒")
启用Pipeline
在项目的settings.py中配置ITEM_PIPELINES,添加该Pipeline的路径:
ITEM_PIPELINES = { # 其他Pipeline... "your_project_name.pipelines.StatsSavePipeline": 300, }
注意事项
- 确保Scrapy统计功能开启:
settings.py中STATS_ENABLED = True(默认开启) - 多爬虫场景下,每个爬虫的
spider_closed信号会独立触发,stats数据相互隔离,无需担心混淆
内容的提问来源于stack exchange,提问作者user984621
相关产品推荐
相关产品推荐

