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

Scrapy爬取完成后内置收集解析统计数据的方法咨询

在Scrapy项目内实现爬取结束后的统计分析与自动重爬

嘿,这个需求完全可以通过Scrapy内置的**信号(Signals)或者扩展(Extensions)**来实现,全程在项目内部搞定,不用依赖外部脚本!下面给你两种实用的实现方式:

方法一:用spider_closed信号快速实现(适合单爬虫场景)

Scrapy在爬虫结束时会触发spider_closed信号,我们可以把自定义的统计处理逻辑绑定到这个信号上,步骤超简单:

  1. 在你的爬虫类里添加信号绑定和处理函数:
import scrapy
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
import json

class MyTargetSpider(scrapy.Spider):
    name = "target_spider"
    start_urls = ["https://example.com"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 把处理函数绑定到spider_closed信号
        dispatcher.connect(self.on_spider_closed, signals.spider_closed)

    def parse(self, response):
        # 你的爬取逻辑...
        yield {"data": response.css("title::text").get()}

    def on_spider_closed(self, spider, reason):
        # 拿到爬取统计数据
        stats = spider.crawler.stats.get_stats()
        
        # 打印统计数据方便调试(可选)
        self.logger.info(f"爬取结束,统计数据:{stats}")

        # 自定义判断逻辑:比如根据抓取的item数量、错误请求数决定是否重爬
        item_count = stats.get("item_scraped_count", 0)
        failed_requests = stats.get("log_count/ERROR", 0)
        success_rate = stats.get("downloader/response_status_count/200", 0) / stats.get("downloader/request_count", 1)

        # 举个例子:如果item少于10个,或者错误请求超过5个,就重新启动爬虫
        need_retry = item_count < 10 or failed_requests > 5 or success_rate < 0.8
        if need_retry:
            self.logger.warning("爬取结果不达标,启动重爬...")
            # 重新启动当前爬虫
            from scrapy.crawler import CrawlerProcess
            process = CrawlerProcess(settings=spider.settings)
            process.crawl(MyTargetSpider)
            process.start()

        # 把统计数据保存到本地文件(可选)
        with open(f"{spider.name}_stats.json", "w", encoding="utf-8") as f:
            json.dump(stats, f, indent=4, ensure_ascii=False)

注意事项:

  • 重爬逻辑一定要加明确的触发条件,不然容易陷入无限循环;
  • 如果爬虫需要传递参数,重爬时记得把参数带上(比如process.crawl(MyTargetSpider, some_param=xxx))。

方法二:用Scrapy扩展实现(适合多爬虫复用场景)

如果你的项目有多个爬虫,或者想把统计逻辑做成可配置的复用模块,用Scrapy扩展更规范:

  1. 在项目根目录创建extensions.py,编写扩展类:
from scrapy import signals
from scrapy.exceptions import NotConfigured
import json

class StatsCheckerExtension:
    def __init__(self, crawler):
        self.crawler = crawler
        # 从settings读取配置的阈值,灵活调整不用改代码
        self.min_item_count = crawler.settings.getint("MIN_ITEM_COUNT", 10)
        self.max_error_count = crawler.settings.getint("MAX_ERROR_COUNT", 5)
        self.min_success_rate = crawler.settings.getfloat("MIN_SUCCESS_RATE", 0.8)

        # 绑定spider_closed信号
        crawler.signals.connect(self.on_spider_closed, signal=signals.spider_closed)

    @classmethod
    def from_crawler(cls, crawler):
        # 检查settings是否启用了这个扩展
        if not crawler.settings.getbool("STATS_CHECKER_ENABLED"):
            raise NotConfigured
        return cls(crawler)

    def on_spider_closed(self, spider, reason):
        stats = self.crawler.stats.get_stats()
        item_count = stats.get("item_scraped_count", 0)
        error_count = stats.get("log_count/ERROR", 0)
        total_requests = stats.get("downloader/request_count", 1)
        success_requests = stats.get("downloader/response_status_count/200", 0)
        success_rate = success_requests / total_requests

        # 判断是否需要重爬
        need_retry = (
            item_count < self.min_item_count
            or error_count > self.max_error_count
            or success_rate < self.min_success_rate
        )

        if need_retry:
            spider.logger.warning(f"爬取未达标,触发重爬:item数={item_count},错误数={error_count},成功率={success_rate:.2f}")
            # 重新启动当前爬虫
            self.crawler.engine.crawl(spider, self.crawler)

        # 保存统计数据
        with open(f"{spider.name}_stats.json", "w", encoding="utf-8") as f:
            json.dump(stats, f, indent=4, ensure_ascii=False)
  1. 在settings.py里配置扩展和参数:
# 启用统计检查扩展
STATS_CHECKER_ENABLED = True
# 自定义阈值参数
MIN_ITEM_COUNT = 10
MAX_ERROR_COUNT = 5
MIN_SUCCESS_RATE = 0.8

# 注册扩展,数字是优先级(越小越先执行)
EXTENSIONS = {
    "myproject.extensions.StatsCheckerExtension": 500,
}

扩展的优势:

  • 把统计和重爬逻辑和爬虫解耦,多个爬虫可以共用;
  • 阈值参数通过settings配置,不用修改代码就能调整规则;
  • 符合Scrapy的扩展规范,便于维护和扩展。

最后补充:Scrapy的统计数据里还有很多实用字段,比如downloader/request_bytes、item_dropped_count等,你可以根据自己的需求调整判断逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:35:47