Scrapy-7.Scrapy-redis

本文地址:http://www.reibang.com/p/3de01adfff23

簡介

scrapy-redis是一個基于Redis的Scrapy組件惶我。其主要有以下特性:

  • 分布式抓取數(shù)據(jù)

    你可以讓多個爬蟲實例使用同一個Redis隊列笑陈,非常適合廣泛的多域抓取。

  • 分布式處理數(shù)據(jù)

    抓取到的Items會被推送到redis隊列中,這意味著你可以通過共享的items隊列,按照需求自行決定后期處理數(shù)據(jù)的數(shù)量棠赛。

  • 即插即用

    提供的Scheduler + Duplication, Item Pipeline, Base Spiders組件都是即插即用凭疮,非常方便饭耳。

其構(gòu)建分布式的方案采用的是master-slave的方式,大概的原理是所有在slave上生成的url执解,都會被遠程發(fā)送到master寞肖,然后在master上使用Redis數(shù)據(jù)庫來存儲需要抓取的url隊列。slave要獲取下一個抓取的url衰腌,也是遠程從master獲得新蟆。

通過這種方式,就實現(xiàn)了所有Spider抓取的地址統(tǒng)一由master調(diào)度右蕊,并保存到Redis中的set琼稻,這樣實現(xiàn)了斷點續(xù)爬功能。

并且scrapy-redis會將所有抓取過的地址生成指紋并保存下來饶囚,由此可以避免url的重復(fù)抓取欣簇。

安裝

scrapy-redis是基于Redis的,所以在使用之前需要先安裝Redis數(shù)據(jù)庫坯约。

如果配置分布式熊咽,那么需要把redis的遠程連接打開,以及配置好訪問密碼闹丐。

scrapy-redis模塊的安裝比較簡單横殴,用pip安裝即可。

pip install scrapy-redis

Scrapy-redis用法

在安裝scrapy-redis完畢之后卿拴,我們只需要在Scrapy項目中添加一些配置選項就可以啟用scrapy-redis組件了衫仑。

# Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# Default requests serializer is pickle, but it can be changed to any module
# with loads and dumps functions. Note that pickle is not compatible between
# python versions.
# Caveat: In python 3.x, the serializer must return strings keys and support
# bytes as values. Because of this reason the json or msgpack module will not
# work by default. In python 2.x there is no such issue and you can use
# 'json' or 'msgpack' as serializers.
#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"

# Don't cleanup redis queues, allows to pause/resume crawls.
#SCHEDULER_PERSIST = True

# Schedule requests using a priority queue. (default)
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'

# Alternative queues.
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

# Max idle time to prevent the spider from being closed when distributed crawling.
# This only works if queue class is SpiderQueue or SpiderStack,
# and may also block the same time when your spider start at the first time (because the queue is empty).
#SCHEDULER_IDLE_BEFORE_CLOSE = 10

# Store scraped item in redis for post-processing.
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}

# The item pipeline serializes and stores the items in this redis key.
#REDIS_ITEMS_KEY = '%(spider)s:items'

# The items serializer is by default ScrapyJSONEncoder. You can use any
# importable path to a callable object.
#REDIS_ITEMS_SERIALIZER = 'json.dumps'

# Specify the host and port to use when connecting to Redis (optional).
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379

# Specify the full Redis URL for connecting (optional).
# If set, this takes precedence over the REDIS_HOST and REDIS_PORT settings.
#REDIS_URL = 'redis://user:pass@hostname:9001'

# Custom redis client parameters (i.e.: socket timeout, etc.)
#REDIS_PARAMS  = {}
# Use custom redis client class.
#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'

# If True, it uses redis' ``SPOP`` operation. You have to use the ``SADD``
# command to add URLs to the redis queue. This could be useful if you
# want to avoid duplicates in your start urls list and the order of
# processing does not matter.
#REDIS_START_URLS_AS_SET = False

# Default start urls key for RedisSpider and RedisCrawlSpider.
#REDIS_START_URLS_KEY = '%(name)s:start_urls'

# Use other encoding than utf-8 for redis.
#REDIS_ENCODING = 'latin1'

以上列出來的配置語句,選擇需要配置的部分堕花,復(fù)制到Scrapy項目的settings.py文件中即可文狱。

核心組件

如果要啟用scrapy-redis的話,那么有兩個設(shè)置項必須配置:

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

這是scrapy-redis的兩個核心組件缘挽,實現(xiàn)了大部分的邏輯瞄崇。

配置Redis連接

配置Redis的方式有兩種,一種是通過參數(shù)配置:

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_PASSWORD = 'foobared'

另一種是通過url地址來進行配置:

REDIS_URL = 'redis://user:password@hostname:9001'

url地址支持以下三種格式:

redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db

配置調(diào)度隊列

還可以通過設(shè)置字段來配置隊列的調(diào)度方式壕曼。調(diào)度方式總共有以下三種:

# 默認的調(diào)度方式苏研,優(yōu)先隊列,使用redis中的有序集合
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
# 先入先出隊列
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
# 后入先出隊列
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

配置的時候可以選擇其中之一腮郊。

配置斷點續(xù)爬

由于scrapy-redis將去重的指紋和爬取隊列存儲在Redis數(shù)據(jù)庫中摹蘑,所以可以實現(xiàn)斷點續(xù)爬的功能。

首先我們需要開啟一個持久化的配置轧飞,將此設(shè)置配置為True后衅鹿,那么Scrapy在退出時將不會清空Redis的隊列撒踪。

SCHEDULER_PERSIST = True

保留下去重的指紋和爬取隊列后,那么下一次開啟抓取就會重新繼續(xù)上次的爬取隊列了大渤。

配置Pipeline

scrapy-redis中有一個功能是可以將各個分布式的slave抓取到的item傳輸給master制妄,這樣的話,所有抓取的數(shù)據(jù)都會保存到一個統(tǒng)一的master中兼犯。

但是這項功能會較大的影響抓取的速度忍捡,所以在大規(guī)模抓取的時候一般都不會開啟此選項。

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}

系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切黔,一起剝皮案震驚了整個濱河市砸脊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纬霞,老刑警劉巖凌埂,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诗芜,居然都是意外死亡瞳抓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門伏恐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孩哑,“玉大人,你說我怎么就攤上這事翠桦『嵫眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵销凑,是天一觀的道長丛晌。 經(jīng)常有香客問我,道長斗幼,這世上最難降的妖魔是什么澎蛛? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蜕窿,結(jié)果婚禮上谋逻,老公的妹妹穿的比我還像新娘。我一直安慰自己渠羞,他們只是感情好斤贰,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著次询,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓷叫。 梳的紋絲不亂的頭發(fā)上屯吊,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天送巡,我揣著相機與錄音,去河邊找鬼盒卸。 笑死骗爆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蔽介。 我是一名探鬼主播摘投,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虹蓄!你這毒婦竟也來了犀呼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤薇组,失蹤者是張志新(化名)和其女友劉穎外臂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體律胀,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡宋光,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炭菌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罪佳。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖黑低,靈堂內(nèi)的尸體忽然破棺而出赘艳,到底是詐尸還是另有隱情,我是刑警寧澤投储,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布第练,位于F島的核電站,受9級特大地震影響玛荞,放射性物質(zhì)發(fā)生泄漏娇掏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一勋眯、第九天 我趴在偏房一處隱蔽的房頂上張望婴梧。 院中可真熱鬧,春花似錦客蹋、人聲如沸塞蹭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽番电。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漱办,已是汗流浹背这刷。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娩井,地道東北人暇屋。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像洞辣,于是被迫代替她去往敵國和親咐刨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354