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
相关产品推荐
相关产品推荐

