Signals

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

Deferred signal handlers

一些信号支持从其处理程序返回Twisted延迟 ,请参阅下面的内置信号参考以了解哪些信号 .

Built-in signals reference

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

engine_started

scrapy.signals.engine_started()

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

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

Note

可能会 spider_opened信号之后触发此信号,具体取决于如何启动Spider. 因此,不要依赖于spider_opened之前触发此信号.

engine_stopped

scrapy.signals.engine_stopped()

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

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

item_scraped

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

通过所有" 项目流水线"阶段(不删除)后,在刮取某项时发送.

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

Parameters:
  • 物品 (字典或Item对象)–抓取的物品
  • 蜘蛛Spider对象)–抓取物品的蜘蛛
  • 响应Response对象)–刮取项目的响应

item_dropped

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

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

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

Parameters:

item_error

scrapy.signals.item_error(item, response, spider, failure)

项目管道生成错误(即引发异常)( DropItem异常除外)时DropItem .

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

Parameters:

spider_closed

scrapy.signals.spider_closed(spider, reason)

蜘蛛关闭后发送. 这可以用来释放在spider_opened保留的每个蜘蛛资源.

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

Parameters:
  • 蜘蛛Spider对象)–已关闭的蜘蛛
  • 原因str )–一个字符串,描述蜘蛛被关闭的原因. 如果由于蜘蛛已完成刮削而将其关闭,则原因是'finished' . 否则,如果通过调用close_spider引擎方法手动关闭了close_spider ,则原因是在该方法的reason参数中传递的reason (默认为'cancelled' ). 如果引擎关闭(例如,通过按Ctrl-C使其停止),则原因为'shutdown' .

spider_opened

scrapy.signals.spider_opened(spider)

在蜘蛛爬行后发送. 这通常用于保留每个蜘蛛资源,但可用于打开蜘蛛网时需要执行的任何任务.

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

Parameters: 蜘蛛Spider对象)–已打开的蜘蛛

spider_idle

scrapy.signals.spider_idle(spider)

蜘蛛闲置时发送,这意味着蜘蛛不再移动了:

  • 请求等待下载
  • requests scheduled
  • 物料管道中正在处理的物料

如果在此信号的所有处理程序完成之后,空转状态仍然存在,则引擎开始关闭星形轮. 蜘蛛网完成关闭后,将发送spider_closed信号.

您可以引发DontCloseSpider异常,以防止蜘蛛网被关闭.

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

Parameters: 蜘蛛Spider对象)–闲置的蜘蛛

Note

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

spider_error

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

当Spider回调产生错误时发送(即引发异常).

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

Parameters:
  • failure失败对象)–作为"扭曲失败"对象引发的异常
  • 响应Response对象)–引发异常时正在处理的响应
  • 蜘蛛Spider对象)–引发异常的蜘蛛

request_scheduled

scrapy.signals.request_scheduled(request, spider)

Sent when the engine schedules a Request, to be downloaded later.

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

Parameters:
  • requestRequest对象)–到达调度程序的请求
  • 蜘蛛Spider对象)–产生请求的蜘蛛

request_dropped

scrapy.signals.request_dropped(request, spider)

当发送Request ,由发动机计划于下载后,由调度拒绝.

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

Parameters:
  • requestRequest对象)–到达调度程序的请求
  • 蜘蛛Spider对象)–产生请求的蜘蛛

request_reached_downloader

scrapy.signals.request_reached_downloader(request, spider)

Request到达下载器时发送.

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

Parameters:
  • requestRequest对象)–到达下载器的请求
  • 蜘蛛Spider对象)–产生请求的蜘蛛

response_received

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

引擎从下载程序收到新的Response时发送.

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

Parameters:
  • 响应Response对象)–收到的响应
  • requestRequest对象)–生成响应的请求
  • 蜘蛛Spider对象)–预期响应的蜘蛛

response_downloaded

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

在下载HTTPResponse之后,由下载程序立即发送.

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

Parameters:
  • 响应Response对象)–下载的响应
  • requestRequest对象)–生成响应的请求
  • 蜘蛛Spider对象)–预期响应的蜘蛛