Scrapy原始碼閱讀分析_1_整體框架和流程介紹
From:https://blog.csdn.net/weixin_37947156/article/details/74435304
Scrapy github 下載地址:https://github.com/scrapy/scrapy
介紹
Scrapy是一個基於Python編寫的一個開源爬蟲框架,它可以幫你快速、簡單的方式構建爬蟲,並從網站上提取你所需要的資料。
這裡不再介紹Scrapy的安裝和使用,本系列主要通過閱讀原始碼講解Scrapy實現思路為主。
如果有不懂如何使用的同學,請參考官方網站或官方文件學習。
------------------------------------------------------------------------------------------
scrapy 中文文件 和 scrapy 英文文件參照看。因為中文文件比較老,英文文件是最新的。
scrapy 英文文件:https://doc.scrapy.org/en/latest
scrapy 中文文件:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
高效能爬蟲 Scrapy 框架:https://www.cnblogs.com/wwg945/articles/9021888.html
------------------------------------------------------------------------------------------
簡單來說構建和執行一個爬蟲只需完成以下幾步:
- 使用 scrapy startproject spider_project 建立爬蟲模板或自己編寫爬蟲指令碼
- 爬蟲類 繼承 scrapy.Spider,重寫 parse 方法
- parse 方法中 yield 或 return 字典、Request、Item
- 使用 scrapy crawl <spider_name> 或 scrapy runspider <spider_file.py>執行
經過簡單的幾行程式碼,就能採集到某個網站下一些頁面的資料,非常方便。
但是在這背後到底發生了什麼?Scrapy到底是如何幫助我們工作的呢?
架構
來看一看 Scrapy 的架構圖:
核心元件
Scrapy有以下幾大元件:
- Scrapy Engine:核心引擎,負責控制和排程各個元件,保證資料流轉;
- Scheduler:負責管理任務、過濾任務、輸出任務的排程器,儲存、去重任務都在此控制;
- Downloader:下載器,負責在網路上下載網頁資料,輸入待下載URL,輸出下載結果;
- Spiders:使用者自己編寫的爬蟲指令碼,可自定義抓取意圖;
- Item Pipeline:負責輸出結構化資料,可自定義輸出位置;
除此之外,還有兩大中介軟體元件:
- Downloader middlewares:介於引擎和下載器之間,可以在網頁在下載前、後進行邏輯處理;
- Spider middlewares:介於引擎和爬蟲之間,可以在呼叫爬蟲輸入下載結果和輸出請求/資料時進行邏輯處理;
資料流轉
按照架構圖的序號,資料流轉大概是這樣的:
- 引擎從自定義爬蟲中獲取初始化請求(也叫種子URL);
- 引擎把該請求放入排程器中,同時引擎向排程器獲取一個待下載的請求(這兩部是非同步執行的);
- 排程器返回給引擎一個待下載的請求;
- 引擎傳送請求給下載器,中間會經過一系列下載器中介軟體;
- 這個請求通過下載器下載完成後,生成一個響應物件,返回給引擎,這中間會再次經過一系列下載器中介軟體;
- 引擎接收到下載返回的響應物件後,然後傳送給爬蟲,執行自定義爬蟲邏輯,中間會經過一系列爬蟲中介軟體;
- 爬蟲執行對應的回撥方法,處理這個響應,完成使用者邏輯後,會生成結果物件或新的請求物件給引擎,再次經過一系列爬蟲中介軟體;
- 引擎把爬蟲返回的結果物件交由結果處理器處理,把新的請求物件通過引擎再交給排程器;
- 從1開始重複執行,直到排程器中沒有新的請求處理;
核心元件互動圖
我在讀完原始碼後,整理出一個更詳細的架構圖,其中展示了更多相關元件的細節:
這裡需要說明一下圖中的Scrapyer
,其實這也是在原始碼的一個核心類,但官方架構圖中沒有展示出來,這個類其實是處於Engine
、Spiders
、Pipeline
之間,是連通這3個元件的橋樑,後面在文章中會具體講解。
核心類圖
涉及到的一些核心類如下:
其中標沒有樣式的黑色文字是類的核心屬性,黃色樣式的文字都是核心方法。
可以看到,Scrapy的核心類,其實主要包含5大元件、4大中介軟體管理器、爬蟲類和爬蟲管理器、請求、響應物件和資料解析類這幾大塊。
相關文章
- Scrapy原始碼閱讀分析_2_啟動流程原始碼
- DM 原始碼閱讀系列文章(二)整體架構介紹原始碼架構
- Scrapy原始碼閱讀分析_4_請求處理流程原始碼
- Scrapy原始碼閱讀分析_3_核心元件原始碼元件
- Scrapy框架的使用之Scrapy框架介紹框架
- 如何閱讀框架原始碼框架原始碼
- 微信MMKV原始碼分析(一) | 整體流程原始碼
- TiDB 原始碼閱讀系列文章(十)Chunk 和執行框架簡介TiDB原始碼框架
- TiCDC 原始碼閱讀(二)TiKV CDC 模組介紹原始碼
- QuickTask動態指令碼支援框架整體介紹篇UI指令碼框架
- Scrapy 框架介紹之 Puppeteer 渲染框架
- snabbdom 原始碼閱讀分析原始碼
- Vuex原始碼閱讀分析Vue原始碼
- Spring原始碼閱讀-ApplicationContext體系結構分析Spring原始碼APPContext
- DISCUZ原始碼分析流程詳細介紹【admin.php入口】原始碼PHP
- 【原始碼閱讀】AndPermission原始碼閱讀原始碼
- OkHttp 原始碼剖析系列(二)——攔截器整體流程分析HTTP原始碼
- Spring原始碼分析——spring原始碼之obtainFreshBeanFactory()介紹Spring原始碼AIBean
- PostgreSQL 原始碼解讀(122)- MVCC#7(提交事務-整體流程)SQL原始碼MVCC#
- 爬蟲代理 Scrapy 框架詳細介紹 2爬蟲框架
- Android平臺架構的介紹和原始碼分析Android架構原始碼
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- Appdash原始碼閱讀——RecentStore和LimitStoreAPP原始碼MIT
- DM 原始碼閱讀系列文章(三)資料同步處理單元介紹原始碼
- Laravel 原始碼閱讀指南 -- 使用者認證系統 (基礎介紹)Laravel原始碼
- Spring原始碼分析——spring原始碼核心方法refresh()介紹Spring原始碼
- Scrapy框架簡介框架
- spring cloud gateway 原始碼解析(1)整體流程SpringCloudGateway原始碼
- Fabric 1.0原始碼分析(9)configtx(配置交易)體系介紹原始碼
- 【原始碼閱讀】Glide原始碼閱讀之load方法(二)原始碼IDE
- 第 23 期 Drone 簡單介紹和部分原始碼分析原始碼
- mybatis原理,配置介紹及原始碼分析MyBatis原始碼
- Flutter Dio原始碼分析(一)--Dio介紹Flutter原始碼
- gin原始碼閱讀之一 – net/http的大概流程原始碼HTTP
- iOS開發原始碼閱讀篇--FMDB原始碼分析1(FMResultSet)iOS原始碼
- iOS開發原始碼閱讀篇--FMDB原始碼分析2(FMResultSet)iOS原始碼
- UiAutomator2 原理介紹 + 原始碼走讀UI原始碼