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ì)列為空