You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫关闭前存储全量统计数据及get_all报错排查

问题原因
  • 核心报错原因:Scrapy的MemoryStatsCollector类没有get_all()这个公开方法,属于API名称记忆错误,获取全量统计数据的正确方法是get_stats(),该方法会直接返回存储所有运行统计信息的字典。
  • 现有代码的额外隐患:重写from_crawler方法时没有调用父类的from_crawler完成Spider基础属性初始化,直接手动实例化类会导致Spider自带的name、settings、crawler等属性缺失,后续运行可能触发其他异常。
正确实现代码
import scrapy
from scrapy import signals
import jsonlines

class TestSpider(scrapy.Spider):
    name = 'stats'
    start_urls = ['http://quotes.toscrape.com']

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        # 调用父类方法完成spider标准初始化流程
        spider = super().from_crawler(crawler, *args, **kwargs)
        # 注册爬虫关闭信号
        crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        # 调用正确的get_stats()方法拉取全量统计数据
        stats_data = self.crawler.stats.get_stats()
        output_file = 'run_stats.jl'
        with jsonlines.open(output_file, 'w') as f:
            f.write(stats_data)

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url=url,
                callback=self.parse
            )

    def parse(self, response):
        content = response.xpath('//div[@class="row"]')
        for items in content:
            yield {
                'some_items_links': items.xpath(".//a//@href").get()
            }
补充说明
  • 如果需要输出标准格式化JSON文件而非jsonlines格式,可以替换写入逻辑为标准json库实现:
import json
# spider_closed方法内替换写入部分代码即可
with open('run_stats.json', 'w', encoding='utf-8') as f:
    json.dump(stats_data, f, ensure_ascii=False, indent=2)
  • get_stats()返回的统计数据默认包含请求总数、响应总数、Item爬取量、运行耗时、异常计数、状态码分布等所有Scrapy运行期自动采集的指标,无需额外手动埋点采集。

内容的提问来源于stack exchange,提问作者Working dollar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:57:17