使用scrapy-redis实现分布式

  要实现分布式,主机之间需要共享爬取队列和去冲集合,scrapy_redis就是将request调度队列、请求队列和获取的item放在了一个多台主机可以同时访问的Redis数据库中。

  剖析源码的工作请根据需要自行学习,直接给出settings中的配置。
#一、必要配置
以下配置是scrapy_redis实现分布式的核心

1. 配置调度器和去重类

这个选项是必须要进行配置的

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

2. 配置Redis

同样redis的连接也是必须进行配置的

REDIS_HOST = '40.121.45.74'
REDIS_PORT = 6379
REDIS_PASSWORD = 'foobared'

如果没有设置密码,REDIS_PASSWORD 可以不声明

二、可选配置

以下根据自己的需要进行配置

1. 调度队列

  调度队列就是调度时执行的顺序,以下三种任选其一,默认为PriorityQueue。

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

2. 持久化

  默认为False,会在爬取完成后清空爬取队列和去重指纹集合。如果不想清空它们,就设置为True:

SCHEDULER_PERSIST = True

3. 重爬

  此配置默认为False。如果配置了持久化或者强制中断了爬虫,name爬取队列和指纹集合不会被清空,爬虫重新启动之后就会接着上次爬取。想重新爬取就配置为True:

SCHEDULER_FLUSH_ON_START = True

4. 将数据保存到redis中

  就是在ITEM_PIPELINES 加上一个pipeline,这样就会将爬虫爬取到的数据保存到redis中一份。

ITEM_PIPELINES = {
	'scrapy_redis.pipelines.RedisPipeline': 50,
	 ...
	 ...
}

一般不会这么做,因为redis是基于内存的,如果数据量庞大会占用内存空间,我们只是利用它的快速。

三、存储

  多台主机爬取之后的数据应当存储在一台主机中,因此必要的连接都应该是存储主机上的数据库服务。

四、配置redis_key

  可以不进行配置,但是配置了会更加方便调度程序,使用scrapy_redis的RedisSpider类来替换原来的scrapy.Spider,并且不在使用原来的start_urls ,而是使用redis_key。
如下所示:

from scrapy_redis.spiders import RedisSpider

class TestSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['www.baidu.com']
    # start_urls = ['http://www.baidu.com']
    redis_key = 'test_redis:start_urls'
    ...
    ...

  当spider空闲的时候,会尝试在redis_key这个数据结构中尝试获得一个url,这个数据结构可以是默认的list也可以设置为set,设置为set则需要用REDIS_START_URLS_AS_SET在settings中进行设置。
如果获得一个url就进行一些decode处理,并进行请求,获取不到就一直等待,通过向redis中push需要爬取的网址,来调度爬虫。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值