部分內容轉自:http://www.kuqin.com/system-analysis/20110906/264417.html
一、概述
顯示了Scrapy的大體架構,其中包含了它的主要組件及系統的資料處理流程(綠色箭頭所示)。下面就來一個個解釋每個組件的作用及資料的處理過程。
二、組件
1、Scrapy Engine(Scrapy引擎)
Scrapy引擎是用來控制整個系統的資料處理流程,並進行交易處理的觸發。更多的詳細內容可以看下面的資料處理流程。
2、Scheduler(調度)
發送器從Scrapy引擎接受請求並排序列入隊列,並在Scrapy引擎發出請求後返還給他們。
3、Downloader(下載器)
下載器的主要職責是抓取網頁並將網頁內容返還給蜘蛛( Spiders)。
4、Spiders(蜘蛛)
蜘蛛是有Scrapy使用者自己定義用來解析網頁並抓取制定URL返回的內容的類,每個蜘蛛都能處理一個網域名稱或一組網域名稱。換句話說就是用來定義特定網站的抓取和解析規則。
蜘蛛的整個抓取流程(周期)是這樣的:
- 首先擷取第一個URL的初始請求,當請求返回後調取一個回呼函數。第一個請求是通過調用start_requests()方法。該方法預設從start_urls中的Url中產生請求,並執行解析來調用回呼函數。
- 在回呼函數中,你可以解析網頁響應並返回項目對象和請求對象或兩者的迭代。這些請求也將包含一個回調,然後被Scrapy下載,然後有指定的回調處理。
- 在回呼函數中,你解析網站的內容,同程使用的是Xpath選取器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜歡的程式),並產生解析的資料項目。
- 最後,從蜘蛛返回的項目通常會進駐到項目管道。
5、Item Pipeline(項目管道)
項目管道的主要責任是負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和儲存資料。當頁面被蜘蛛解析後,將被發送到項目管道,並經過幾個特定的次序處理資料。每個項目管道的組件都是有一個簡單的方法組成的Python類。他們擷取了項目並執行他們的方法,同時他們還需要確定的是是否需要在項目管道中繼續執行下一步或是直接丟棄掉不處理。
項目管道通常執行的過程有:
- 清洗HTML資料
- 驗證解析到的資料(檢查項目是否包含必要的欄位)
- 檢查是否是重複資料(如果重複就刪除)
- 將解析到的資料存放區到資料庫中
6、Downloader middlewares(下載器中介軟體)
下載中介軟體是位於Scrapy引擎和下載器之間的鉤子架構,主要是處理Scrapy引擎與下載器之間的請求及響應。它提供了一個自訂的代碼的方式來拓展Scrapy的功能。下載中間器是一個處理請求和響應的鉤子架構。他是輕量級的,對Scrapy盡享全域控制的底層的系統。
7、Spider middlewares(蜘蛛中介軟體)
蜘蛛中介軟體是介於Scrapy引擎和蜘蛛之間的鉤子架構,主要工作是處理蜘蛛的響應輸入和請求輸出。它提供一個自訂代碼的方式來拓展Scrapy的功能。蛛中介軟體是一個掛接到Scrapy的蜘蛛處理機制的架構,你可以插入自訂的代碼來處理髮送給蜘蛛的請求和返回蜘蛛擷取的響應內容和項目。
8、Scheduler middlewares(調度中介軟體)
調度中介軟體是介於Scrapy引擎和調度之間的中介軟體,主要工作是處從Scrapy引擎發送到調度的請求和響應。他提供了一個自訂的代碼來拓展Scrapy的功能。
三、資料處理流程
Scrapy的整個資料處理流程有Scrapy引擎進行控制,其主要的運行方式為:
- 引擎開啟一個網域名稱,時蜘蛛處理這個網域名稱,並讓蜘蛛擷取第一個爬取的URL。
- 引擎從蜘蛛那擷取第一個需要爬取的URL,然後作為請求在調度中進行調度。
- 引擎從調度那擷取接下來進行爬取的頁面。
- 調度將下一個爬取的URL返回給引擎,引擎將他們通過下載中介軟體發送到下載器。
- 當網頁被下載器下載完成以後,響應內容通過下載中介軟體被發送到引擎。
- 引擎收到下載器的響應並將它通過蜘蛛中介軟體發送到蜘蛛進行處理。
- 蜘蛛處理響應並返回爬取到的項目,然後給引擎發送新的請求。
- 引擎將抓取到的項目項目管道,並向調度發送請求。
- 系統重複第二部後面的操作,直到調度中沒有請求,然後斷開引擎與域之間的聯絡。
四、磁碟機
Scrapy是由Twisted寫的一個受歡迎的Python事件驅動網路架構,它使用的是非堵塞的非同步處理。如果要獲得更多關於非同步編程和Twisted的資訊,請參考下面兩條連結。
五、安裝出錯以及解決方案:
NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' needs to be available.
ERROR: /bin/sh: xslt-config: not found
** make sure the development packages of libxml2 and libxslt are installed **
Using build configuration of libxslt
src/lxml/lxml.etree.c:4: fatal error: Python.h: 沒有那個檔案或目錄
compilation terminated.
error: Setup script exited with error: command 'gcc' failed with exit status 1
解決方案:
sudo apt-get install gccsudo apt-get install python-devsudo apt-get install libxml2 libxml2-devsudo apt-get install libxslt1.1 libxslt1-dev
再次運行安裝命令即可:
sudo easy_install -U -Scrapysudo pip install Scrapy
六、參考資料:
1、官方網站文檔:http://scrapy.org/doc/
2、代碼參考樣本:http://snipplr.com/all/tags/scrapy/