scripy redis

scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能:

  • scheduler - 调度器
  • dupefilter - URL去重规则(被调度器使用)
  • pipeline   - 数据持久化

scrapy-redis组件

1. URL去重

a

    a. 利用scrapy-redis做去重规则:
            # ############ 连接redis 信息 #################
            REDIS_HOST = ‘127.0.0.1‘                            # 主机名
            REDIS_PORT = 6379                                   # 端口
            # REDIS_URL = ‘redis://user:[email protected]:9001‘       # 连接URL(优先于以上配置)
            REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {‘socket_timeout‘: 30,‘socket_connect_timeout‘: 30,‘retry_on_timeout‘: True,‘encoding‘: REDIS_ENCODING,})
            # REDIS_PARAMS[‘redis_cls‘] = ‘myproject.RedisClient‘ # 指定连接Redis的Python模块  默认:redis.StrictRedis
            REDIS_ENCODING = "utf-8"

            # 自定义去重规则
            DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
                

如果想要对redis-scrapy的去重规则进行扩展:

可以自定义一个去重的类dup.pyfrom scrapy_redis.dupefilter import RFPDupeFilter

                class MyRFPDupeFilter(RFPDupeFilter):            #继承那个类然后写一些自己定义的方法
                    pass

  # 在setting中选择自己自定义去重规则
DUPEFILTER_CLASS = "wenwen.dup.MyRFPDupeFilter"

源码解读

scrapy_redis中的dupefilter

使用scrapy-redis组件:

情况一:只用它的去重规则功能

配置:
                    # ############ 连接redis 信息 #################
                    REDIS_HOST = ‘127.0.0.1‘                            # 主机名
                    REDIS_PORT = 6379                                   # 端口
                    # REDIS_URL = ‘redis://user:[email protected]:9001‘       # 连接URL(优先于以上配置)
                    REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {‘socket_timeout‘: 30,‘socket_connect_timeout‘: 30,‘retry_on_timeout‘: True,‘encoding‘: REDIS_ENCODING,})
                    # REDIS_PARAMS[‘redis_cls‘] = ‘myproject.RedisClient‘ # 指定连接Redis的Python模块  默认:redis.StrictRedis
                    REDIS_ENCODING = "utf-8"

                    # 自定义去重规则  如果是自定义去重规则的话详见上文
                    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

情况二:只用它的调度器

                # ############ 连接redis 信息 #################
                REDIS_HOST = ‘127.0.0.1‘                            # 主机名
                REDIS_PORT = 6379                                   # 端口
                # REDIS_URL = ‘redis://user:[email protected]:9001‘       # 连接URL(优先于以上配置)
                REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {‘socket_timeout‘: 30,‘socket_connect_timeout‘: 30,‘retry_on_timeout‘: True,‘encoding‘: REDIS_ENCODING,})
                # REDIS_PARAMS[‘redis_cls‘] = ‘myproject.RedisClient‘ # 指定连接Redis的Python模块  默认:redis.StrictRedis
                REDIS_ENCODING = "utf-8"

                # 有引擎来执行:自定义调度器
                SCHEDULER = "scrapy_redis.scheduler.Scheduler"
                SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.LifoQueue‘  # 默认使用优先级队列(默认广度优先),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
                SCHEDULER_QUEUE_KEY = ‘%(spider)s:requests‘  # 调度器中请求存放在redis中的key
                SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"  # 对保存到redis中的数据进行序列化,默认使用pickle
                SCHEDULER_PERSIST = True  # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
                SCHEDULER_FLUSH_ON_START = False  # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
                # SCHEDULER_IDLE_BEFORE_CLOSE = 10  # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
                SCHEDULER_DUPEFILTER_KEY = ‘%(spider)s:dupefilter‘  # 去重规则,在redis中保存时对应的key  chouti:dupefilter
                SCHEDULER_DUPEFILTER_CLASS = ‘scrapy.dupefilter.RFPDupeFilter‘  # 去重规则对应处理的类
                #去重规则对应处理的类
                DUPEFILTER_DEBUG = False

情况三:去重+调度去

# ############ 连接redis 信息 #################
                REDIS_HOST = ‘127.0.0.1‘                            # 主机名
                REDIS_PORT = 6379                                   # 端口
                # REDIS_URL = ‘redis://user:[email protected]:9001‘       # 连接URL(优先于以上配置)
                REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {‘socket_timeout‘: 30,‘socket_connect_timeout‘: 30,‘retry_on_timeout‘: True,‘encoding‘: REDIS_ENCODING,})
                # REDIS_PARAMS[‘redis_cls‘] = ‘myproject.RedisClient‘ # 指定连接Redis的Python模块  默认:redis.StrictRedis
                REDIS_ENCODING = "utf-8"

                # 有引擎来执行:自定义调度器
                SCHEDULER = "scrapy_redis.scheduler.Scheduler"
                SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.LifoQueue‘  # 默认使用优先级队列(默认广度优先),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
                SCHEDULER_QUEUE_KEY = ‘%(spider)s:requests‘  # 调度器中请求存放在redis中的key
                SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"  # 对保存到redis中的数据进行序列化,默认使用pickle
                SCHEDULER_PERSIST = True  # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
                SCHEDULER_FLUSH_ON_START = False  # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
                # SCHEDULER_IDLE_BEFORE_CLOSE = 10  # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
                SCHEDULER_DUPEFILTER_KEY = ‘%(spider)s:dupefilter‘  # 去重规则,在redis中保存时对应的key  chouti:dupefilter
                SCHEDULER_DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter‘  # 去重规则对应处理的类
                DUPEFILTER_DEBUG = False

情况四:使用scrapy-redis内置的pipeline做持久化:就是将item对象保存到redis的列表中。

配置:
                 导入scrapy_redis的pipline                       #使用scrapy_pipeline的
                    ITEM_PIPELINES = {
                       ‘scrapy_redis.pipelines.RedisPipeline‘: 300,
                    }
                以上功能全部应用的配置:
                    # ############ 连接redis 信息 #################
                    REDIS_HOST = ‘127.0.0.1‘                            # 主机名
                    REDIS_PORT = 6379                                   # 端口
                    # REDIS_URL = ‘redis://user:[email protected]:9001‘       # 连接URL(优先于以上配置)
                    REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {‘socket_timeout‘: 30,‘socket_connect_timeout‘: 30,‘retry_on_timeout‘: True,‘encoding‘: REDIS_ENCODING,})
                    # REDIS_PARAMS[‘redis_cls‘] = ‘myproject.RedisClient‘ # 指定连接Redis的Python模块  默认:redis.StrictRedis
                    REDIS_ENCODING = "utf-8"

                    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

                    # 有引擎来执行:自定义调度器
                    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
                    SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.LifoQueue‘  # 默认使用优先级队列(默认广度优先),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
                    SCHEDULER_QUEUE_KEY = ‘%(spider)s:requests‘  # 调度器中请求存放在redis中的key
                    SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"  # 对保存到redis中的数据进行序列化,默认使用pickle
                    SCHEDULER_PERSIST = True  # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
                    SCHEDULER_FLUSH_ON_START = False  # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
                    # SCHEDULER_IDLE_BEFORE_CLOSE = 10  # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
                    SCHEDULER_DUPEFILTER_KEY = ‘%(spider)s:dupefilter‘  # 去重规则,在redis中保存时对应的key  chouti:dupefilter
                    SCHEDULER_DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter‘  # 去重规则对应处理的类
                    DUPEFILTER_DEBUG = False

                    # 深度和优先级相关
                    DEPTH_PRIORITY = 1
            

情况五:让scrapy-redis的起始URL不再通过start_reuqests执行,而是去redis中获取。

配置:
                REDIS_START_URLS_BATCH_SIZE = 1
                # REDIS_START_URLS_AS_SET = True # 把起始url放到redis的集合
                REDIS_START_URLS_AS_SET = False # 把起始url放到redis的列表

            爬虫:
                from scrapy_redis.spiders import RedisSpider
                from scrapy.http import Request
                from ..items import WenwenItem

                class ChoutiSpider(RedisSpider):
                    name = ‘chouti‘
                    allowed_domains = [‘chouti.com‘]

                    def parse(self, response):
                        # 随着深度的增加、优先级一直在递减
                        print(response)

            放置起始URL:
                import redis

                conn = redis.Redis(host=‘127.0.0.1‘,port=6379)

                # 起始url的Key: chouti:start_urls
                conn.lpush("chouti:start_urls",‘https://dig.chouti.com/r/ask/hot/12‘)

如果想要自定义去重规则 或者扩展

redis知识补充

博客

自定义调度器

位置

自定义序列化股则(用于处理特殊类型的数据,  如datatime类型)

原文地址:https://www.cnblogs.com/wangkun122/p/9043151.html

时间: 2024-10-16 11:10:09

scripy redis的相关文章

Redis+keepalived实现双机热备

一. 简介 安装使用centos 5.6(64) Master 192.168.2.235 Slave 192.168.2.236 Vip 192.168.2.200 编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby: 当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从

Python操作数据库(mysql redis)

一.python操作mysql数据库: 数据库信息:(例如211.149.218.16   szz  123456) 操作mysql用pymysql模块 #操作其他数据库,就安装相应的模块 import  pymysql ip='211.149.218.16' port=3306 passwd='123456' user='root' db='szz' conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,cha

Redis在Linux中安装使用

一.安装$ wget http://download.redis.io/releases/redis-x.x.x.tar.gz $ tar xzf redis-x.x.x.tar.gz $ cd redis-x.x.x $ make sudo cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-check-rdb redis-trib.rb redis-sentinel redis-server /usr/loca

redis 学习 四 队列

<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/html;chaeset=utf-8'); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 进队列 $userId = mt_rand(000000, 999999); $redis->rpush('QUEUE_NAME',j

Redis实战(三)Redis主从复制

从架构 1.主从架构图 2.通过命令 mkdir redisCluster创建redis集群文件夹 3.通过命令mkdir 6380   mkdir 6381   mkdir 6382在redisCluster文件夹下创建三个文件夹 4.通过以下命令将redis.conf分别拷贝到6380.6381. 6382文件夹下 cp /usr/local/redis/redis-3.0.2/redis.conf  ./6380 cp /usr/local/redis/redis-3.0.2/redis.

Redis Cluster集群部署搭建

在Oracle的路上走了许多年,换换感觉,尝试一下新的知识,也是一个不错的感觉.Redis,一个超轻量化的内存数据库,只做一小块数据库功能实现,却非常优秀的一个产品.今天,就分享一下安装Redis集群的过程. 搭建redis集群,建议至少需要准备3台服务器,共搭建6个节点,3个master,3个slave,并且要求3个master节点不能全部跑到同一台服务器上,保证节点安全,3台服务器的配置相同,使用redistest账号搭建,对应的端口是7000/7001/7002端口 我的集群分配如下,每个

redis的单机安装与配置以及生产环境启动方案

简单介绍一下redis的单机安装与配置,方便自己记录安装步骤的同时方便他人获取知识. 首先,从官网下载最新版的(稳定版)的redis安装包.官网地址如下:https://redis.io/download 下载源码包后,redis需要编译安装.需要安装gcc和tcl,gcc用于编译tcl用于测试. 使用命令安装gcc,yum install gcc,一路选择yes,gcc就可以安装成功. 接下来安装tcl,首先获取tcl源码包(见百度云盘)或者使用命令:wget http://downloads

Redis学习之Sort Set详解

本文和大家分享的主要是Redis中Sort Set相关内容,一起来看看吧,希望对大家学习redis有所帮助. 游戏服务器需要做一个排行榜实时更新,如果沿用传统的方法,一般是通过后端的定时任务去跑数据来生成排行榜数据,这种方法一方面无法满足产品对功能实时性的要求,另一方面也一定程度上消耗服务器端有限的资源.如果从每次数据库读取数据并进行排名(使用Mysql的sort关键字进行排序),在关卡数据量的级数大时是一种效率低的方法.在查阅大量资料后,发现了Redis中的有序集合(Sort Set). Re

redis 集群

redis 集群 redis集群是redis提供分布式数据库方案, 集群通过分片(Sharding)来进行数据共享,并提供复制和故障转移功能. 节点 redis集群通常由多个节点(node)组成,在开始每个node 都是相互独立的. 要组建成真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群. 命令 cluster meet <ip> <port> 向一个node 发送命令 cluster meet,让节点与ip/port所指定的节点 进行握手(hand