# Spider 中間件
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
Spider中間件是一個Hook框架,可以鉤住Scrapy的Spider處理機制,在該機制中,您可以插入自定義功能來處理發送到的響應。 [Spider](spiders.html#topics-spiders) 用于處理和處理由spider生成的請求和項目。
## 激活 Spider 中間件
要激活 Spider 中間件組件,請將其添加到 [`SPIDER_MIDDLEWARES`](settings.html#std:setting-SPIDER_MIDDLEWARES) 設置,這是一個dict,其鍵是中間件類路徑,其值是中間件命令。
舉個例子:
```py
SPIDER_MIDDLEWARES = {
'myproject.middlewares.CustomSpiderMiddleware': 543,
}
```
這個 [`SPIDER_MIDDLEWARES`](settings.html#std:setting-SPIDER_MIDDLEWARES) 設置與合并 [`SPIDER_MIDDLEWARES_BASE`](settings.html#std:setting-SPIDER_MIDDLEWARES_BASE) 在scrappy中定義的設置(不打算被重寫),然后按順序排序,以獲得已啟用中間件的最終排序列表:第一個中間件更接近引擎,最后一個更接近spider。也就是說, [`process_spider_input()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input") 每個中間件的方法將以增加的中間件順序(100、200、300,…)調用,并且 [`process_spider_output()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") 每個中間件的方法將按降序調用。
要決定分配給中間件的順序,請參見 [`SPIDER_MIDDLEWARES_BASE`](settings.html#std:setting-SPIDER_MIDDLEWARES_BASE) 根據要插入中間件的位置設置和選擇一個值。順序很重要,因為每個中間件執行不同的操作,并且您的中間件可能依賴于之前(或之后)應用的一些中間件。
如果要禁用內置中間件(定義于 [`SPIDER_MIDDLEWARES_BASE`](settings.html#std:setting-SPIDER_MIDDLEWARES_BASE) ,默認情況下啟用)您必須在項目中定義它。 [`SPIDER_MIDDLEWARES`](settings.html#std:setting-SPIDER_MIDDLEWARES) 設置和分配 `None` 作為其價值。例如,如果要禁用非現場中間件:
```py
SPIDER_MIDDLEWARES = {
'myproject.middlewares.CustomSpiderMiddleware': 543,
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}
```
最后,請記住,某些中間商可能需要通過特定設置啟用。有關更多信息,請參閱每個中間件文檔。
## 編寫自己的 Spider 中間件
每個 Spider 中間件都是一個python類,它定義了下面定義的一個或多個方法。
主要入口點是 `from_crawler` 類方法,它接收 [`Crawler`](api.html#scrapy.crawler.Crawler "scrapy.crawler.Crawler") 實例。這個 [`Crawler`](api.html#scrapy.crawler.Crawler "scrapy.crawler.Crawler") 例如,對象允許您訪問 [settings](settings.html#topics-settings) .
```py
class scrapy.spidermiddlewares.SpiderMiddleware
```
```py
process_spider_input(response, spider)
```
對于通過 Spider 中間件進入 Spider 進行處理的每個響應,都會調用此方法。
[`process_spider_input()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input") 應該返回 `None` 或者提出例外。
如果它回來 `None` ,scrapy將繼續處理此響應,執行所有其他中間軟件,直到最后將響應提交給spider進行處理。
如果它引發了一個異常,那么Scrapy就不會麻煩調用任何其他的 Spider 中間件了。 [`process_spider_input()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input") 并將調用請求errback。errback的輸出被鏈接回另一個方向 [`process_spider_output()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") 處理,或 [`process_spider_exception()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception") 如果它引發了一個異常。
| 參數: |
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 正在處理的響應
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 此響應所針對的 Spider
|
| --- | --- |
```py
process_spider_output(response, result, spider)
```
在處理完響應后,調用此方法,并返回 Spider 返回的結果。
[`process_spider_output()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") 必須返回 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") DICT或 [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") 物體。
| 參數: |
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 從spider生成此輸出的響應
* **result** (an iterable of [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request"), dict or [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") objects) -- Spider 返回的結果
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 正在處理結果的 Spider
|
| --- | --- |
```py
process_spider_exception(response, exception, spider)
```
當 Spider 或 [`process_spider_input()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input") 方法(來自其他 Spider 中間件)引發異常。
[`process_spider_exception()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception") 應該返回 `None` 或者是 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") DICT或 [`Item`](items.html#scrapy.item.Item "scrapy.item.Item") 物體。
如果它回來 `None` ,Scrapy將繼續處理此異常,執行任何其他 [`process_spider_exception()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception") 在下面的中間件組件中,直到沒有中間件組件離開并且異常到達引擎(在那里記錄并丟棄它)。
如果它返回一個不可數 [`process_spider_output()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") 管道開始,沒有其他管道 [`process_spider_exception()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_exception") 將被調用。
| 參數: |
* **response** ([`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") object) -- 引發異常時正在處理的響應
* **exception** ([Exception](https://docs.python.org/2/library/exceptions.html#exceptions.Exception) object) -- 引發的異常
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 引發異常的 Spider
|
| --- | --- |
```py
process_start_requests(start_requests, spider)
```
0.15 新版功能.
這個方法是用spider的start請求調用的,其工作原理與 [`process_spider_output()`](#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") 方法,但它沒有關聯的響應,必須只返回請求(而不是項)。
它收到一個不可更改的(在 `start_requests` 參數),并且必須返回另一個ITerable of [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") 物體。
注解
在您的 Spider 中間件中實現此方法時,您應該始終返回一個ITerable(跟隨輸入的ITerable),而不是全部消費。 `start_requests` 迭代器,因為它可能非常大(甚至沒有邊界),并導致內存溢出。scrappy引擎設計用于在有能力處理啟動請求的情況下提取它們,因此,如果存在停止spider的其他條件(如時間限制或項目/頁面計數),則啟動請求迭代器實際上可以是無止境的。
| 參數: |
* **start_requests** (an iterable of [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request")) -- 啟動請求
* **spider** ([`Spider`](spiders.html#scrapy.spiders.Spider "scrapy.spiders.Spider") object) -- 啟動請求所屬的 Spider
|
| --- | --- |
```py
from_crawler(cls, crawler)
```
如果存在,則調用該類方法從 [`Crawler`](api.html#scrapy.crawler.Crawler "scrapy.crawler.Crawler") . 它必須返回中間件的新實例。爬蟲對象提供對所有零碎核心組件(如設置和信號)的訪問;它是中間件訪問它們并將其功能連接到零碎的一種方式。
| 參數: | **crawler** ([`Crawler`](api.html#scrapy.crawler.Crawler "scrapy.crawler.Crawler") object) -- 使用此中間件的爬蟲程序 |
| --- | --- |
## 內置 Spider 中間件參考
本頁描述了Scrapy附帶的所有 Spider 中間件組件。有關如何使用它們以及如何編寫自己的 Spider 中間件的信息,請參閱 [spider middleware usage guide](#topics-spider-middleware) .
有關默認啟用的組件列表(及其順序),請參見 [`SPIDER_MIDDLEWARES_BASE`](settings.html#std:setting-SPIDER_MIDDLEWARES_BASE) 設置。
### DepthMiddleware
```py
class scrapy.spidermiddlewares.depth.DepthMiddleware
```
DepthmIddleware用于跟蹤被擦除站點內每個請求的深度。它通過設置工作 `request.meta['depth'] = 0` 如果之前沒有設置值(通常只是第一個請求),則將其遞增1。
它可以用來限制要抓取的最大深度,根據深度控制請求優先級,等等。
這個 [`DepthMiddleware`](#scrapy.spidermiddlewares.depth.DepthMiddleware "scrapy.spidermiddlewares.depth.DepthMiddleware") 可以通過以下設置進行配置(有關詳細信息,請參閱設置文檔):
> * [`DEPTH_LIMIT`](settings.html#std:setting-DEPTH_LIMIT) -允許對任何網站進行爬網的最大深度。如果為零,則不施加限制。
> * [`DEPTH_STATS_VERBOSE`](settings.html#std:setting-DEPTH_STATS_VERBOSE) -是否收集每個深度的請求數。
> * [`DEPTH_PRIORITY`](settings.html#std:setting-DEPTH_PRIORITY) -是否根據請求的深度對其進行優先級排序。
### HttpErrorMiddleware
```py
class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
```
過濾掉不成功的(錯誤的)HTTP響應,這樣spider就不必處理它們了,而這些(大部分時間)會增加開銷,消耗更多的資源,并使spider邏輯更加復雜。
根據 [HTTP standard](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) ,成功的響應是狀態代碼在200-300范圍內的響應。
如果仍要處理超出該范圍的響應代碼,可以使用 `handle_httpstatus_list` Spider 屬性或 [`HTTPERROR_ALLOWED_CODES`](#std:setting-HTTPERROR_ALLOWED_CODES) 設置。
例如,如果您希望您的 Spider 處理404響應,可以這樣做:
```py
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]
```
這個 `handle_httpstatus_list` 關鍵 [`Request.meta`](request-response.html#scrapy.http.Request.meta "scrapy.http.Request.meta") 還可以用于指定每個請求允許哪些響應代碼。您也可以設置meta鍵 `handle_httpstatus_all` 到 `True` 如果您想允許請求的任何響應代碼。
不過,請記住,處理非200個響應通常是個壞主意,除非你真的知道自己在做什么。
[HTTP Status Code Definitions](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) .
#### httpErrorMiddleware設置
##### HTTPERROR_ALLOWED_CODES
違約: `[]`
通過此列表中包含非200狀態代碼的所有響應。
##### HTTPERROR_ALLOW_ALL
違約: `False`
傳遞所有響應,無論其狀態代碼如何。
### OffsiteMiddleware
```py
class scrapy.spidermiddlewares.offsite.OffsiteMiddleware
```
過濾掉對spider所覆蓋域之外的URL的請求。
這個中間件過濾掉主機名不在spider中的每個請求 [`allowed_domains`](spiders.html#scrapy.spiders.Spider.allowed_domains "scrapy.spiders.Spider.allowed_domains") 屬性。也允許列表中任何域的所有子域。例如規則 `www.example.org` 也將允許 `bob.www.example.org` 但不是 `www2.example.com` 也不 `example.com` .
當您的spider返回一個不屬于spider覆蓋的域的請求時,這個中間件將記錄一個與這個類似的調試消息:
```py
DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>
```
為了避免在日志中填充過多的噪聲,它將只為每個過濾后的新域打印其中一條消息。例如,如果另一個請求 `www.othersite.com` 已篩選,將不打印日志消息。但如果有人要求 `someothersite.com` 過濾后,將打印一條消息(但僅針對過濾后的第一個請求)。
如果 Spider 沒有定義 [`allowed_domains`](spiders.html#scrapy.spiders.Spider.allowed_domains "scrapy.spiders.Spider.allowed_domains") 屬性,或者屬性為空,異地中間件將允許所有請求。
如果請求具有 `dont_filter` 屬性集,非現場中間件將允許請求,即使其域未在允許的域中列出。
### RefererMiddleware
```py
class scrapy.spidermiddlewares.referer.RefererMiddleware
```
填充請求 `Referer` 頭,基于生成它的響應的URL。
#### ReferermIddleware設置
##### REFERER_ENABLED
0.15 新版功能.
違約: `True`
是否啟用引用中間件。
##### REFERRER_POLICY
1.4 新版功能.
違約: `'scrapy.spidermiddlewares.referer.DefaultReferrerPolicy'`
[Referrer Policy](https://www.w3.org/TR/referrer-policy) 填充請求“引用”頭時應用。
注解
您還可以使用特殊的 `"referrer_policy"` [Request.meta](request-response.html#topics-request-meta) 鍵,其可接受值與 `REFERRER_POLICY` 設置。
###### 推薦人政策的可接受值
* 或者是到 `scrapy.spidermiddlewares.referer.ReferrerPolicy` 子類-自定義策略或內置策略之一(參見下面的類)。
* 或標準W3C定義的字符串值之一,
* 或特殊 `"scrapy-default"` .
| 字符串值 | 類名(作為字符串) |
| --- | --- |
| `"scrapy-default"` (默認) | [`scrapy.spidermiddlewares.referer.DefaultReferrerPolicy`](#scrapy.spidermiddlewares.referer.DefaultReferrerPolicy "scrapy.spidermiddlewares.referer.DefaultReferrerPolicy") |
| ["no-referrer"](https://www.w3.org/TR/referrer-policy/#referrer-policy-no-referrer) | [`scrapy.spidermiddlewares.referer.NoReferrerPolicy`](#scrapy.spidermiddlewares.referer.NoReferrerPolicy "scrapy.spidermiddlewares.referer.NoReferrerPolicy") |
| ["no-referrer-when-downgrade"](https://www.w3.org/TR/referrer-policy/#referrer-policy-no-referrer-when-downgrade) | [`scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy`](#scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy "scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy") |
| ["same-origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-same-origin) | [`scrapy.spidermiddlewares.referer.SameOriginPolicy`](#scrapy.spidermiddlewares.referer.SameOriginPolicy "scrapy.spidermiddlewares.referer.SameOriginPolicy") |
| ["origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-origin) | [`scrapy.spidermiddlewares.referer.OriginPolicy`](#scrapy.spidermiddlewares.referer.OriginPolicy "scrapy.spidermiddlewares.referer.OriginPolicy") |
| ["strict-origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin) | [`scrapy.spidermiddlewares.referer.StrictOriginPolicy`](#scrapy.spidermiddlewares.referer.StrictOriginPolicy "scrapy.spidermiddlewares.referer.StrictOriginPolicy") |
| ["origin-when-cross-origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-origin-when-cross-origin) | [`scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy`](#scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy "scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy") |
| ["strict-origin-when-cross-origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin-when-cross-origin) | [`scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy`](#scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy "scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy") |
| ["unsafe-url"](https://www.w3.org/TR/referrer-policy/#referrer-policy-unsafe-url) | [`scrapy.spidermiddlewares.referer.UnsafeUrlPolicy`](#scrapy.spidermiddlewares.referer.UnsafeUrlPolicy "scrapy.spidermiddlewares.referer.UnsafeUrlPolicy") |
```py
class scrapy.spidermiddlewares.referer.DefaultReferrerPolicy
```
“降級時無引用”的變體,加上如果父請求正在使用,則不發送“引用”。 `file://` 或 `s3://` 方案。
警告
Scrapy的默認引用策略-就像 ["no-referrer-when-downgrade"](https://www.w3.org/TR/referrer-policy/#referrer-policy-no-referrer-when-downgrade) ,W3C推薦的瀏覽器值-將從任何 `http(s)://` 對任何 `https://` URL,即使域不同。
["same-origin"](https://www.w3.org/TR/referrer-policy/#referrer-policy-same-origin) 如果要刪除跨域請求的引用者信息,可能是更好的選擇。
```py
class scrapy.spidermiddlewares.referer.NoReferrerPolicy
```
[https://www.w3.org/tr/referer-policy/referer-policy-no-referer](https://www.w3.org/tr/referer-policy/referer-policy-no-referer)
最簡單的策略是“無引用”,它指定不將引用信息與從特定請求客戶機發出的請求一起發送到任何源站。標題將完全省略。
```py
class scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy
```
[https://www.w3.org/tr/referer-policy](https://www.w3.org/tr/referer-policy)/降級時沒有referer-policy
“降級時不引用”策略將完整的URL以及來自受TLS保護的環境設置對象的請求發送到可能值得信任的URL,以及來自不受TLS保護的客戶端的請求發送到任何源站。
另一方面,來自受TLS保護的客戶端對不可能可信的URL的請求將不包含引用者信息。將不發送引用HTTP頭。
如果沒有另外指定策略,這是用戶代理的默認行為。
注解
“降級時不引用”策略是W3C推薦的默認策略,主要Web瀏覽器使用該策略。
但是,它不是Scrapy的默認引用者策略(請參見 [`DefaultReferrerPolicy`](#scrapy.spidermiddlewares.referer.DefaultReferrerPolicy "scrapy.spidermiddlewares.referer.DefaultReferrerPolicy") )
```py
class scrapy.spidermiddlewares.referer.SameOriginPolicy
```
[https://www.w3.org/tr/referer-policy/referer-policy-same-origin](https://www.w3.org/tr/referer-policy/referer-policy-same-origin)
“同一來源”策略指定,當從特定請求客戶端發出同一來源請求時,刪除作為引用的完整URL作為引用信息發送。
另一方面,跨源請求將不包含引用者信息。將不發送引用HTTP頭。
```py
class scrapy.spidermiddlewares.referer.OriginPolicy
```
[https://www.w3.org/tr/referer-policy/referer-policy-origin](https://www.w3.org/tr/referer-policy/referer-policy-origin)
“來源”策略指定,在從特定請求客戶機發出相同的來源請求和跨來源請求時,僅將請求客戶機來源的ASCII序列化作為引用信息發送。
```py
class scrapy.spidermiddlewares.referer.StrictOriginPolicy
```
[https://www.w3.org/tr/referer-policy/referer-policy-strict-origin](https://www.w3.org/tr/referer-policy/referer-policy-strict-origin)
“strict來源”策略在發出請求時發送請求客戶端來源的ASCII序列化:從受TLS保護的環境設置對象發送到可能值得信任的URL,從不受TLS保護的環境設置對象發送到任何來源。
另一方面,來自受TLS保護的請求客戶端對不可能可信的URL的請求將不包含引用者信息。將不發送引用HTTP頭。
```py
class scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy
```
[https://www.w3.org/tr/referer-policy](https://www.w3.org/tr/referer-policy)/跨來源引用策略來源
“跨源站時的源站”策略指定,當從特定請求客戶機發出相同的源站請求時,剝離用作引用的完整URL作為引用信息發送,而在從特定請求客戶機發出跨源站請求時,僅將請求客戶機源站的ASCII序列化作為引用信息發送。請求客戶端。
```py
class scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy
```
[https://www.w3.org/tr/referer-policy](https://www.w3.org/tr/referer-policy)/跨來源時引用策略strict來源
“跨來源時strict來源”策略指定,當從特定請求客戶端發出同一來源請求時,剝離用作引用的完整URL作為引用信息發送,并且在發出跨來源請求時,僅將請求客戶端來源的ASCII序列化作為引用信息發送:
* 從受TLS保護的環境設置對象到可能值得信賴的URL,以及
* 從非TLS保護的環境設置對象到任何源站。
另一方面,來自受TLS保護的客戶端對不可能可信的URL的請求將不包含引用者信息。將不發送引用HTTP頭。
```py
class scrapy.spidermiddlewares.referer.UnsafeUrlPolicy
```
[https://www.w3.org/tr/referer-policy/referer-policy-unsafe-url](https://www.w3.org/tr/referer-policy/referer-policy-unsafe-url)
“不安全的URL”策略指定一個完整的URL,被剝離用作引用,與來自特定請求客戶端的跨源請求和同一源請求一起發送。
注意:保險單的名稱不是謊言,它是不安全的。此策略將泄漏從受TLS保護的資源到不安全源的源和路徑。仔細考慮為可能敏感的文檔設置此類策略的影響。
警告
不建議使用“不安全URL”策略。
### UrlLengthMiddleware
```py
class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
```
篩選出URL超過URL長度限制的請求
這個 [`UrlLengthMiddleware`](#scrapy.spidermiddlewares.urllength.UrlLengthMiddleware "scrapy.spidermiddlewares.urllength.UrlLengthMiddleware") 可以通過以下設置進行配置(有關詳細信息,請參閱設置文檔):
> * [`URLLENGTH_LIMIT`](settings.html#std:setting-URLLENGTH_LIMIT) -允許已爬網URL的最大URL長度。
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性