以經(jīng)典的Scrapy框架為例,一起學(xué)學(xué)爬蟲的架構(gòu)。
作者:mickelfeng
原文:https://my.oschina.net/mickelfeng/blog/726460
最近在學(xué) Python ,同時(shí)也在學(xué)如何使用 python 抓取數(shù)據(jù),于是就被我發(fā)現(xiàn)了這個(gè)非常受歡迎的 Python 抓取框架 Scrapy ,下面一起學(xué)習(xí)下 Scrapy 的架構(gòu),便于更好的使用這個(gè)工具。
一、概述
下圖顯示了 Scrapy 的大體架構(gòu),其中包含了它的主要組件及系統(tǒng)的數(shù)據(jù)處理流程(綠色箭頭所示)。下面就來一個(gè)個(gè)解釋每個(gè)組件的作用及數(shù)據(jù)的處理過程。
另外推薦一篇自己造輪子的爬蟲教程:
二、組件
1、 Scrapy Engine ( Scrapy 引擎)
Scrapy 引擎是用來控制整個(gè)系統(tǒng)的數(shù)據(jù)處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。更多的詳細(xì)內(nèi)容可以看下面的數(shù)據(jù)處理流程。
2、 Scheduler (調(diào)度)
調(diào)度程序從 Scrapy 引擎接受請(qǐng)求并排序列入隊(duì)列,并在 Scrapy 引擎發(fā)出請(qǐng)求后返還給他們。
3、 Downloader (下載器)
下載器的主要職責(zé)是抓取網(wǎng)頁并將網(wǎng)頁內(nèi)容返還給蜘蛛 \ ( Spiders\ )。
4、 Spiders (蜘蛛)
蜘蛛是有 Scrapy 用戶自己定義用來解析網(wǎng)頁并抓取制定 URL 返回的內(nèi)容的類,每個(gè)蜘蛛都能處理一個(gè)域名或一組域名。換句話說就是用來定義特定網(wǎng)站的抓取和解析規(guī)則。
蜘蛛的整個(gè)抓取流程(周期)是這樣的:
首先獲取第一個(gè) URL 的初始請(qǐng)求,當(dāng)請(qǐng)求返回后調(diào)取一個(gè)回調(diào)函數(shù)。第一個(gè)請(qǐng)求是通過調(diào)用 start_requests\ ( \ )方法。該方法默認(rèn)從 start_urls 中的 Url 中生成請(qǐng)求,并執(zhí)行解析來調(diào)用回調(diào)函數(shù)。
在回調(diào)函數(shù)中,你可以解析網(wǎng)頁響應(yīng)并返回項(xiàng)目對(duì)象和請(qǐng)求對(duì)象或兩者的迭代。這些請(qǐng)求也將包含一個(gè)回調(diào),然后被 Scrapy 下載,然后有指定的回調(diào)處理。
在回調(diào)函數(shù)中,你解析網(wǎng)站的內(nèi)容,同程使用的是 Xpath 選擇器(但是你也可以使用 BeautifuSoup , lxml 或其他任何你喜歡的程序),并生成解析的數(shù)據(jù)項(xiàng)。
最后,從蜘蛛返回的項(xiàng)目通常會(huì)進(jìn)駐到項(xiàng)目管道。
5、 Item Pipeline (項(xiàng)目管道)
項(xiàng)目管道的主要責(zé)任是負(fù)責(zé)處理有蜘蛛從網(wǎng)頁中抽取的項(xiàng)目,他的主要任務(wù)是清晰、驗(yàn)證和存儲(chǔ)數(shù)據(jù)。當(dāng)頁面被蜘蛛解析后,將被發(fā)送到項(xiàng)目管道,并經(jīng)過幾個(gè)特定的次序處理數(shù)據(jù)。每個(gè)項(xiàng)目管道的組件都是有一個(gè)簡(jiǎn)單的方法組成的 Python 類。他們獲取了項(xiàng)目并執(zhí)行他們的方法,同時(shí)他們還需要確定的是是否需要在項(xiàng)目管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。
項(xiàng)目管道通常執(zhí)行的過程有:
清洗 HTML 數(shù)據(jù)
驗(yàn)證解析到的數(shù)據(jù)(檢查項(xiàng)目是否包含必要的字段)
檢查是否是重復(fù)數(shù)據(jù)(如果重復(fù)就刪除)
將解析到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中
6、 Downloader middlewares (下載器中間件)
下載中間件是位于 Scrapy 引擎和下載器之間的鉤子框架,主要是處理 Scrapy 引擎與下載器之間的請(qǐng)求及響應(yīng)。它提供了一個(gè)自定義的代碼的方式來拓展 Scrapy 的功能。下載中間器是一個(gè)處理請(qǐng)求和響應(yīng)的鉤子框架。他是輕量級(jí)的,對(duì) Scrapy 盡享全局控制的底層的系統(tǒng)。
7、 Spider middlewares (蜘蛛中間件)
蜘蛛中間件是介于 Scrapy 引擎和蜘蛛之間的鉤子框架,主要工作是處理蜘蛛的響應(yīng)輸入和請(qǐng)求輸出。它提供一個(gè)自定義代碼的方式來拓展 Scrapy 的功能。蛛中間件是一個(gè)掛接到 Scrapy 的蜘蛛處理機(jī)制的框架,你可以插入自定義的代碼來處理發(fā)送給蜘蛛的請(qǐng)求和返回蜘蛛獲取的響應(yīng)內(nèi)容和項(xiàng)目。
8、 Scheduler middlewares (調(diào)度中間件)
調(diào)度中間件是介于 Scrapy 引擎和調(diào)度之間的中間件,主要工作是處從 Scrapy 引擎發(fā)送到調(diào)度的請(qǐng)求和響應(yīng)。他提供了一個(gè)自定義的代碼來拓展 Scrapy 的功能。
三、數(shù)據(jù)處理流程
Scrapy 的整個(gè)數(shù)據(jù)處理流程有 Scrapy 引擎進(jìn)行控制,其主要的運(yùn)行方式為:
引擎打開一個(gè)域名,時(shí)蜘蛛處理這個(gè)域名,并讓蜘蛛獲取第一個(gè)爬取的 URL 。
引擎從蜘蛛那獲取第一個(gè)需要爬取的 URL ,然后作為請(qǐng)求在調(diào)度中進(jìn)行調(diào)度。
引擎從調(diào)度那獲取接下來進(jìn)行爬取的頁面。
調(diào)度將下一個(gè)爬取的 URL 返回給引擎,引擎將他們通過下載中間件發(fā)送到下載器。
當(dāng)網(wǎng)頁被下載器下載完成以后,響應(yīng)內(nèi)容通過下載中間件被發(fā)送到引擎。
引擎收到下載器的響應(yīng)并將它通過蜘蛛中間件發(fā)送到蜘蛛進(jìn)行處理。
蜘蛛處理響應(yīng)并返回爬取到的項(xiàng)目,然后給引擎發(fā)送新的請(qǐng)求。
引擎將抓取到的項(xiàng)目項(xiàng)目管道,并向調(diào)度發(fā)送請(qǐng)求。
系統(tǒng)重復(fù)第二部后面的操作,直到調(diào)度中沒有請(qǐng)求,然后斷開引擎與域之間的聯(lián)系。
四、驅(qū)動(dòng)器
Scrapy是由Twisted寫的一個(gè)受歡迎的Python事件驅(qū)動(dòng)網(wǎng)絡(luò)框架,它使用的是非堵塞的異步處理。如果要獲得更多關(guān)于異步編程和Twisted的信息,請(qǐng)參考下面兩條鏈接。
題圖:pexels,CC0 授權(quán)。
點(diǎn)擊閱讀原文,查看更多 Python 教程和資源。
閱讀原文:http://mp.weixin.qq.com/s?__biz=MzAwNDc0MTUxMw==&mid=2649639866&idx=1&sn=336c89db5b6044278c9ce6670e450608&chksm=833dab5cb44a224a5f4960af589bfdec338b3b41008050549e00ef9e4f26c6b9f262d68ded91#rd