Scrapy 框架的運(yùn)行流程(十六)

一、運(yùn)行流程

1、數(shù)據(jù)流

  • 下圖顯示了Scrapy框架的體系結(jié)構(gòu)及其組件,以及系統(tǒng)內(nèi)部發(fā)生的數(shù)據(jù)流(由紅色的箭頭顯示)
  • Scrapy中的數(shù)據(jù)流由執(zhí)行引擎控制,流程如下
    (1)首先從爬蟲(chóng)獲取初始的請(qǐng)求
    (2)將請(qǐng)求放入調(diào)度模塊,然后獲取下一個(gè)需要爬取的請(qǐng)求
    (3)調(diào)度模塊返回下一個(gè)需要爬取的請(qǐng)求給引擎
    (4)引擎將請(qǐng)求發(fā)送給下載器,依次穿過(guò)所有的下載中間件
    (5)一旦頁(yè)面下載完成,下載器會(huì)返回一個(gè)響應(yīng)包含了頁(yè)面數(shù)據(jù),然后再依次穿過(guò)所有的下載中間件。
    (6)引擎從下載器接收到響應(yīng),然后發(fā)送給爬蟲(chóng)進(jìn)行解析,依次穿過(guò)所有的爬蟲(chóng)中間件
    (7)爬蟲(chóng)處理接收到的響應(yīng),然后解析出item和生成新的請(qǐng)求,并發(fā)送給引擎
    (8)引擎將已經(jīng)處理好的item發(fā)送給管道組件,將生成好的新的請(qǐng)求發(fā)送給調(diào)度模塊,并請(qǐng)求下一個(gè)請(qǐng)求
    以上過(guò)程重復(fù),直到調(diào)度程序不再有請(qǐng)求為止。

2、組件介紹

  • Scrapy引擎
    引擎負(fù)責(zé)控制系統(tǒng)所有組件之間的數(shù)據(jù)流,并在發(fā)生某些操作時(shí)觸發(fā)事件。
  • 調(diào)度程序
    調(diào)度程序接收來(lái)自引擎的請(qǐng)求,將它們排入隊(duì)列,以便稍后引擎請(qǐng)求它們。
  • 下載器
    下載程序負(fù)責(zé)獲取web頁(yè)面并將它們提供給引擎,引擎再將它們提供給spider。
  • 爬蟲(chóng)
    爬蟲(chóng)是由用戶編寫(xiě)的自定義的類(lèi),用于解析響應(yīng),從中提取數(shù)據(jù),或其他要抓取的請(qǐng)求。
  • item管道
    管道負(fù)責(zé)在數(shù)據(jù)被爬蟲(chóng)提取后進(jìn)行后續(xù)處理。典型的任務(wù)包括清理,驗(yàn)證和持久性(如將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中)框架。它使用非阻塞(也成為異步)代碼實(shí)現(xiàn)并發(fā)。

3、中間件

(1)下載中間件

  • 下載中間件是位于引擎和下載器之間的特定的鉤子,它們處理從引擎?zhèn)鬟f到下載器的請(qǐng)求,以及下載器傳遞到引擎的響應(yīng)。
  • 如果你要執(zhí)行以下操作之一,請(qǐng)使用Downloader中間件:
    1、在請(qǐng)求發(fā)送到下載程序之前處理請(qǐng)求(即在scrapy將請(qǐng)求發(fā)送到網(wǎng)站之前)
    2、在響應(yīng)發(fā)送給爬蟲(chóng)之前
    3、直接發(fā)送新的請(qǐng)求,而不是將收到的響應(yīng)傳遞給蜘蛛
    4、將響應(yīng)傳遞給爬行器而不獲取web頁(yè)面;
    5、默默的放棄一些請(qǐng)求

(2)爬蟲(chóng)中間件

  • 爬蟲(chóng)中間件是位于引擎和爬蟲(chóng)之間的特定的鉤子,能夠處理傳入的響應(yīng)和傳遞出去的item和請(qǐng)求。
  • 如果你需要以下操作請(qǐng)使用爬蟲(chóng)中間件:
    1、處理爬蟲(chóng)回調(diào)之后的 請(qǐng)求或item
    2、處理start_requests
    3、處理爬蟲(chóng)異常
    4、根據(jù)響應(yīng)內(nèi)容調(diào)用errback而不是回調(diào)請(qǐng)求

(3)事件驅(qū)動(dòng)的網(wǎng)絡(luò)
scrapy 是用Twisted編寫(xiě)的,Twisted是一個(gè)流行的事件驅(qū)動(dòng)的Python網(wǎng)絡(luò)框架。它使用非阻塞(也稱(chēng)為異步)代碼實(shí)現(xiàn)并發(fā)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本主題主要是scrapy入門(mén),包含內(nèi)容如下:??1. Scrapy框架環(huán)境搭建;??2. 理解scrapy框架結(jié)...
    楊強(qiáng)AT南京閱讀 1,530評(píng)論 0 10
  • 說(shuō)起寫(xiě)爬蟲(chóng),大多數(shù)第一時(shí)間想到的就是python了。python語(yǔ)法簡(jiǎn)潔明了,加上及其豐富好用的庫(kù),用它來(lái)寫(xiě)爬蟲(chóng)有...
    瘋狂的哈丘閱讀 8,364評(píng)論 1 15
  • Scrapy的架構(gòu)太重要了,單用一篇文章再總結(jié)整合下。前兩張圖來(lái)自《Learning Scrapy》,第三張圖來(lái)自...
    SeanCheney閱讀 2,870評(píng)論 2 5
  • 用電防火安全管理制度 一、用電防火安全管理應(yīng)明確用電防火安全管理的責(zé)任部門(mén)和責(zé)任人。 二、采購(gòu)電氣、電熱設(shè)備,應(yīng)選...
    Hey有你真好閱讀 2,294評(píng)論 0 3
  • 剛剛打完卡,發(fā)現(xiàn)昨天竟然沒(méi)打卡,昨天本該有大把的時(shí)間,已經(jīng)把背單詞強(qiáng)度降到最低,如何做到每日三省吾身呢? 列出計(jì)劃...
    Albert陳凱閱讀 238評(píng)論 0 0

友情鏈接更多精彩內(nèi)容