要实现分布式,主机之间需要共享爬取队列和去冲集合,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需要爬取的网址,来调度爬虫。