热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scrapyredis使用以及剖析[Python基础]

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

scrapy-redis使用以及剖析[Python基础]

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

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

Scrapy-redis提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应的修改)

  • Scheduler
  • Duplication Filter
  • Item Pipeline
  • Base Spider

scrapy-redis组件

scrapy-redis架构

URL去重
定义去重规则(被调度器调用并应用)
 
    a. 内部会使用以下配置进行连接Redis
 
        # REDIS_HOST = "localhost"                            # 主机名
        # REDIS_PORT = 6379                                   # 端口
        # REDIS_URL = "redis://user:pass@hostname: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"                            # redis编码类型             默认:"utf-8"
     
    b. 去重规则通过redis的集合完成,集合的Key为:
     
        key = defaults.DUPEFILTER_KEY % {"timestamp": int(time.time())}
        默认配置:
            DUPEFILTER_KEY = "dupefilter:%(timestamp)s"
              
    c. 去重规则中将url转换成唯一标示,然后在redis中检查是否已经在集合中存在
     
        from scrapy.utils import request
        from scrapy.http import Request
         
        req = Request(url="http://www.cnblogs.com/wupeiqi.html")
        result = request.request_fingerprint(req)
        print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c
         
         
        PS:
            - URL参数位置不同时,计算结果一致;
            - 默认请求头不在计算范围,include_headers可以设置指定请求头
            示例:
                from scrapy.utils import request
                from scrapy.http import Request
                 
                req = Request(url="http://www.baidu.com?name=8&id=1",callback=lambda x:print(x),COOKIEs={"k1":"vvvvv"})
                result = request.request_fingerprint(req,include_headers=["COOKIEs",])
                 
                print(result)
                 
                req = Request(url="http://www.baidu.com?id=1&name=8",callback=lambda x:print(x),COOKIEs={"k1":666})
                 
                result = request.request_fingerprint(req,include_headers=["COOKIEs",])
                 
                print(result)
         
"""
# Ensure all spiders share same duplicates filter through redis.
# DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
调度器
"""
调度器,调度器使用PriorityQueue(有序集合)、FifoQueue(列表)、LifoQueue(列表)进行保存请求,并且使用RFPDupeFilter对URL去重

    a. 调度器
        SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.PriorityQueue"          # 默认使用优先级队列(默认),其他: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 = True                                     # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
        SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
        SCHEDULER_DUPEFILTER_KEY = "%(spider)s:dupefilter"                  # 去重规则,在redis中保存时对应的key
        SCHEDULER_DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 去重规则对应处理的类


"""
# Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# Default requests serializer is pickle, but it can be changed to any module
# with loads and dumps functions. Note that pickle is not compatible between
# python versions.
# Caveat: In python 3.x, the serializer must return strings keys and support
# bytes as values. Because of this reason the json or msgpack module will not
# work by default. In python 2.x there is no such issue and you can use
# "json" or "msgpack" as serializers.
# SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"

# Don"t cleanup redis queues, allows to pause/resume crawls.
# SCHEDULER_PERSIST = True

# Schedule requests using a priority queue. (default)
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.PriorityQueue"

# Alternative queues.
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.FifoQueue"
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.LifoQueue"

# Max idle time to prevent the spider from being closed when distributed crawling.
# This only works if queue class is SpiderQueue or SpiderStack,
# and may also block the same time when your spider start at the first time (because the queue is empty).
# SCHEDULER_IDLE_BEFORE_CLOSE = 10
数据持久化
2. 定义持久化,爬虫yield Item对象时执行RedisPipeline

    a. 将item持久化到redis时,指定key和序列化函数

        REDIS_ITEMS_KEY = "%(spider)s:items"
        REDIS_ITEMS_SERIALIZER = "json.dumps"

    b. 使用列表保存item数据
起始URL相关
"""
起始URL相关

    a. 获取起始URL时,去集合中获取还是去列表中获取?True,集合;False,列表
        REDIS_START_URLS_AS_SET = False    # 获取起始URL时,如果为True,则使用self.server.spop;如果为False,则使用self.server.lpop
    b. 编写爬虫时,起始URL从redis的Key中获取
        REDIS_START_URLS_KEY = "%(name)s:start_urls"

"""
# If True, it uses redis" ``spop`` operation. This could be useful if you
# want to avoid duplicates in your start urls list. In this cases, urls must
# be added via ``sadd`` command or you will get a type error from redis.
# REDIS_START_URLS_AS_SET = False

# Default start urls key for RedisSpider and RedisCrawlSpider.
# REDIS_START_URLS_KEY = "%(name)s:start_urls"
scrapy-redis示例
1 # DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
 2 #
 3 #
 4 # from scrapy_redis.scheduler import Scheduler
 5 # from scrapy_redis.queue import PriorityQueue
 6 # SCHEDULER = "scrapy_redis.scheduler.Scheduler"
 7 # SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.PriorityQueue"          # 默认使用优先级队列(默认),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
 8 # SCHEDULER_QUEUE_KEY = "%(spider)s:requests"                         # 调度器中请求存放在redis中的key
 9 # SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                  # 对保存到redis中的数据进行序列化,默认使用pickle
10 # SCHEDULER_PERSIST = True                                            # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
11 # SCHEDULER_FLUSH_ON_START = False                                    # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
12 # SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
13 # SCHEDULER_DUPEFILTER_KEY = "%(spider)s:dupefilter"                  # 去重规则,在redis中保存时对应的key
14 # SCHEDULER_DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 去重规则对应处理的类
15 #
16 #
17 #
18 # REDIS_HOST = "10.211.55.13"                           # 主机名
19 # REDIS_PORT = 6379                                     # 端口
20 # # REDIS_URL = "redis://user:pass@hostname:9001"       # 连接URL(优先于以上配置)
21 # # REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {"socket_timeout": 30,"socket_connect_timeout": 30,"retry_on_timeout": True,"encoding": REDIS_ENCODING,})
22 # # REDIS_PARAMS["redis_cls"] = "myproject.RedisClient" # 指定连接Redis的Python模块  默认:redis.StrictRedis
23 # REDIS_ENCODING = "utf-8"                              # redis编码类型             默认:"utf-8"
24 
25 配置文件

配置文件
1 import scrapy
 2 
 3 
 4 class ChoutiSpider(scrapy.Spider):
 5     name = "chouti"
 6     allowed_domains = ["chouti.com"]
 7     start_urls = (
 8         "http://www.chouti.com/",
 9     )
10 
11     def parse(self, response):
12         for i in range(0,10):
13             yield

爬虫文件

推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
FrxxGp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有