Scrapy 是一個(gè)用 Python 實(shí)現(xiàn)的為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)的應(yīng)用框架。
Scrapy 使用Twisted異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊。
使用 Scrapy 框架可以高效(爬取效率和開發(fā)效率)完成網(wǎng)站數(shù)據(jù)爬取任務(wù)。
一、Scrapy架構(gòu)圖(箭頭指示的是數(shù)據(jù)流向)

架構(gòu)圖1

架構(gòu)圖2
- Scrapy Engine(引擎): 負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler中間的通訊,傳遞信號(hào)、數(shù)據(jù)等。
- Scheduler(調(diào)度器): 負(fù)責(zé)接受引擎發(fā)送過來的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列,入隊(duì),當(dāng)引擎需要時(shí),交還給引擎。
- Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
- Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler。
- Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方。
- Downloader Middlewares(下載中間件):自定義擴(kuò)展引擎和下載中間的組件。
- Spider Middlewares(爬蟲中間件):自定義擴(kuò)展、操作引擎和爬蟲中間通信的功能組件。
二、Scrapy的運(yùn)作流程
代碼寫好,程序開始運(yùn)行...
- 引擎:Hi!Spider, 你要處理哪一個(gè)網(wǎng)站?
- Spider:老大要我處理xxxx.com。
- 引擎:你把第一個(gè)需要處理的URL給我吧。
- Spider:給你,第一個(gè)URL是xxxxxxx.com。
- 引擎:Hi!調(diào)度器,我這有request請(qǐng)求你幫我排序入隊(duì)一下。
- 調(diào)度器:好的,正在處理你等一下。
- 引擎:Hi!調(diào)度器,把你處理好的request請(qǐng)求給我。
- 調(diào)度器:給你,這是我處理好的request。
- 引擎:Hi!下載器,你按照老大的下載中間件的設(shè)置幫我下載一下這個(gè)request請(qǐng)求。
- 下載器:好的!給你,這是下載好的東西。(如果失?。簊orry,這個(gè)request下載失敗了。然后引擎告訴調(diào)度器,這個(gè)request下載失敗了,你記錄一下,我們待會(huì)兒再下載)
- 引擎:Hi!Spider,這是下載好的東西,并且已經(jīng)按照老大的下載中間件處理過了,你自己處理一下。(注意!這兒responses默認(rèn)是交給parse()這個(gè)函數(shù)處理的)
- Spider:(處理完畢數(shù)據(jù)之后對(duì)于需要跟進(jìn)的URL) Hi!引擎,我這里有兩個(gè)結(jié)果,這個(gè)是我需要跟進(jìn)的URL,還有這個(gè)是我獲取到的Item數(shù)據(jù)。
- 引擎:Hi !管道,我這兒有個(gè)item你幫我處理一下;Hi !調(diào)度器,這是需要跟進(jìn)URL你幫我處理下。然后從第四步開始循環(huán),直到獲取完老大需要全部信息。
- 管道調(diào)度器:好的,現(xiàn)在就做!
注意:只有當(dāng)調(diào)度器中不存在任何request了,整個(gè)程序才會(huì)停止,也就是說,對(duì)于下載失敗的URL,Scrapy也會(huì)重新下載,且會(huì)自動(dòng)去重,所以不會(huì)重復(fù)下載。
三、安裝Scrapy框架:
- 通過‘pip install scrapy’即可安裝
- 如果在windows下,還需要安裝‘pypwin32’庫
- 如果在ubuntu下,還需要安裝一些第三方庫:python-dev、python-pip、libxml2-dev、libxslt1-dev、zlib1g-dev、libffi-dev、libssl-dev。
四、制作 Scrapy 爬蟲的步驟:
- 新建爬蟲項(xiàng)目:新建一個(gè)項(xiàng)目和爬蟲
創(chuàng)建項(xiàng)目:scrapy startproject [項(xiàng)目名]
創(chuàng)建爬蟲:進(jìn)入項(xiàng)目所在路徑,然后執(zhí)行命令:scrapy genspider [爬蟲名] [爬蟲的域]
注意:項(xiàng)目名和爬蟲名不能相同 - 明確目標(biāo) (編寫items.py):明確你想要抓取的目標(biāo)
- 制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網(wǎng)頁
- 存儲(chǔ)內(nèi)容 (pipelines.py):設(shè)計(jì)管道存儲(chǔ)爬取內(nèi)容
五、爬蟲項(xiàng)目的目錄結(jié)構(gòu):
- items.py:用來存放爬蟲爬取的數(shù)據(jù)的模型
- middlewares.py:用來存放各種中間件的文件
- pipelines.py:用來將items的模型存儲(chǔ)到本地磁盤
- settings.py:存儲(chǔ)本爬蟲的一些配置信息,比如:請(qǐng)求頭、ip代理池等
- spiders目錄:存儲(chǔ)所有的爬蟲代碼
- scrapy.cfg:項(xiàng)目的配置文件