1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Scrapy 源碼剖析:架構(gòu)概覽

        共 2643字,需瀏覽 6分鐘

         ·

        2021-02-10 02:36

        在爬蟲(chóng)開(kāi)發(fā)領(lǐng)域,使用最多的主流語(yǔ)言主要是 Java 和 Python 這兩種,如果你經(jīng)常使用 Python 開(kāi)發(fā)爬蟲(chóng),那么肯定聽(tīng)說(shuō)過(guò) Scrapy 這個(gè)開(kāi)源框架,它正是由Python編寫(xiě)的。
        Scrapy 在開(kāi)源爬蟲(chóng)框架中名聲非常大,幾乎用 Python 寫(xiě)爬蟲(chóng)的人,都用過(guò)這個(gè)框架。而且業(yè)界很多開(kāi)源的爬蟲(chóng)框架都是模仿和參考 Scrapy 的思想和架構(gòu)實(shí)現(xiàn)的,如果想深入學(xué)習(xí)爬蟲(chóng),研讀 Scrapy 的源碼還是很有必要的。
        從這篇文章開(kāi)始,我就和你分享一下當(dāng)時(shí)我在做爬蟲(chóng)時(shí),閱讀 Scrapy 源碼的思路和經(jīng)驗(yàn)總結(jié)。
        這篇文章我們先來(lái)介紹一下 Scrapy 的整體架構(gòu),從宏觀層面上學(xué)習(xí)一下 Scrapy 運(yùn)行的流程。之后的幾篇文章,我會(huì)帶你深入到每個(gè)模塊,剖析這個(gè)框架的實(shí)現(xiàn)細(xì)節(jié)。

        介紹

        首先,我們先來(lái)看一下 Scrapy 的官方是如何介紹它的。從官方網(wǎng)站,我們可以看到 Scrapy 如下定義。
        Scrapy 是一個(gè)基于 Python 語(yǔ)言編寫(xiě)的開(kāi)源爬蟲(chóng)框架,它可以幫你快速、簡(jiǎn)單的方式構(gòu)建爬蟲(chóng),并從網(wǎng)站上提取你所需要的數(shù)據(jù)。
        也就是說(shuō),使用 Scrapy 能幫你快速簡(jiǎn)單的編寫(xiě)一個(gè)爬蟲(chóng),用來(lái)抓取網(wǎng)站數(shù)據(jù)。
        本篇文章不再介紹 Scrapy 的安裝和使用,這個(gè)系列主要通過(guò)閱讀源碼講解 Scrapy 的實(shí)現(xiàn)思路,關(guān)于如何安裝和使用的問(wèn)題,請(qǐng)參考官方網(wǎng)站官方文檔學(xué)習(xí)。(注:寫(xiě)本篇文章時(shí),Scrapy 版本為1.2,雖然版本有些低,但與最新版的實(shí)現(xiàn)思路基本沒(méi)有很大出入。)
        使用 Scrapy 開(kāi)發(fā)一個(gè)爬蟲(chóng)非常簡(jiǎn)單,這里使用 Scrapy 官網(wǎng)上的例子來(lái)說(shuō)明如何編寫(xiě)一個(gè)簡(jiǎn)單爬蟲(chóng):

        簡(jiǎn)單來(lái)講,編寫(xiě)和運(yùn)行一個(gè)爬蟲(chóng)只需以下幾步:
        1. 使用?scrapy startproject?命令創(chuàng)建一個(gè)爬蟲(chóng)模板,或自己按模板編寫(xiě)爬蟲(chóng)代碼
        2. 定義一個(gè)爬蟲(chóng)類(lèi),并繼承?scrapy.Spider,然后重寫(xiě)?parse?方法
        3. parse?方法里編寫(xiě)網(wǎng)頁(yè)解析邏輯,以及抓取路徑
        4. 使用?scrapy runspider ?運(yùn)行這個(gè)爬蟲(chóng)
        可見(jiàn),使用 Scrapy 編寫(xiě)簡(jiǎn)單的幾行代碼,就能采集到一個(gè)網(wǎng)站頁(yè)面的數(shù)據(jù),非常方便。
        但是在這背后到底發(fā)生了什么?Scrapy 到底是如何幫助我們工作的呢?

        架構(gòu)

        要想知道 Scrapy 是如何工作的,首先我們來(lái)看一下 Scrapy 的架構(gòu)圖,從宏觀角度來(lái)了解一下它是如何運(yùn)行的:

        核心模塊

        從架構(gòu)圖可以看到,Scrapy 主要包含以下五大模塊:
        • Scrapy Engine:核心引擎,負(fù)責(zé)控制和調(diào)度各個(gè)組件,保證數(shù)據(jù)流轉(zhuǎn);
        • Scheduler:負(fù)責(zé)管理任務(wù)、過(guò)濾任務(wù)、輸出任務(wù)的調(diào)度器,存儲(chǔ)、去重任務(wù)都在此控制;
        • Downloader:下載器,負(fù)責(zé)在網(wǎng)絡(luò)上下載數(shù)據(jù),輸入待下載的 URL,輸出下載結(jié)果;
        • Spiders:我們自己編寫(xiě)的爬蟲(chóng)邏輯,定義抓取意圖;
        • Item Pipeline:負(fù)責(zé)輸出結(jié)構(gòu)化數(shù)據(jù),可自定義格式和輸出的位置;
        如果你觀察地比較仔細(xì)的話,可以看到還有兩個(gè)模塊:
        • Downloader middlewares:介于引擎和下載器之間,可以在網(wǎng)頁(yè)在下載前、后進(jìn)行邏輯處理;
        • Spider middlewares:介于引擎和爬蟲(chóng)之間,在向爬蟲(chóng)輸入下載結(jié)果前,和爬蟲(chóng)輸出請(qǐng)求 / 數(shù)據(jù)后進(jìn)行邏輯處理;
        了解了這些核心模塊,我們?cè)賮?lái)看使用 Scrapy 時(shí),它內(nèi)部的采集流程是如何流轉(zhuǎn)的,也就是說(shuō)各個(gè)模塊是如何交互協(xié)作,來(lái)完成整個(gè)抓取任務(wù)的。

        運(yùn)行流程

        按照上面架構(gòu)圖標(biāo)識(shí)出的序號(hào),我們可以看到,Scrapy 運(yùn)行時(shí)的數(shù)據(jù)流轉(zhuǎn)大概是這樣的:
        1. 引擎自定義爬蟲(chóng)中獲取初始化請(qǐng)求(也叫種子 URL);
        2. 引擎把該請(qǐng)求放入調(diào)度器中,同時(shí)調(diào)度器向引擎獲取待下載的請(qǐng)求;
        3. 調(diào)度器把待下載的請(qǐng)求發(fā)給引擎;
        4. 引擎發(fā)送請(qǐng)求給下載器,中間會(huì)經(jīng)過(guò)一系列下載器中間件
        5. 這個(gè)請(qǐng)求通過(guò)下載器下載完成后,生成一個(gè)響應(yīng)對(duì)象,返回給引擎,這中間會(huì)再次經(jīng)過(guò)一系列下載器中間件;
        6. 引擎接收到下載器返回的響應(yīng)后,發(fā)送給爬蟲(chóng),中間會(huì)經(jīng)過(guò)一系列爬蟲(chóng)中間件,最后執(zhí)行爬蟲(chóng)自定義的解析邏輯
        7. 爬蟲(chóng)執(zhí)行完自定義的解析邏輯后,生成結(jié)果對(duì)象新的請(qǐng)求對(duì)象給引擎,再次經(jīng)過(guò)一系列爬蟲(chóng)中間件
        8. 引擎把爬蟲(chóng)返回的結(jié)果對(duì)象交由結(jié)果處理器處理,把新的請(qǐng)求通過(guò)引擎再交給調(diào)度器
        9. 重復(fù)執(zhí)行1-8,直到調(diào)度器中沒(méi)有新的請(qǐng)求處理,任務(wù)結(jié)束;

        核心模塊的協(xié)作

        可見(jiàn),Scrapy 的架構(gòu)圖還是比較清晰的,各個(gè)模塊之間互相協(xié)作,完成抓取任務(wù)。
        我在讀完它的源碼后,整理出了一個(gè)更詳細(xì)的核心模塊交互圖,其中展示了更多模塊的相關(guān)細(xì)節(jié),你可以參考一下:

        這里需要說(shuō)明一下圖中的?Scrapyer?模塊,其實(shí)這也是 Scrapy 的一個(gè)核心模塊,但官方的架構(gòu)圖中沒(méi)有展示出來(lái)。這個(gè)模塊其實(shí)是處于?EngineSpiders、Pipeline?之間,是連接這 3 個(gè)模塊的橋梁,我會(huì)在后面的源碼分析文章中具體講到。

        核心類(lèi)圖

        另外,在讀源碼的過(guò)程中,我還整理了這些核心模塊的類(lèi)圖,這對(duì)于你學(xué)習(xí)源碼會(huì)有很大的幫助。

        對(duì)于這個(gè)核心類(lèi)圖簡(jiǎn)單解釋一下:
        • 沒(méi)有樣式的黑色文字是類(lèi)的核心屬性
        • 標(biāo)有黃色樣式的高亮文字是類(lèi)的核心方法;
        你在讀源碼的過(guò)程中,可以針對(duì)這些核心屬性和方法重點(diǎn)關(guān)注。
        結(jié)合官方架構(gòu)圖以及我總結(jié)的核心模塊交互圖、核心類(lèi)圖,我們可以看到,Scrapy 涉及到的組件主要包括以下這些。
        • 五大核心類(lèi):Scrapy Engine、SchedulerDownloader、Spiders、Item Pipeline
        • 四個(gè)中間件管理器類(lèi):DownloaderMiddlewareManager、SpiderMiddlewareManager、ItemPipelineMiddlewareManagerExtensionManager
        • 其他輔助類(lèi):Request、ResponseSelector
        我們先對(duì) Scrapy 整個(gè)架構(gòu)有一個(gè)初步認(rèn)識(shí),在接下來(lái)的文章里,我會(huì)針對(duì)上述的這些類(lèi)和方法進(jìn)行更加詳細(xì)的源碼講解。


        更多閱讀



        2020 年最佳流行 Python 庫(kù) Top 10


        2020 Python中文社區(qū)熱門(mén)文章 Top 10


        5分鐘快速掌握 Python 定時(shí)任務(wù)框架

        特別推薦




        點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

        瀏覽 46
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            男女网站在线看 | 五月激情视频 | 91精品国产入口在线 | 丰满的少妇 | 欧美黄色片在线观看 | 俺去搞也 | 和闺蜜互玩小豆豆高潮了 | 亚洲AV在线免费观看 | 穴诱惑P| 揉我胸啊嗯~下面出 |