鍍金池/ 教程/ Python/ 架構(gòu)概覽
Benchmarking
命令行工具(Command line tools)
下載器中間件(Downloader Middleware)
信號(Signals)
Telnet 終端(Telnet Console)
初窺 Scrapy
數(shù)據(jù)收集(Stats Collection)
Scrapyd
通用爬蟲(Broad Crawls)
Item Loaders
試驗階段特性
Scrapy 入門教程
自動限速(AutoThrottle)擴展
Settings
Scrapy 終端(Scrapy shell)
下載項目圖片
DjangoItem
調(diào)試(Debugging)Spiders
選擇器(Selectors)
Feed exports
Spiders Contracts
借助 Firefox 來爬取
Logging
Spiders
Ubuntu 軟件包
實踐經(jīng)驗(Common Practices)
安裝指南
Item Exporters
擴展(Extensions)
Items
Spider 中間件(Middleware)
異常(Exceptions)
例子
發(fā)送 email
架構(gòu)概覽
常見問題(FAQ)
Jobs:暫停,恢復(fù)爬蟲
核心 API
使用 Firebug 進行爬取
Item Pipeline
Link Extractors
Web Service
調(diào)試內(nèi)存溢出

架構(gòu)概覽

本文檔介紹了 Scrapy 架構(gòu)及其組件之間的交互。

概述

接下來的圖表展現(xiàn)了 Scrapy 的架構(gòu),包括組件及在系統(tǒng)中發(fā)生的數(shù)據(jù)流的概覽(綠色箭頭所示)。下面對每個組件都做了簡單介紹,并給出了詳細內(nèi)容的鏈接。數(shù)據(jù)流如下所描述。

http://wiki.jikexueyuan.com/project/scrapy/images/4.png" alt="" />

組件

Scrapy Engine

引擎負責(zé)控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動,并在相應(yīng)動作發(fā)生時觸發(fā)事件。 詳細內(nèi)容查看下面的數(shù)據(jù)流(Data Flow)部分。

調(diào)度器(Scheduler)

調(diào)度器從引擎接受 request 并將他們?nèi)腙?,以便之后引擎請求他們時提供給引擎。

下載器(Downloader)

下載器負責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給 spider。

Spiders

Spider 是 Scrapy 用戶編寫用于分析 response 并提取 item(即獲取到的 item)或額外跟進的 URL 的類。 每個 spider 負責(zé)處理一個特定(或一些)網(wǎng)站。更多內(nèi)容請看 Spiders。

Item Pipeline

Item Pipeline 負責(zé)處理被 spider 提取出來的 item。典型的處理有清理、驗證及持久化(例如存取到數(shù)據(jù)庫中)。更多內(nèi)容查看 Item Pipeline。

下載器中間件(Downloader middlewares)

下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理 Downloader 傳遞給引擎的 response。 其提供了一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 功能。更多內(nèi)容請看下載器中間件(Downloader Middleware)。

Spider 中間件(Spider middlewares)

Spider 中間件是在引擎及 Spider 之間的特定鉤子(specific hook),處理 spider 的輸入(response)和輸出(items 及 requests)。其提供了一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 功能。更多內(nèi)容請看 Spider 中間件(Middleware)。

數(shù)據(jù)流(Data flow)

Scrapy 中的數(shù)據(jù)流由執(zhí)行引擎控制,其過程如下:

  1. 引擎打開一個網(wǎng)站(open a domain),找到處理該網(wǎng)站的 Spider 并向該 spider 請求第一個要爬取的 URL(s)。
  2. 引擎從 Spider 中獲取到第一個要爬取的 URL 并在調(diào)度器(Scheduler)以 Request 調(diào)度。
  3. 引擎向調(diào)度器請求下一個要爬取的 URL。
  4. 調(diào)度器返回下一個要爬取的 URL 給引擎,引擎將 URL 通過下載中間件(請求(request)方向)轉(zhuǎn)發(fā)給下載器(Downloader)。
  5. 一旦頁面下載完畢,下載器生成一個該頁面的 Response,并將其通過下載中間件(返回(response)方向)發(fā)送給引擎。
  6. 引擎從下載器中接收到 Response 并通過 Spider 中間件(輸入方向)發(fā)送給 Spider 處理。
  7. Spider 處理 Response 并返回爬取到的 Item 及(跟進的)新的 Request 給引擎。
  8. 引擎將(Spider 返回的)爬取到的 Item 給 Item Pipeline,將(Spider 返回的)Request 給調(diào)度器。
  9. (從第二步)重復(fù)直到調(diào)度器中沒有更多地 request,引擎關(guān)閉該網(wǎng)站。

事件驅(qū)動網(wǎng)絡(luò)(Event-driven networking)

Scrapy 基于事件驅(qū)動網(wǎng)絡(luò)框架 Twisted 編寫。因此,Scrapy 基于并發(fā)性考慮由非阻塞(即異步)的實現(xiàn)。

關(guān)于異步編程及 Twisted 更多的內(nèi)容請查看下列鏈接:

上一篇:Link Extractors下一篇:Scrapy 入門教程