scrapy運行的整個流程

 

 

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引擎發送到調度的響應和請求

 

 

 

執行順序:

  1. Spider的yield將requests發送給Engine
  2. Engine對requests不做任何的處理就發送給Scheduler
  3. Scheduler(url調度器),生成requests交給Engine
  4. Engine拿到requests,通過middleware進行層層過濾發送給Downloader
  5. downloader在網上獲取到response數據之後,又經過middleware進行層層過濾發送給Engine
  6. Engine獲取到response之後,返回給Spider,Spider的parse()方法對獲取到的response數據進行處理解析出items或者requests
  7. 將解析出來的items或者requests發送給Engine
  8. 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爬蟲的步驟

  1. 創建項目:scrapy startproject 項目名稱
  2. 明確目標:便攜item,明確你要爬取的目標
  3. 製作爬蟲:編寫爬蟲,開始爬取網頁
  4. 存儲內容:設計管道存儲爬取內容
  5. 添加啓動程序的文件:就是啓動的main文件

 

parse方法的工作機制:

  1. 因爲使用的是yield,而不是return。parse函數將會被當作一個生成器使用,scrapy回逐一獲取parse方法中生成的結果,並判斷該結果是一個什麼樣的類型
  2. 如果是requests則加入爬取隊列,如果是item類型則使用Pipeline處理,其他的就返回錯誤信息
  3. scrapy取到第一部分的requests不會立馬就去發送這個requests,只是把這個requests放到隊列裏,然後接着從生成器禮獲取
  4. 取盡第一部分的requests,然後在獲取第二部分的item,取到item之後,就會放到對應的pipeline裏進行處理
  5. parse方法作爲回調函數複製給了Request,指定parse方法來處理這些請求
  6. Request對象經過調度,執行生成scrapy.http.response()的響應對象,並送回給parse方法,直到調度器中沒有Request(遞歸的思路)
  7. 取完之後,parse方法工作結束,引擎再根據隊列和pipelines中的內容去執行相應的操作
  8. 程序在取得各個頁面的items之前,會先處理完之前所有的requests隊列裏的請求,然後在提取items
  9. 綜上所述一切,scrapy引擎和調度器將會負責到底

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章