Spiders:
負責處理所有的response,從這裏面分析提取數據,獲取Item字段所需要的數據,並將需要跟進的URL提交給引擎,再次進入到Scheduler調度器中
Engine:
框架的核心,負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據的傳遞等
Scheduler:
它負責接受引擎發送過來的requests請求,並按照一定的方式進行整理隊列,當引擎需要的時候,交還給引擎
Downloader:
負責下載Engine發送過來的所有的requests請求,並將其獲取到的response交還給Engine,由Engine交給Spider來進行處理
ItemPipeline:
它負責處理Spider中獲取到的Item,並交給進行後期處理(詳細分析、過濾、存儲等)的地方
DownloaderMiddlewares(下載中間件):
介於Scrapy引擎和下載器之間的中間件,主要是處理Scrapy引擎與下載器之間的請求以及響應
SpiderMiddlewares(Spider中間件):
介於Scrapy引擎和爬蟲之間的中間件,主要工作是處理蜘蛛的響應輸入和請求輸出
SchedulerMiddlewares(調度中間件):
介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的響應和請求
執行順序:
- Spider的yield將requests發送給Engine
- Engine對requests不做任何的處理就發送給Scheduler
- Scheduler(url調度器),生成requests交給Engine
- Engine拿到requests,通過middleware進行層層過濾發送給Downloader
- downloader在網上獲取到response數據之後,又經過middleware進行層層過濾發送給Engine
- Engine獲取到response之後,返回給Spider,Spider的parse()方法對獲取到的response數據進行處理解析出items或者requests
- 將解析出來的items或者requests發送給Engine
- Engine獲取到items或者requests,將items發送給ITEMPIPELINES,將requests發送給Scheduler
只有當調度器中不存在任何的requests的時候,整個程序纔會停止(也就是說,對於下載失敗的URL,scrapy也會重新進行下載)
1.引擎:Hi!Spider, 你要處理哪一個網站? 2.Spider:老大要我處理xxxx.com(初始URL)。 3.引擎:你把第一個需要處理的URL給我吧。 4.Spider:給你,第一個URL是xxxxxxx.com。 5.引擎:Hi!調度器,我這有request請求你幫我排序入隊一下。 6.調度器:好的,正在處理你等一下。 7.引擎:Hi!調度器,把你處理好的request請求給我。 8.調度器:給你,這是我處理好的request 9.引擎:Hi!下載器,你按照老大的下載中間件的設置幫我下載一下這個request請求。 10.下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後引擎告訴調度器,這個request下載失敗了,你記錄一下,我們待會兒再下載) 11.引擎:Hi!Spider,這是下載好的東西,並且已經按照老大的下載中間件處理過了,你自己處理一下(注意!這兒responses默認是交給def parse()這個函數處理的) 12.Spider:(處理完畢數據之後對於需要跟進的URL),Hi!引擎,我這裏有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item數據。 13.引擎:Hi !管道 我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下。然後從第四步開始循環,直到獲取完老大需要全部信息。 14.管道、調度器:好的,現在就做!
開發Scrapy爬蟲的步驟
- 創建項目:scrapy startproject 項目名稱
- 明確目標:便攜item,明確你要爬取的目標
- 製作爬蟲:編寫爬蟲,開始爬取網頁
- 存儲內容:設計管道存儲爬取內容
- 添加啓動程序的文件:就是啓動的main文件
parse方法的工作機制:
- 因爲使用的是yield,而不是return。parse函數將會被當作一個生成器使用,scrapy回逐一獲取parse方法中生成的結果,並判斷該結果是一個什麼樣的類型
- 如果是requests則加入爬取隊列,如果是item類型則使用Pipeline處理,其他的就返回錯誤信息
- scrapy取到第一部分的requests不會立馬就去發送這個requests,只是把這個requests放到隊列裏,然後接着從生成器禮獲取
- 取盡第一部分的requests,然後在獲取第二部分的item,取到item之後,就會放到對應的pipeline裏進行處理
- parse方法作爲回調函數複製給了Request,指定parse方法來處理這些請求
- Request對象經過調度,執行生成scrapy.http.response()的響應對象,並送回給parse方法,直到調度器中沒有Request(遞歸的思路)
- 取完之後,parse方法工作結束,引擎再根據隊列和pipelines中的內容去執行相應的操作
- 程序在取得各個頁面的items之前,會先處理完之前所有的requests隊列裏的請求,然後在提取items
- 綜上所述一切,scrapy引擎和調度器將會負責到底