Skip to main content

信号

Scrapy广泛地使用信号来通知何时发生某些事件。您可以在Scrapy项目中捕获一些信号(例如使用 延期)执行其他任务,或者扩展Scrapy以添加开箱即用的功能。

即使信号提供了几个参数,捕获它们的处理程序不需要接受所有的参数 - 信号分配机制将仅传递处理程序接收的参数。

您可以通过 信号API 连接到信号(或发送自己的信号)。

这里是一个简单的例子,显示如何捕获信号和执行一些操作:

from scrapy import signals
from scrapy import Spider


class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
    ]


    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(DmozSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
        return spider


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


    def parse(self, response):
        pass

延迟信号处理程序

一些信号支持从他们的处理程序返回 Twisted deferreds,见下面的 内置信号参考 知道哪些。

内置信号参考

这里是Scrapy内置信号及其含义的列表。

engine_started

scrapy.signals.engine_started()

当Scrapy引擎开始抓取时发送。

此信号支持从处理程序返回延迟。

注解

该信号可以被发射 afterspider_opened 信号,这取决于如何启动蜘蛛。所以 依靠这个信号在 spider_opened 之前被触发。

engine_stopped

scrapy.signals.engine_stopped()

当Scrapy引擎停止时发送(例如,抓取进程完成后)。

此信号支持从处理程序返回延迟。

item_scraped

scrapy.signals.item_scraped(item, response, spider)

当项目已经通过所有 项目管道 阶段(未删除)时,发送该项目。

此信号支持从处理程序返回延迟。

参数:
  • item (dict or Item object) – 项目刮
  • spider (Spider object) – 蜘蛛刮了的东西
  • response (Response object) – 来自项目被刮除的响应

item_dropped

scrapy.signals.item_dropped(item, response, exception, spider)

在某个阶段引发 DropItem 异常时,从 项目管道 中删除项目后发送。

此信号支持从处理程序返回延迟。

参数:
  • item (dict or Item object) – 该项目从 项目管道 中删除
  • spider (Spider object) – 蜘蛛刮了的东西
  • response (Response object) – 来自项目被丢弃的响应
  • exception (DropItem exception) – 该异常(它必须是 DropItem 子类),它导致该项被删除

spider_closed

scrapy.signals.spider_closed(spider, reason)

在蜘蛛关闭后发送。这可以用于释放在 spider_opened 上保留的每个spider资源。

此信号支持从处理程序返回延迟。

参数:
  • spider (Spider object) – 已经关闭的蜘蛛
  • reason (str) – 一个描述蜘蛛关闭的原因的字符串。如果它被关闭,因为蜘蛛已经完成刮,原因是 'finished'。否则,如果通过调用 close_spider 引擎方法手动关闭了蜘蛛,那么原因是在该方法的 reason 参数中传递的参数(默认为 'cancelled')。如果引擎关闭(例如,通过按Ctrl-C停止它),原因将是 'shutdown'

spider_opened

scrapy.signals.spider_opened(spider)

在蜘蛛已打开以进行抓取后发送。这通常用于预留每个蜘蛛资源,但可用于需要在打开蜘蛛时执行的任何任务。

此信号支持从处理程序返回延迟。

参数:spider (Spider object) – 已经打开的蜘蛛

spider_idle

scrapy.signals.spider_idle(spider)

当蜘蛛闲置时发送,这意味着蜘蛛没有进一步:

  • 请求正在等待下载

  • 请求计划

  • 项目管道中正在处理的项目

如果在该信号的所有处理程序完成之后空闲状态仍然存在,则发动机开始关闭该蜘蛛。在蜘蛛完成关闭后,发送 spider_closed 信号。

例如,您可以在 spider_idle 处理程序中安排一些请求,以防止蜘蛛关闭。

此信号不支持从处理程序返回延迟。

参数:spider (Spider object) – 已经空闲的蜘蛛

spider_error

scrapy.signals.spider_error(failure, response, spider)

当蜘蛛回调产生错误时发送(即引发异常)。

此信号不支持从处理程序返回延迟。

参数:
  • failure (Failure object) – 该异常作为Twisted Failure 对象引发
  • response (Response object) – 当引发异常时正在处理响应
  • spider (Spider object) – 引发异常的蜘蛛

request_scheduled

scrapy.signals.request_scheduled(request, spider)

当引擎计划 Request 时发送,以便稍后下载。

该信号不支持从处理程序返回延迟。

参数:
  • request (Request object) – 到达调度程序的请求
  • spider (Spider object) – 产生请求的蜘蛛

request_dropped

scrapy.signals.request_dropped(request, spider)

当由稍后要下载的引擎调度的 Request 被调度器拒绝时发送。

该信号不支持从处理程序返回延迟。

参数:
  • request (Request object) – 到达调度程序的请求
  • spider (Spider object) – 产生请求的蜘蛛

response_received

scrapy.signals.response_received(response, request, spider)

当引擎从下载器接收到新的 Response 时发送。

此信号不支持从处理程序返回延迟。

参数:
  • response (Response object) – 收到响应
  • request (Request object) – 生成响应的请求
  • spider (Spider object) – 响应所针对的蜘蛛

response_downloaded

scrapy.signals.response_downloaded(response, request, spider)

在下载 HTTPResponse 后由下载程序发送。

此信号不支持从处理程序返回延迟。

参数:
  • response (Response object) – 响应下载
  • request (Request object) – 生成响应的请求
  • spider (Spider object) – 响应所针对的蜘蛛