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 信号,并在该事件发生时执行自定义逻辑。这只是一个简单的例子,实际使用中,你会根据需要连接和响应不同的信号。

posted @ 2024-06-19 11:19  AngDH  阅读(20)  评论(0编辑  收藏  举报