首頁  >  文章  >  後端開發  >  Scrapy底層架構探索與原始碼解析

Scrapy底層架構探索與原始碼解析

WBOY
WBOY原創
2023-06-22 19:58:381103瀏覽

Scrapy底層架構探索與原始碼解析

Scrapy是一個基於Python的高效Web爬蟲框架,能夠快速、簡單地從網頁中抽取數據,支援資料儲存和匯出格式多樣化,成為了很多爬蟲愛好者和開發者的首選框架。 Scrapy在底層實作上採用了非同步I/O模型及中介軟體機制,使得其運作效率更高、可擴充性更強。在這篇文章中,我們將從底層架構和原始碼解析兩方面來探索Scrapy的實作方式。

一、Scrapy的底層架構

Scrapy的底層架構主要分為引擎(Engine)、調度器(Scheduler)、下載器(Downloader)、爬蟲(Spider)和管道(Pipeline )等五個模組。它們在Scrapy中各司其職,協同工作,使整個爬取過程流暢高效。

  1. 引擎(Engine)

Scrapy的引擎作為整個爬蟲框架的核心,負責協調各個模組之間的交互,並處理各個模組之間的事件和訊號.當引擎接收到爬蟲開啟訊號時,它會在調度器中獲取一個要爬取的Request對象,然後將該對象發送給下載器進行下載,下載器下載完成後將返回的Response對象發送給引擎,引擎會先將Response物件交給Spider解析,並根據Spider回傳的結果產生新的Request對象,然後再將新的Request物件傳送給調度器。這個過程會一直循環執行,知道調度器佇列為空時,爬蟲才會結束。

2.調度器(Scheduler)

調度器用於儲存並管理所有等待爬取的Request對象,負責安排他們的請求順序。它會對Request物件進行去重和去掉優先權較低的請求。當引擎需要取得下一個要爬取的Request物件時,就會呼叫調度器的方法進行取得。每當有Request物件被下載完成後,下載器會將其傳回的Response物件與對應的Request物件交給調度器,調度器會將其儲存到請求佇列中。

3.下載器(Downloader)

下載器主要用於將引擎傳遞過來的Request對象轉換成Response對象,並將其傳回給引擎。下載器會透過發送HTTP或HTTPS請求,向指定的URL位址取得對應的網頁內容。下載器也提供了一些下載的中間件,在下載的過程中可以添加一些自訂的處理,例如代理、UA標識、Cookie處理等。

4.爬蟲(Spider)

爬蟲模組是實際的爬取邏輯,主要負責解析下載的網頁內容,並將解析的結果封裝成Item對象,再將Item對象返回給引擎。爬蟲模組通常需要編寫自訂的爬蟲類,並且需要重寫一些方法來進行頁面解析、Item物件的封裝和Request物件的生成等。

5.管道(Pipeline)

管道模組用於對Spider傳回的Item物件進行一系列的處理,例如資料清洗、去重、儲存到資料庫或檔案等。在Scrapy中,可以編寫多個管道類,並按照優先順序將其組成一個管道鏈,當Spider返回Item物件時,這些管道會按照順序進行處理。

二、Scrapy的源碼解析

  1. Spider類

#Spider類是Scrapy中最為核心的一個類,它是所有自訂爬蟲類的基類,包含了爬取流程的主要實作方法。

首先,我們需要在我們的爬蟲類別中定義一些屬性,例如name、allowed_domains、start_urls等。這些屬性用來指定爬蟲的名稱、允許爬取的網域名稱和起始爬取的URL位址。

透過重寫start_requests()方法,我們可以產生第一批請求,並將其交給引擎進行爬取。

接著,我們需要定義parse()方法,主要用於解析下載的網頁內容,包括提取資料、產生新的Request物件等。 parse()方法會被引擎調用,在該方法中會一步步解析網頁,最終會傳回Item物件或新的Request物件。

  1. Item類別

在Scrapy中,Item類別用於封裝從網頁中抽取的數據,其實就是一個字典物件。 Item物件中可以提供各種類型的資料字段,並在爬蟲中實現簡單的資料處理邏輯,例如資料清洗、資料映射等。 Item物件最終會被回傳給引擎,並依序經過Pipeline管線處理。

  1. Settings模組

Settings模組用於設定Scrapy的設定訊息,包括爬蟲的名稱、請求延遲、並發數、下載逾時等。透過修改Settings模組中的選項可以改變Scrapy的運作方式。在爬蟲的程式碼中,可以透過爬蟲類中的settings屬性存取到Settings模組。 Settings模組中所有的選項都是以字典的形式進行保存的,我們可以直接在程式碼中修改Settings模組中的選項值,也可以從檔案中讀取設定資訊。

  1. Downloader Middleware(下載中間件)

Scrapy中的下載中間件可以攔截下載器發起的請求和接收的回應,可以對請求或回應進行修改,新增代理、UA標識、Cookie等。 Scrapy支援多個中間件,可以依照優先順序依序執行。中介軟體透過重寫process_request()、process_response()或process_exception()方法進行攔截和處理。

  1. Spider Middleware(Spider中間件)

Spider中間件用於攔截Spider的輸入和輸出,它包括了攔截請求的Downloader Middleware和攔截回應的Spider Middleware兩部分。中間件透過重寫process_spider_input()和process_spider_output()方法進行攔截和處理。

Scrapy框架非常強大,可以適應各種各樣的網站,提供了豐富的功能和擴展接口,非常適合進行大規模、高效、穩定的Web資料抓取。但同時,Scrapy也有自己的一些不足,例如對JavaScript渲染的網站抓取支援不足、對AJAX即時請求的支援不足等,這些都需要結合其他工具一起協同工作。

以上是Scrapy底層架構探索與原始碼解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn