scrapy 信号 signals.Signals()
在 Scrapy 源码中,这些 object() 创建的实例通常被用作“信号”。在 Python 中,object() 是所有类的基类,调用它而不传递任何参数会创建一个新对象。这些对象通常是唯一的,并且由于它们没有实现任何特殊的方法或属性,它们通常被用作恒定的标识符。
在 Scrapy 框架中,这些信号用于以下几个方面:
事件调度:Scrapy 使用一个基于事件的架构,这些对象作为事件的名称或类型。框架在不同的点触发这些事件,允许其他组件或扩展响应这些事件。
扩展和钩子:开发者可以在 Scrapy 项目中实现自定义扩展,并通过这些信号来挂钩(hook into)Scrapy 的不同阶段,执行自定义逻辑。
状态管理:这些对象代表 Scrapy 引擎或蜘蛛(spider)的不同状态。例如,engine_started 可能表示 Scrapy 引擎已启动,而 spider_closed 表示一个蜘蛛已关闭。
以下是每个信号的可能用途:
engine_started:Scrapy 引擎启动时触发。
engine_stopped:Scrapy 引擎停止时触发。
spider_opened:蜘蛛打开并准备开始爬取时触发。
spider_idle:蜘蛛等待新的请求时触发,表示当前没有请求在处理中。
spider_closed:蜘蛛关闭时触发,通常在爬取完成后。
spider_error:蜘蛛遇到错误时触发。
request_scheduled:请求被调度到下载器时触发。
request_dropped:请求被丢弃时触发,可能是因为重复或过滤。
request_reached_downloader:请求到达下载器,准备下载时触发。
request_left_downloader:请求离开下载器,下载完成时触发。
response_received:响应被接收时触发,表示数据已下载但尚未处理。
response_downloaded:响应数据已下载到本地存储时触发。
headers_received:响应头被接收时触发。
bytes_received:数据块被接收时触发,用于跟踪下载进度。
item_scraped:项目(Item)被成功提取时触发。
item_dropped:项目被丢弃时触发,可能是因为重复或过滤。
item_error:项目处理过程中出现错误时触发。
这些信号可以通过 Scrapy 的 signals 模块进行连接和监听,以下是一个简单的示例:
from scrapy import signals
class MySpiderSpider(scrapy.Spider):
name = 'myspider'
def __init__(self):
self.signals = signals.Signals()
def start_requests(self):
self._connect_signals()
yield scrapy.Request(url=self.start_urls[0], callback=self.parse)
def _connect_signals(self):
self.signals.connect(self.on_engine_started, signal=signals.engine_started)
# 连接其他信号...
def on_engine_started(self, sender):
print("Engine started!")
# 在这里添加自定义逻辑
在这个示例中,我们定义了一个 MySpiderSpider 类,它监听 engine_started 信号,并在该事件发生时执行自定义逻辑。这只是一个简单的例子,实际使用中,你会根据需要连接和响应不同的信号。