Scrapy广泛使用信号来通知特定事件发生的时间。您可以在Scrapy项目中捕获一些这些信号(例如使用扩展名)来执行其他任务或扩展Scrapy以添加未提供的开箱即用的功能。

即使信号提供了几个参数,捕获它们的处理程序也不需要接受所有这些参数 – 信号调度机制只会传递处理程序接收的参数。

您可以通过Signals 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延迟,请参阅下面的内置信号参考以了解哪些信号

内置信号参考

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

engine_started

scrapy.signals.engine_started()
Scrapy引擎开始爬网时发送。

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

注意

这个信号可能被解雇spider_opened信号,这取决于蜘蛛是如何开始。因此,不要依赖此信号之前被解雇spider_opened

engine_stopped

scrapy.signals.engine_stopped()
Scrapy引擎停止时发送(例如,爬网过程完成时)。

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

item_scraped

scrapy.signals.item_scraped(itemresponsespider)
在物品已经通过所有物品管道阶段(未被丢弃)之后,在物品被刮除时发送 。

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

参数:

item_dropped

scrapy.signals.item_dropped(itemresponseexceptionspider)
在某个阶段引发异常时,从项目管道中删除项目后发送DropItem

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

参数:
  • item(item object – 从项目管道中删除的项目
  • spider (Spider object)  – 刮掉物品的蜘蛛
  • response(Response object)  – 项目被删除的响应
  • exception (DropItem exception)  – DropItem导致项被删除的异常(必须是 子类)

spider_closed

scrapy.signals.spider_closed(spiderreason)
蜘蛛关闭后发送。这可用于释放保留的每蜘蛛资源spider_opened

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

参数:
  • spider (Spider object) – 已经关闭的蜘蛛
  • reason (str)  – 描述蜘蛛关闭原因的字符串。如果由于蜘蛛完成刮擦而关闭,原因是'finished'。否则,如果通过调用close_spider引擎方法手动关闭了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信号被发送。

您可以引发DontCloseSpider异常以防止蜘蛛被关闭。

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

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

注意

spider_idle处理程序中调度某些请求并 不能保证它可以阻止蜘蛛被关闭,尽管它有时可以。这是因为如果调度程序拒绝所有调度的请求(例如,由于重复而过滤),则蜘蛛可能仍然保持空闲。

spider_error

scrapy.signals.spider_error(failureresponsespider)
蜘蛛回调生成错误时发送(即引发异常)。

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

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

request_scheduled

scrapy.signals.request_scheduled(requestspider)
在引擎安排时发送Request,稍后再下载。

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

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

request_dropped

scrapy.signals.request_dropped(requestspider)
Request稍后要下载的引擎调度的a 被调度程序拒绝时发送。

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

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

response_received

scrapy.signals.response_received(responserequestspider)
当引擎Response从下载程序收到新内容时发送。

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

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

response_downloaded

scrapy.signals.response_downloaded(responserequestspider)
下载后立即由下载程序发送HTTPResponse

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

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