Skip to main content

扩展

扩展框架提供了一种将自己的自定义功能插入到Scrapy中的机制。

扩展只是在Scrapy启动时初始化扩展时实例化的常规类。

扩展设置

扩展使用 Scrapy设置 来管理其设置,就像任何其他Scrapy代码一样。

通常,扩展使用自己的名称为其设置添加前缀,以避免与现有(和将来)扩展冲突。例如,处理 Google Sitemaps 的假设扩展将使用像 GOOGLESITEMAP_ENABLEDGOOGLESITEMAP_DEPTH 等的设置。

正在载入并启用扩充功能

扩展在启动时通过实例化扩展类的单个实例来加载和激活。因此,所有的扩展初始化代码必须在类构造函数(__init__ 方法)中执行。

要使分机可用,请将其添加到Scrapy设置中的 EXTENSIONS 设置。在 EXTENSIONS 中,每个扩展由一个字符串表示:扩展的类名的完整Python路径。例如:

EXTENSIONS = {
    'scrapy.extensions.corestats.CoreStats': 500,
    'scrapy.extensions.telnet.TelnetConsole': 500,
}

如您所见,EXTENSIONS 设置是一个dict,其中键是扩展路径,它们的值是定义扩展 loading 顺序的顺序。 EXTENSIONS 设置与Scrapy中定义的 EXTENSIONS_BASE 设置(不意味着被覆盖)合并,然后按顺序排序,以获得已启用扩展的最终排序列表。

由于扩展通常不依赖于彼此,它们的加载顺序在大多数情况下是不相关的。这就是为什么 EXTENSIONS_BASE 设置定义具有相同顺序的所有扩展(0)的原因。但是,如果您需要添加依赖于已加载的其他扩展的扩展,则可以利用此功能。

可用,启用和禁用的扩展

并非所有可用的扩展程序都将启用。其中一些通常取决于特定的设置。例如,HTTP缓存扩展默认可用,但禁用,除非设置了 HTTPCACHE_ENABLED 设置。

禁用扩展

为了禁用默认启用的扩展(即包含在 EXTENSIONS_BASE 设置中的扩展),您必须将其顺序设置为 None。例如:

EXTENSIONS = {
    'scrapy.extensions.corestats.CoreStats': None,
}

编写自己的扩展

每个扩展都是一个Python类。 Scrapy扩展(这也包括中间件和管道)的主入口点是接收 Crawler 实例的 from_crawler 类方法。通过抓取工具对象,您可以访问设置,信号,统计信息,并控制抓取行为。

通常,扩展连接到 信号 并执行由它们触发的任务。

最后,如果 from_crawler 方法引发 NotConfigured 异常,扩展将被禁用。否则,将启用该扩展。

样品扩展

这里我们将实现一个简单的扩展来说明前面章节中描述的概念。此扩展将每次都记录一条消息:

  • 一个蜘蛛被打开

  • 蜘蛛关闭

  • 刮掉特定数量的项目

扩展将通过 MYEXT_ENABLED 设置启用,并且项目数将通过 MYEXT_ITEMCOUNT 设置指定。

这里是这样的扩展的代码:

import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured

logger = logging.getLogger(__name__)

class SpiderOpenCloseLogging(object):

    def __init__(self, item_count):
        self.item_count = item_count
        self.items_scraped = 0

    @classmethod
    def from_crawler(cls, crawler):
        # first check if the extension should be enabled and raise
        # NotConfigured otherwise
        if not crawler.settings.getbool('MYEXT_ENABLED'):
            raise NotConfigured

        # get the number of items from settings
        item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 1000)

        # instantiate the extension object
        ext = cls(item_count)

        # connect the extension object to signals
        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)
        crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

        # return the extension object
        return ext

    def spider_opened(self, spider):
        logger.info("opened spider %s", spider.name)

    def spider_closed(self, spider):
        logger.info("closed spider %s", spider.name)

    def item_scraped(self, item, spider):
        self.items_scraped += 1
        if self.items_scraped % self.item_count == 0:
            logger.info("scraped %d items", self.items_scraped)

内置扩展引用

通用扩展

日志统计信息扩展

class scrapy.extensions.logstats.LogStats

记录基本统计信息(例如已抓取的页面和已抓取的项目)。

Core Stats扩展

class scrapy.extensions.corestats.CoreStats

启用核心统计信息的收集(前提是已启用统计信息收集)(请参阅 统计数据)。

Telnet控制台扩展

class scrapy.extensions.telnet.TelnetConsole

提供一个telnet控制台,用于在当前正在运行的Scrapy进程中进入Python解释器,这对于调试非常有用。

Telnet控制台必须通过 TELNETCONSOLE_ENABLED 设置启用,服务器将侦听在 TELNETCONSOLE_PORT 中指定的端口。

内存使用扩展

class scrapy.extensions.memusage.MemoryUsage

注解

此扩展在Windows中不起作用。

监视运行蜘蛛的Scrapy进程使用的内存,以及:

  1. 当超过特定值时发送通知电子邮件

  2. 当蜘蛛超过一定值时关闭蜘蛛

当达到某个警告值(MEMUSAGE_WARNING_MB)并且当达到最大值(MEMUSAGE_LIMIT_MB)时,可以触发通知电子邮件,这也将导致蜘蛛被关闭并且Scrapy进程被终止。

此扩展由 MEMUSAGE_ENABLED 设置启用,可以使用以下设置进行配置:

内存调试器扩展

class scrapy.extensions.memdebug.MemoryDebugger

用于调试内存使用的扩展。它收集有关以下信息:

要启用此扩展,请打开 MEMDEBUG_ENABLED 设置。信息将存储在统计数据中。

关闭蜘蛛延伸

class scrapy.extensions.closespider.CloseSpider

当满足某些条件时,使用每个条件的特定关闭原因,自动关闭蜘蛛。

关闭蜘蛛的条件可以通过以下设置进行配置:

CLOSESPIDER_TIMEOUT

默认值:0

一个整数,指定秒数。如果蜘蛛保持打开超过秒数,它会自动关闭与 closespider_timeout 的原因。如果为零(或未设置),则蜘蛛将不会被超时关闭。

CLOSESPIDER_ITEMCOUNT

默认值:0

指定项目数的整数。如果蜘蛛抓取的数量超过该数量,如果项目和那些项目通过了项目管道,则蜘蛛将被关闭,原因是 closespider_itemcount。如果为零(或未设置),则蜘蛛将不会被传递的项目数关闭。

CLOSESPIDER_PAGECOUNT

0.11 新版功能.

默认值:0

一个整数,指定要抓取的最大响应数。如果蜘蛛爬行更多,蜘蛛将关闭与原因 closespider_pagecount。如果为零(或未设置),则蜘蛛将不会被抓取的响应数量关闭。

CLOSESPIDER_ERRORCOUNT

0.11 新版功能.

默认值:0

一个整数,指定在关闭蜘蛛之前要接收的最大错误数。如果蜘蛛产生的错误数量超过这个数量,它将被 closespider_errorcount 的原因关闭。如果为零(或未设置),则蜘蛛将不会被错误数量关闭。

StatsMailer扩展

class scrapy.extensions.statsmailer.StatsMailer

这个简单的扩展可用于在每次域完成抓取时发送通知电子邮件,包括收集的Scrapy统计信息。电子邮件将发送到在 STATSMAILER_RCPTS 设置中指定的所有收件人。

调试扩展

堆栈跟踪转储扩展

class scrapy.extensions.debug.StackTraceDump

转储接收到 SIGQUITSIGUSR2 信号时关于正在运行的进程的信息。转储的信息如下:

  1. 发动机状态(使用 scrapy.utils.engine.get_engine_status()

  2. 活参考(见 使用 trackref 调试内存泄漏

  3. 所有线程的堆栈跟踪

堆栈跟踪和引擎状态转储后,Scrapy进程继续正常运行。

此扩展仅适用于符合POSIX标准的平台(即不是Windows),因为 SIGQUITSIGUSR2 信号在Windows上不可用。

有至少两种方式发送Scrapy的 SIGQUIT 信号:

  1. 在Scrapy进程运行时按Ctrl- (仅限Linux?)

  2. 通过运行此命令(假设 <pid> 是Scrapy进程的进程标识):

    kill -QUIT <pid>
    

调试器扩展

class scrapy.extensions.debug.Debugger

当接收到 SIGUSR2 信号时,在运行的Scrapy进程内调用 Python debugger。退出调试器后,Scrapy进程将继续正常运行。

更多信息请参阅 Debugging in Python

此扩展仅适用于符合POSIX标准的平台(即不是Windows)。