整理一下Scrapy-Redis的两种用法
前提
熟练使用Scrapy框架,并且已经安装了Redis服务器和Scrapy框架
用法一 (通过在项目中导入Scrapy-Redis源码)
新建Scrapy项目, scrapy startproject tutorial, 项目结构如下:

然后拷贝Scrapy-Redis项目工程中的[scrapy-redis]目录到tutorial目录下,此时,项目结构如下:

接着, 在settings文件中进行如下配置:
SCHEDULER = "tutorial.scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "tutorial.scrapy_redis.dupefilter.RFPDupeFilter"
这两句话分别指明Scrapy使用Scrapy-Redis提供的调度器以及去重过滤器.
紧接着,编写一个简单的spider:
import script
class DmozSpider(scrapy.Spider):
name = 'dmoz'
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
然后运行dmoz爬虫: scrapy crawl dmoz
,发现会报以下错误:

出现这个问题的主要原因是, Scrapy-Redis首先是通过settings文件查找Redis的配置,如果没有找到,则会默认使用localhost:6379作为Redis的配置(参见connection文件). 因为,这里我们本地并没有安装Redis服务器,而是装在远程服务器上,所以会导致这个错误.
这里我们配置一下Redis的链接信息,在settings中指定: REDIS_URL = "redis://:password@host:port/db"
然后再次运行dmoz爬虫: scrapy crawl dmoz
, 这时又出现新的错误:

出现这个错误的原因是
SCHEDULER_QUEUE_CLASS
和SCHEDULER_DUPEFILTER_CLASS
这两个参数没有在settings中进行配置,然后Scrapy-Redis就采用了defaults文件中默认的配置(注: Scrapy加载配置文件的方式是settings中的参数优先级最高,如果settings中没有设置的参数会使用默认的参数), 然后看一下defaults文件:
import redis
# For standalone use.
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'
PIPELINE_KEY = '%(spider)s:items'
REDIS_CLS = redis.StrictRedis
REDIS_ENCODING = 'utf-8'
# Sane connection defaults.
REDIS_PARAMS = {
'socket_timeout': 30,
'socket_connect_timeout': 30,
'retry_on_timeout': True,
'encoding': REDIS_ENCODING,
}
SCHEDULER_QUEUE_KEY = '%(spider)s:requests'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'
SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
START_URLS_KEY = '%(name)s:start_urls'
START_URLS_AS_SET = False
这里可以有2中方式解决这个问题,第一是修改这个配置文件:
SCHEDULER_QUEUE_KEY = '%(spider)s:requests'
SCHEDULER_QUEUE_CLASS = tutorial.'scrapy_redis.queue.PriorityQueue'
SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'
SCHEDULER_DUPEFILTER_CLASS = 'tutorial.scrapy_redis.dupefilter.RFPDupeFilter'
第二种方式是保持defaults文件不变,修改settings文件,增加:
SCHEDULER_QUEUE_CLASS = 'ttbs_crawler.scrapy_redis.queue.SpiderPriorityQueue'
推荐使用后者,因为这种方式可以尽量不动Scrapy-Redis源码.
修改完毕,再次启动爬虫dmoz, 此时已经可以正常运行.然后通过redis-cli往队列中推送任务即可.lpush dmoz:start_urls http://baidu.com
用法一 (通过pip安装Scrapy-Redis包)
第二种方式比较简单, 先通过pip命令安装Scrapy-Redis: pip install scrapy-redis
. 然后新建Scrapy项目后,在settings配置文件中设置, 就可以了.
SCHEDULER = "tutorial.scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "tutorial.scrapy_redis.dupefilter.RFPDupeFilter"
到此,已经完成了两种Scrapy-Redis的配置方式, 那么选哪种方式呢? 如果想要扩展或者自定义一些Scrapy-Redis的功能(后边会有文章专门介绍),使用第一种; 其它情况使用第二种.
注: 稍微提一下,看了一下Scrapy-Redis官方给出的使用方式中,都有开启RedisPipline:
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
我这里因为不需要把item存储到redis, 所以就没有启用.
网友评论