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

架構(gòu)概覽

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

概述

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

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

組件

Scrapy Engine

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

調(diào)度器(Scheduler)

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

下載器(Downloader)

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

Spiders

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

Item Pipeline

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

下載器中間件(Downloader middlewares)

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

Spider 中間件(Spider middlewares)

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

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

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

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

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

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

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