Scrapy專題

一般所說的爬蟲工作分為兩個(gè)部分,downoader 和 parser:

downloader輸入是url列表,輸出抓取到的rawdata,可能時(shí)候是html源代碼,也可能是json,xml格式的數(shù)據(jù)。

parser輸入是第一部分輸出的rawdata,根據(jù)已知的規(guī)則提取所需的info

圖1. 簡單爬蟲

圖1所示的是最簡單的爬蟲,不考慮解析url,并把rawdata中的url提取做進(jìn)一步提取,并假設(shè)預(yù)先知道抓取的所有的url,而且抓到的網(wǎng)頁的parser(提取規(guī)則)是相同的。

---------------------------------------------------------------------------------------------------------------------------

重新回到主角scrapy

下面是摘取的scrapy文檔中的抓取流程圖

官方文檔中對圖中的每個(gè)components如下:

scrapy engine 【scrapy引擎】

引擎控制系統(tǒng)中的數(shù)據(jù)流,當(dāng)某些情況發(fā)生時(shí),觸發(fā)事件。

scheduler 【調(diào)度器】

調(diào)度器接受引擎發(fā)送過來的request對象【可簡單理解成抓取任務(wù)】并把他們?nèi)腙?duì)列,等待的引擎在適當(dāng)時(shí)刻提取出這些request并把它們通過下載中間件交給downloader去做下載。

Downloader【下載器】

Downloader根據(jù)request對象中的地址獲取網(wǎng)頁內(nèi)容告知引擎下載結(jié)果,并把網(wǎng)頁內(nèi)容傳送給spider組件

Spiders【解析器】

Spiders是開發(fā)人員主要接觸的組件,開發(fā)人員通過在這里coding,從raw網(wǎng)頁中提取出所需的數(shù)據(jù)并存入item【數(shù)據(jù)原單元,一個(gè)item代表一項(xiàng)數(shù)據(jù)對象,使用者自己定義item包含的數(shù)據(jù)項(xiàng)】或者提取出新的抓取request對象【新的抓取任務(wù)】 一個(gè)爬蟲負(fù)責(zé)一個(gè)指定domain列表下的網(wǎng)頁

ItemPipeline【item管道】

item管道負(fù)責(zé)處理爬蟲吐出的item,包括數(shù)據(jù)清理,驗(yàn)證,保存

DownloaderMiddleware【下載中間件】

【工作原理很像一般mvc框架中的攔截器或者behavior,開發(fā)者可以在某些步驟之間插入自己的處理邏輯】有了中間件,開發(fā)這可以在engine向downloader傳request任務(wù)之間,或者,在downloader下載完畢,向engine吐回response對象的時(shí)候?qū)equest,或者resonse插入custom code

Spider milldleware【解析器中間件】

spider middleware是引擎和spider之間的hook程序【攔截器】,用來處理spider的輸入【response】和輸出【item and requests】

【這兩類中間件為開發(fā)者提供了非常便利的擴(kuò)展scrapy的方式】

scrapy的數(shù)據(jù)流有engine【類似于mvc框架中的controller】指揮,如下:

1. engine打開一個(gè)domain,定位spider代碼的位置,獲取最初的urls【start_urls,暫叫‘種子’】,拿到Request對象

2. 拿到這些最初的Request對象,并把他們交給scheduler,enqueue到scheduler負(fù)責(zé)的任務(wù)隊(duì)列中

3. engine向scheduler索取下一個(gè)要下載的request【url】

4. scheduler收到請求后,從任務(wù)隊(duì)列中pop出一個(gè)request,并feed給engine,engine收到后,將抓取任務(wù)發(fā)送給downloader,這些request將通過downloader middlewares【scrapy默認(rèn)會開啟很多內(nèi)置的downloader】

5. 當(dāng)downloader下載完畢后,downloader生成一個(gè)Response對象并通過downloader middlerware傳遞給engine

6. engine拿到reponse后,通過spidermiddleware將response交給spider做解析工作

7. spider解析response,將解析出來的item和新的Request【新的抓取任務(wù)】交給engine

8. engine將拿到的item交給pipeline處理,將新的Request按照第2步驟發(fā)送給scheduler

9. 程序會在2-8之間循環(huán)直至scheduler中的任務(wù)隊(duì)列為空

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

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

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