一凝赛、Scrapy簡介
-
概述
Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù)捆昏,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘寇仓,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中躺枕。其最初是為了 頁面抓取 (更確切來說, 網(wǎng)絡(luò)抓取 )所設(shè)計(jì)的, 也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如 Amazon Associates Web Services ) 或者通用的網(wǎng)絡(luò)爬蟲。
Scrapy 使用了 Twisted'tw?st?d異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊晌端,可以加快我們的下載速度泻骤,不用自己去實(shí)現(xiàn)異步框架,并且包含了各種中間件接口,可以靈活的完成各種需求。
- 官方文檔
// 中文文檔 版本較低(未完成,只更新了intro部分,請謹(jǐn)慎參考)
- Scrapy 1.0版本中文文檔
https://scrapy-chs.readthedocs.io/zh_CN/1.0/
- Scrapy 0.25 中文文檔
https://scrapy-chs.readthedocs.io/zh_CN/latest/
// 英文文檔 需要翻墻
http://doc.scrapy.org/en/latest
二兆沙、Scrapy流程
-
流程圖
Scrapy流程圖 -
Scrapy組件
Scrapy Engine(引擎): 負(fù)責(zé)Spider欧芽、ItemPipeline、Downloader葛圃、Scheduler中間的通訊千扔,信號、數(shù)據(jù)傳遞等库正。
Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過來的Request請求曲楚,并按照一定的方式進(jìn)行整理排列,入隊(duì)诀诊,當(dāng)引擎需要時(shí)洞渤,交還給引擎。
Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請求属瓣,并將其獲取到的Responses交還給Scrapy Engine(引擎)载迄,由引擎交給Spider來處理,
Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù)抡蛙,獲取Item字段需要的數(shù)據(jù)护昧,并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器)粗截,
Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item惋耙,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方.
Downloader Middlewares(下載中間件):你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件绽榛。
Spider Middlewares(Spider中間件):你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)
幫助剛?cè)腴T者的理解的運(yùn)行流程
1 引擎:Hi湿酸!Spider, 你要處理哪一個(gè)網(wǎng)站?
2 Spider:老大要我處理xxxx.com灭美。
3 引擎:你把第一個(gè)需要處理的URL給我吧推溃。
4 Spider:給你,第一個(gè)URL是xxxxxxx.com届腐。
5 引擎:Hi铁坎!調(diào)度器,我這有request請求你幫我排序入隊(duì)一下犁苏。
6 調(diào)度器:好的硬萍,正在處理你等一下。
7 引擎:Hi围详!調(diào)度器朴乖,把你處理好的request請求給我。
8 調(diào)度器:給你助赞,這是我處理好的request
9 引擎:Hi寒砖!下載器,你按照老大的下載中間件的設(shè)置幫我下載一下這個(gè)request請求
10 下載器:好的嫉拐!給你,這是下載好的東西魁兼。(如果失斖衽恰:sorry,這個(gè)request下載失敗了咐汞。然后引擎告訴調(diào)度器盖呼,這個(gè)request下載失敗了,你記錄一下化撕,我們待會(huì)兒再下載)
11 引擎:Hi几晤!Spider,這是下載好的東西植阴,并且已經(jīng)按照老大的下載中間件處理過了蟹瘾,你自己處理一下(注意!這兒responses默認(rèn)是交給def parse()這個(gè)函數(shù)處理的)
12 Spider:(處理完畢數(shù)據(jù)之后對于需要跟進(jìn)的URL)掠手,Hi憾朴!引擎,我這里有兩個(gè)結(jié)果喷鸽,這個(gè)是我需要跟進(jìn)的URL众雷,還有這個(gè)是我獲取到的Item數(shù)據(jù)。
13 引擎:Hi !管道 我這兒有個(gè)item你幫我處理一下砾省!調(diào)度器鸡岗!這是需要跟進(jìn)URL你幫我處理下。然后從第四步開始循環(huán)编兄,直到獲取完老大需要全部信息轩性。
14 管道``調(diào)度器:好的,現(xiàn)在就做翻诉!
-
運(yùn)行流程
1炮姨、Spider爬蟲部分發(fā)送請求,通過SpiderMiddleware中間層處理后發(fā)送給ENGINE引擎模塊
2碰煌、引擎模塊將請求發(fā)送給SCHEDULER模塊進(jìn)行調(diào)度
3舒岸、SCHEDULER模塊將可以執(zhí)行的請求調(diào)度給引擎模塊
4、引擎模塊將請求發(fā)送給DOWNLOADER下載模塊進(jìn)行下載芦圾,期間會(huì)經(jīng)過DownloadMiddleware中間件進(jìn)行處理
5蛾派、下載模塊將爬取好的網(wǎng)頁響應(yīng)經(jīng)過DownloaderMiddleware中間間處理后傳遞給引擎模塊
6、引擎模塊將響應(yīng)傳遞給Spider爬蟲模塊進(jìn)行解析
7个少、在爬蟲模塊我們自定義解析方式對響應(yīng)解析完成后生成Item對象或者新的Request對象洪乍,經(jīng)過SpidderMiddleware發(fā)送給引擎模塊
8、如果是Item對象傳遞給item和pipeline來進(jìn)行對應(yīng)的處理夜焦;如果是Request對象則繼續(xù)調(diào)度下載壳澳,重復(fù)之前的步驟。
注意茫经!只有當(dāng)調(diào)度器中不存在任何request了巷波,整個(gè)程序才會(huì)停止(對于下載失敗的URL,Scrapy也會(huì)重新下載)