# 體系結構概述
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
本文描述了Scrapy的體系結構及其組件如何交互。
## 概述
下圖顯示了Scrapy架構及其組件的概述,以及系統內部發生的數據流的概要(以紅色箭頭顯示)。下面提供了這些組件的簡要說明以及有關它們的詳細信息的鏈接。數據流也描述如下。
## 數據流
[](../_images/scrapy_architecture_02.png)
Scrapy中的數據流由執行引擎控制,如下所示:
1. 這個 [Engine](#component-engine) 獲取要從 [Spider](#component-spiders) .
2. 這個 [Engine](#component-engine) 在中安排請求 [Scheduler](#component-scheduler) 并請求下一個要爬行的請求。
3. 這個 [Scheduler](#component-scheduler) 將下一個請求返回到 [Engine](#component-engine) .
4. 這個 [Engine](#component-engine) 將請求發送到 [Downloader](#component-downloader) ,通過 [Downloader Middlewares](#component-downloader-middleware) (見 [`process_request()`](downloader-middleware.html#scrapy.downloadermiddlewares.DownloaderMiddleware.process_request "scrapy.downloadermiddlewares.DownloaderMiddleware.process_request") )
5. 一旦頁面完成下載, [Downloader](#component-downloader) 生成響應(使用該頁)并將其發送到引擎,并通過 [Downloader Middlewares](#component-downloader-middleware) (見 [`process_response()`](downloader-middleware.html#scrapy.downloadermiddlewares.DownloaderMiddleware.process_response "scrapy.downloadermiddlewares.DownloaderMiddleware.process_response") )
6. 這個 [Engine](#component-engine) 接收來自的響應 [Downloader](#component-downloader) 并發送到 [Spider](#component-spiders) 用于處理,通過 [Spider Middleware](#component-spider-middleware) (見 [`process_spider_input()`](spider-middleware.html#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_input") )
7. 這個 [Spider](#component-spiders) 處理響應并向 [Engine](#component-engine) ,通過 [Spider Middleware](#component-spider-middleware) (見 [`process_spider_output()`](spider-middleware.html#scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output "scrapy.spidermiddlewares.SpiderMiddleware.process_spider_output") )
8. 這個 [Engine](#component-engine) 將已處理的項目發送到 [Item Pipelines](#component-pipelines) ,然后將已處理的請求發送到 [Scheduler](#component-scheduler) 并請求可能的下一個爬行請求。
9. 該過程重復(從步驟1開始),直到不再有來自 [Scheduler](#component-scheduler) .
## 組件
### 抓取式發動機
引擎負責控制系統所有組件之間的數據流,并在發生某些操作時觸發事件。見 [Data Flow](#data-flow) 有關詳細信息,請參閱上面的部分。
### 調度程序
調度器接收來自引擎的請求,并將它們排隊,以便在引擎請求時(也向引擎)提供這些請求。
### 下載器
下載者負責獲取網頁并將其送入引擎,引擎反過來又將網頁送入 Spider 。
### Spider
spider是由scraphy用戶編寫的自定義類,用于解析響應并從中提取項目(也稱為scraped項)或后續的附加請求。有關詳細信息,請參閱 [Spider](spiders.html#topics-spiders) .
### 項目管道
項目管道負責處理被 Spider 提取(或 Scrape)的項目。典型的任務包括清理、驗證和持久性(如將項目存儲在數據庫中)。有關詳細信息,請參閱 [項目管道](item-pipeline.html#topics-item-pipeline) .
### 下載器中心件
下載器中間件是位于引擎和下載器之間的特定Hook,當它們從引擎傳遞到下載器時處理請求,以及從下載器傳遞到引擎的響應。
如果需要執行以下操作之一,請使用下載器中間件:
* 在將請求發送給下載者之前處理該請求(即在Scrapy將請求發送到網站之前);
* 變更在傳遞給spider之前收到響應;
* 發送新的請求,而不是將收到的響應傳遞給spider;
* 在不獲取網頁的情況下將響應傳遞給 Spider ;
* 悄悄地放棄一些請求。
有關詳細信息,請參閱 [下載器中間件](downloader-middleware.html#topics-downloader-middleware) .
### Spider 中心件
Spider 中間件是位于引擎和 Spider 之間的特定Hook,能夠處理 Spider 的輸入(響應)和輸出(項目和請求)。
如果需要,使用 Spider 中間件
* post-process output of spider callbacks - change/add/remove requests or items;
* 后處理啟動請求;
* 處理spider異常;
* 對一些基于響應內容的請求調用errback,而不是回調。
有關詳細信息,請參閱 [Spider 中間件](spider-middleware.html#topics-spider-middleware) .
## 事件驅動的網絡
Scrapy是用 [Twisted](https://twistedmatrix.com/trac/) 是一個流行的事件驅動的python網絡框架。因此,它使用非阻塞(即異步)代碼實現并發性。
有關異步編程和扭曲的更多信息,請參閱以下鏈接:
* [Introduction to Deferreds in Twisted](https://twistedmatrix.com/documents/current/core/howto/defer-intro.html)
* [Twisted - hello, asynchronous programming](http://jessenoller.com/blog/2009/02/11/twisted-hello-asynchronous-programming/)
* [Twisted Introduction - Krondo](http://krondo.com/an-introduction-to-asynchronous-programming-and-twisted/)
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性