美文网首页Scrapy框架的点点滴滴
Scrapy框架之Scrapy-Redis的两种使用方式

Scrapy框架之Scrapy-Redis的两种使用方式

作者: HideOnStream | 来源:发表于2019-02-21 14:58 被阅读0次

    整理一下Scrapy-Redis的两种用法

    前提

           熟练使用Scrapy框架,并且已经安装了Redis服务器和Scrapy框架

    用法一 (通过在项目中导入Scrapy-Redis源码)

           新建Scrapy项目, scrapy startproject tutorial, 项目结构如下:


    tutorial项目结构

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

    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,发现会报以下错误:

    redis链接错误.png

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

           然后再次运行dmoz爬虫: scrapy crawl dmoz, 这时又出现新的错误:

    scrapy_redis路径错误
           出现这个错误的原因是SCHEDULER_QUEUE_CLASSSCHEDULER_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, 所以就没有启用.

    相关文章

      网友评论

        本文标题:Scrapy框架之Scrapy-Redis的两种使用方式

        本文链接:https://www.haomeiwen.com/subject/ngaxyqtx.html