# 信號
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
Scrapy廣泛使用信號來通知某些事件何時發生。你可以在你的垃圾項目中捕捉到這些信號(使用 [extension](extensions.html#topics-extensions) 例如)執行其他任務或擴展scrapy以添加框外未提供的功能。
即使信號提供了幾個參數,捕獲它們的處理程序也不需要接受所有參數——信號調度機制只傳遞處理程序接收的參數。
您可以通過 [信號API](api.html#topics-api-signals) .
下面是一個簡單的示例,演示如何捕獲信號并執行某些操作:::
```py
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 deferreds](https://twistedmatrix.com/documents/current/core/howto/defer.html) from their handlers, see the [內置信號參考](#topics-signals-ref) 下面是要知道哪些。
## 內置信號參考
這是一個零碎的內置信號列表及其含義。
### engine_started
```py
scrapy.signals.engine_started()
```
當廢引擎開始爬行時發送。
此信號支持從其處理程序返回延遲。
注解
此信號可能被觸發 _after_ 這個 [`spider_opened`](#std:signal-spider_opened) 信號,取決于 Spider 是如何啟動的。所以 **don't** 依靠這個信號 [`spider_opened`](#std:signal-spider_opened) .
### engine_stopped
```py
scrapy.signals.engine_stopped()
```
在 Scrapy 引擎停止時發送(例如,當爬行過程完成時)。
此信號支持從其處理程序返回延遲。
### item_scraped
```py
scrapy.signals.item_scraped(item, response, spider)
```
當一個項目被刮掉時發送,當它通過所有 [項目管道](item-pipeline.html#topics-item-pipeline) 階段(不下降)。
此信號支持從其處理程序返回延遲。
| 參數: |
* **item** (dict or [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") object) -- 物品被刮掉了
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 刮掉物品的 Spider
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 從項目被刮掉的地方得到的響應
|
| --- | --- |
### item_dropped
```py
scrapy.signals.item_dropped(item, response, exception, spider)
```
從中刪除項目后發送 [項目管道](item-pipeline.html#topics-item-pipeline) 當某個階段 [`DropItem`](exceptions.html#scrapy.exceptions.DropItem "scrapy.exceptions.DropItem") 例外。
此信號支持從其處理程序返回延遲。
| 參數: |
* **item** (dict or [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") object) -- 從中刪除的項 [項目管道](item-pipeline.html#topics-item-pipeline)
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 刮掉物品的 Spider
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 從中刪除項的響應
* **exception** ([`DropItem`](exceptions.html#scrapy.exceptions.DropItem "scrapy.exceptions.DropItem") exception) -- 例外情況(必須是 [`DropItem`](exceptions.html#scrapy.exceptions.DropItem "scrapy.exceptions.DropItem") 子類)導致該項被刪除
|
| --- | --- |
### item_error
```py
scrapy.signals.item_error(item, response, spider, failure)
```
發送時 [項目管道](item-pipeline.html#topics-item-pipeline) 生成錯誤(即引發異常),除非 [`DropItem`](exceptions.html#scrapy.exceptions.DropItem "scrapy.exceptions.DropItem") 例外。
此信號支持從其處理程序返回延遲。
| 參數: |
* **item** (dict or [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") object) -- 從中刪除的項 [項目管道](item-pipeline.html#topics-item-pipeline)
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 引發異常時正在處理的響應
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 引發異常的 Spider
* **failure** ([Failure](https://twistedmatrix.com/documents/current/api/twisted.python.failure.Failure.html) object) -- 以扭曲方式引發的異常 [Failure](https://twistedmatrix.com/documents/current/api/twisted.python.failure.Failure.html) 對象
|
| --- | --- |
### spider_closed
```py
scrapy.signals.spider_closed(spider, reason)
```
在 Spider 關閉后發送。這可用于釋放在上保留的每個 Spider 資源 [`spider_opened`](#std:signal-spider_opened) .
此信號支持從其處理程序返回延遲。
| 參數: |
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 已關閉的 Spider
* **reason** (_str_) -- 描述 Spider 關閉原因的字符串。如果它是因為 Spider 完成了抓取而關閉的,原因是 `'finished'` . 否則,如果通過調用 `close_spider` 引擎方法,則原因是 `reason` 該方法的參數(默認為 `'cancelled'` )如果發動機停機(例如,按ctrl-c停止發動機),原因將是 `'shutdown'` .
|
| --- | --- |
### spider_opened
```py
scrapy.signals.spider_opened(spider)
```
在 Spider 被打開爬行后發送。這通常用于為每個 Spider 保留資源,但可用于打開 Spider 時需要執行的任何任務。
此信號支持從其處理程序返回延遲。
| 參數: | **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 已經打開的 Spider |
| --- | --- |
### spider_idle
```py
scrapy.signals.spider_idle(spider)
```
當 Spider 空閑時發送,這意味著 Spider 沒有更多:
> * 等待下載的請求
> * 計劃的請求
> * 正在項管道中處理的項
如果此信號的所有處理程序完成后空閑狀態仍然存在,則引擎將開始關閉 Spider 。 Spider 完成閉合后, [`spider_closed`](#std:signal-spider_closed) 發送信號。
你可以舉起 [`DontCloseSpider`](exceptions.html#scrapy.exceptions.DontCloseSpider "scrapy.exceptions.DontCloseSpider") 防止 Spider 關閉的異常。
此信號不支持從其處理程序返回延遲。
| 參數: | **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 空轉的 Spider |
| --- | --- |
注解
在您的 [`spider_idle`](#std:signal-spider_idle) 處理程序 **not** 確保它可以防止 Spider 被關閉,盡管有時可以。這是因為如果計劃程序拒絕了所有計劃的請求(例如,由于重復而被篩選),那么spider可能仍然處于空閑狀態。
### spider_error
```py
scrapy.signals.spider_error(failure, response, spider)
```
在spider回調生成錯誤(即引發異常)時發送。
此信號不支持從其處理程序返回延遲。
| 參數: |
* **failure** ([Failure](https://twistedmatrix.com/documents/current/api/twisted.python.failure.Failure.html) object) -- 以扭曲方式引發的異常 [Failure](https://twistedmatrix.com/documents/current/api/twisted.python.failure.Failure.html) 對象
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 引發異常時正在處理的響應
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 引發異常的 Spider
|
| --- | --- |
### request_scheduled
```py
scrapy.signals.request_scheduled(request, spider)
```
在發動機排程A時發送 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") ,稍后下載。
該信號不支持從其處理程序返回延遲。
| 參數: |
* **request** ([`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") object) -- 到達調度程序的請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 發出請求的 Spider
|
| --- | --- |
### request_dropped
```py
scrapy.signals.request_dropped(request, spider)
```
發送時 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") 由引擎計劃稍后下載的,被調度程序拒絕。
該信號不支持從其處理程序返回延遲。
| 參數: |
* **request** ([`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") object) -- 到達調度程序的請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 發出請求的 Spider
|
| --- | --- |
### request_reached_downloader
```py
scrapy.signals.request_reached_downloader(request, spider)
```
發送時 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") 已到達下載程序。
該信號不支持從其處理程序返回延遲。
| 參數: |
* **request** ([`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") object) -- 到達下載程序的請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 發出請求的 Spider
|
| --- | --- |
### response_received
```py
scrapy.signals.response_received(response, request, spider)
```
當發動機接收到新的 [`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") 從下載程序。
此信號不支持從其處理程序返回延遲。
| 參數: |
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 收到的響應
* **request** ([`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") object) -- 生成響應的請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 響應所針對的 Spider
|
| --- | --- |
### response_downloaded
```py
scrapy.signals.response_downloaded(response, request, spider)
```
由下載者在 `HTTPResponse` 是下載的。
此信號不支持從其處理程序返回延遲。
| 參數: |
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 已下載響應
* **request** ([`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") object) -- 生成響應的請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 響應所針對的 Spider
|
| --- | --- |
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性