信号
当某些事件发生时,Scrapy会广泛使用信号通知。您可以在Scrapy项目中捕获一些信号(例如使用扩展名)来执行其他任务或扩展Scrapy以添加开箱即用的功能。
即使信号提供了几个参数,捕获它们的处理程序也不需要接受所有这些参数 - 信号调度机制只会传递处理程序接受的参数。
您可以通过信号API连接信号(或发送自己的信号)。
以下是一个简单的示例,显示如何捕获信号并执行某些操作:
从刮取进口信号
从进口蜘蛛蜘蛛
DmozSpider(蜘蛛)类:
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)
返回蜘蛛
def spider\_closed(self,spider):
spider.logger.info('Spider closed:%s',spider.name)
def解析(self,response):
通过
延迟信号处理程序
一些信号支持从他们的处理程序返回Twisted deferreds,请参阅下面的内置信号参考,以了解哪些信号。
内置信号参考
这是Scrapy内置信号及其含义的列表。
engine_started
scrapy.signals.engine_started()
当Scrapy引擎开始爬行时发送。
此信号支持从其处理程序返回延期。
注意
这个信号可能会在蜘蛛打开的信号后发射,这取决于蜘蛛的启动方式。所以不要依赖这个信号在spider_opened之前被解雇。
engine_stopped
scrapy.signals.engine_stopped()
当Scrapy引擎停止时发送(例如,当爬行过程完成时)。
此信号支持从其处理程序返回延期。
item_scraped
scrapy.signals.item_scraped(item,response,spider)
在已经通过所有项目管道阶段(不被删除)之后,已经刮除了项目时发送。
此信号支持从其处理程序返回延期。
参数:
项目(dict或Item对象) - 已删除的项目
蜘蛛(蜘蛛对象) - 蜘蛛刮的物品
响应(响应对象) - 从哪里刮取项目的响应
item_dropped
scrapy.signals.item_dropped(item,response,exception,spider)
在某些阶段引发DropItem异常时,从项目管道中删除项目后发送。
此信号支持从其处理程序返回延期。
参数:
item(dict或Item对象) - 从项目管道中删除的项目
蜘蛛(蜘蛛对象) - 蜘蛛刮的物品
response(响应对象) - 从项目删除的位置的响应
异常(DropItem异常) - 异常(它必须是一个DropItem子类),导致该项被删除
spider_closed
scrapy.signals.spider_closed(蜘蛛,原因)
在蜘蛛关闭后发送。这可以用于释放spider_opened保留的每蜘蛛资源。
此信号支持从其处理程序返回延期。
参数:
蜘蛛(Spider对象) - 已经关闭的蜘蛛
reason(str) - 一个描述蜘蛛关闭原因的字符串。如果由于蜘蛛已经完成刮除而关闭,原因是“完成”。否则,如果通过调用close_spider引擎方法手动关闭了蜘蛛,则原因是该方法的原因参数中传递的原因(默认为“取消”)。如果引擎关闭(例如,通过按Ctrl-C来停止它),原因将是“关闭”。
spider_opened
scrapy.signals.spider_opened(蜘蛛)
在蜘蛛打开爬行后发送。这通常用于保留每个蜘蛛资源,但可以用于在打开蜘蛛时需要执行的任何任务。
此信号支持从其处理程序返回延期。
参数:spider(Spider object) - 已打开的蜘蛛
spider_idle
scrapy.signals.spider_idle(蜘蛛)
蜘蛛已经空闲时发出,这意味着蜘蛛没有进一步的:
等待下载的请求
预定请求
正在项目管道中处理的项目
如果该信号的所有处理程序完成后空闲状态仍然存在,则引擎开始关闭蜘蛛。蜘蛛关闭完成后,发送蜘蛛闭塞信号。
例如,您可以在spider_idle处理程序中安排一些请求,以防止蜘蛛关闭。
此信号不支持从其处理程序返回延期。
参数:spider(Spider对象) - 已经空闲的蜘蛛
spider_error
scrapy.signals.spider_error(失败,回应,蜘蛛)
当蜘蛛回调产生错误(即引发异常)时发送。
此信号不支持从其处理程序返回延期。
参数:
failure(Failure对象) - 作为Twisted Failure对象引发的异常
response(响应对象) - 异常引发时正在处理的响应
蜘蛛(Spider对象) - 引起异常的蜘蛛
request_scheduled
scrapy.signals.request_scheduled(请求,蜘蛛)
发送时发动机安排一个请求,稍后下载。
该信号不支持从其处理程序返回延期。
参数:
request(Request对象) - 到达调度程序的请求
蜘蛛(Spider对象) - 产生请求的蜘蛛
request_dropped
scrapy.signals.request_dropped(请求,蜘蛛)
发送时,由发动机安排的请求稍后下载,被调度程序拒绝。
该信号不支持从其处理程序返回延期。
参数:
request(Request对象) - 到达调度程序的请求
蜘蛛(Spider对象) - 产生请求的蜘蛛
response_received
scrapy.signals.response_received(响应,请求,蜘蛛)
当引擎从下载程序接收到新的响应时发送。
此信号不支持从其处理程序返回延期。
参数:
响应(响应对象) - 收到的响应
request(Request对象) - 生成响应的请求
蜘蛛(Spider对象) - 反应意图的蜘蛛
response_downloaded
scrapy.signals.response_downloaded(响应,请求,蜘蛛)
下载HTTPResponse后下载器发送。
此信号不支持从其处理程序返回延期。
参数:
响应(Response对象) - 响应下载
request(Request对象) - 生成响应的请求
蜘蛛(Spider对象) - 反应意图的蜘蛛