閱讀本文的前提是你已經對scrapy有了基本的認識,或是已經使用scrapy寫過數據抓取項目。數據庫
scrapy框架由多個組件組合而成,要採集的數據通過網絡響應後返回流過各個組件,通過一些處理(如格式校驗,過濾去重,異常數據拋棄),最終保存到指定的文件或數據庫中。網絡
下面是scrapy data flow 圖,你們應該不陌生吧。併發
scrapy的數據流由執行引擎控制,各個組件的運行也是有執行引擎調度驅動運行的。框架
(1)第1步,肯定好咱們要採集的網站後,咱們會在start_urls或者start_requests方法中構造最初的數據抓取連接。執行引擎ENGINE經過讀取SPIDERS模塊的start_urls或start_requests方法的初始連接構形成request對象(網絡請求對象)。scrapy
(2)第2步,request對象被引擎加入到SCHEDULER調度器的調度隊列中,等待被調度。函數
(3)第3步,引擎獲取一個request對象,併發起網絡請求,在請求到達下載器以前,會先通過download middleware(下載器中間件),常見的下載器中間件有代理中間件,重試中間件,請求頭中間件。下載中間件負責修改request對象(好比換個請求頭,第4步)和處理response對象(好比將請求失敗的request對象從新丟到調度器中等待下次的調度,第5步)。DOWNLOADER(下載器)就是負責發起請求並獲取網站的響應。網站
(4)第6步,引擎獲取網站的響應後,交給SPIDERS模塊的回調函數去解析數據。第7步,而後引擎獲取解析後的數據。第8步,引擎將數據交給ITEM PIPELINES模塊處理數據,常見的處理有驗證數據格式是否符合要求,數據是否重複,保存數據等。url
以上。代理
最後,咱們在閱讀框架源碼的時候也要注意常常去回顧數據流的流向,有助於加深對scrapy的理解。中間件