scrapy任務(wù)調(diào)度是基于文件系統(tǒng),這樣只能在單機執(zhí)行crawl。
scrapy-redis將待抓取request請求信息和數(shù)據(jù)items信息的存取放到redis queue里,使多臺服務(wù)器可以同時執(zhí)行crawl和items process,大大提升了數(shù)據(jù)爬取和處理的效率。
scrapy-redis是基于redis的scrapy組件,主要功能如下:
? 分布式爬蟲
多個爬蟲實例分享一個redis request隊列,非常適合大范圍多域名的爬蟲集群
? 分布式后處理
爬蟲抓取到的items push到一個redis items隊列,這就意味著可以開啟多個items processes來處理抓取到的數(shù)據(jù),比如存儲到Mongodb、Mysql
? 基于scrapy即插即用組件
Scheduler + Duplication Filter, Item Pipeline, Base Spiders.
scrapy原生架構(gòu)

調(diào)度器(Scheduler)
調(diào)度器維護request 隊列,每次執(zhí)行取出一個request。
Spiders
Spider是Scrapy用戶編寫用于分析response,提取item以及跟進額外的URL的類。每個spider負責處理一個特定(或一些)網(wǎng)站。
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、驗證數(shù)據(jù)及持久化(例如存取到數(shù)據(jù)庫中)。

如上圖所示,scrapy-redis在scrapy的架構(gòu)上增加了redis,基于redis的特性拓展了如下組件:
調(diào)度器(Scheduler)
scrapy-redis調(diào)度器通過redis的set不重復的特性,巧妙的實現(xiàn)了Duplication Filter去重(DupeFilter set存放爬取過的request)。
Spider新生成的request,將request的指紋到redis的DupeFilter set檢查是否重復,并將不重復的request push寫入redis的request隊列。
調(diào)度器每次從redis的request隊列里根據(jù)優(yōu)先級pop出一個request, 將此request發(fā)給spider處理。
Item Pipeline
將Spider爬取到的Item給scrapy-redis的Item Pipeline,將爬取到的Item存入redis的items隊列??梢院芊奖愕膹膇tems隊列中提取item,從而實現(xiàn)items processes 集群
總結(jié)
scrapy-redis巧妙的利用redis 實現(xiàn) request queue和 items queue,利用redis的set實現(xiàn)request的去重,將scrapy從單臺機器擴展多臺機器,實現(xiàn)較大規(guī)模的爬蟲集群