安装scrapy-redis

  1. pip install scrapy-redis

从GitHub 上拷贝源码:

  1. clone github scrapy-redis源码文件 git clone https://github.com/rolando/scrapy-redis.git

scrapy-redis的工作流程

Scrapy_redis之domz  例子分析

1.domz爬虫:

 2.配置中:

3.执行domz的爬虫,会发现redis中多了一下三个键

redispipeline中仅仅实现了item数据存储到redis的过程,我们可以新建一个pipeline(或者修改默认的ExamplePipeline),可以让数据存储到任意地方。

 scrapy-redis 的源码分析

1.Scrapy_redis之RedisPipeline

2.Scrapy_redis之RFPDupeFilter

3.Scrapy_redis之Scheduler

domz相比于之前的spider多了持久化request去重的功能,setting中的配置都是可以自己设定的,

意味着我们的可以重写去重和调度器的方法,包括是否要把数据存储到redis(pipeline)

1.Scrapy_redis之RedisSpider

2. Scrapy_redis之RedisCrawlSpider

scrapy-redis 配置:

在爬虫项目的settings.py文件中,可以做一下配置

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

Crontab爬虫定时执行

Scrapy-redis 中的知识总结

request对象什么时候入队

  • dont_filter = True ,构造请求的时候,把dont_filter置为True,该url会被反复抓取(url地址对应的内容会更新的情况)

  • 一个全新的url地址被抓到的时候,构造request请求

  • url地址在start_urls中的时候,会入队,不管之前是否请求过

    • 构造start_url地址的请求时候,dont_filter = True

  1. def enqueue_request(self, request):
       if not request.dont_filter and self.df.request_seen(request):
           # dont_filter=False Ture True request指纹已经存在 #不会入队
           # dont_filter=False Ture False request指纹已经存在 全新的url #会入队
           # dont_filter=Ture False #会入队
           self.df.log(request, self.spider)
           return False
       self.queue.push(request) #入队
       return True

scrapy_redis去重方法

  • 使用sha1加密request得到指纹

  • 把指纹存在redis的集合中

  • 下一次新来一个request,同样的方式生成指纹,判断指纹是否存在reids的集合中

生成指纹

  1. fp = hashlib.sha1()
    fp.update(to_bytes(request.method))  #请求方法
    fp.update(to_bytes(canonicalize_url(request.url))) #url
    fp.update(request.body or b'')  #请求体
    return fp.hexdigest()

判断数据是否存在redis的集合中,不存在插入

  1. added = self.server.sadd(self.key, fp)
  2. return added != 0

scrapy-redis(一)的更多相关文章

  1. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  2. Scrapy+redis实现分布式爬虫

    概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...

  3. scrapy+redis去重实现增量抓取

    class ProjectnameDownloaderMiddleware(object): # Not all methods need to be defined. If a method is ...

  4. 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据

    作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...

  5. Redis与Scrapy

    Redis与Scrapy Redis与Scrapy Redis is an open source, BSD licensed, advanced key-value cache and store. ...

  6. python - scrapy 爬虫框架 ( redis去重 )

    1.  使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...

  7. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  8. scrapy简单分布式爬虫

    经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...

  9. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  10. 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...

随机推荐

  1. CentOS 安装 Redis 笔记

    Redis 安装 yum install redis -y 在启动 redis-server 之前,你需要修改配置文件/etc/redis.conf: 找到 bind 127.0.0.1,将其注释,这 ...

  2. 彻底了解 suid, sgid ,sticky权限

    sticky: 粘性的, 如 : sticky tape: 粘胶带 /tmp, /var/tmp: 位 sticky: 表示: 第一, 任何用户都可以在该目录下创建文件(编辑自己的文件),第二, 但是 ...

  3. [SDOI2016]游戏 树剖+李超树

    目录 链接 思路 update 代码 链接 https://www.luogu.org/problemnew/show/P4069 思路 树剖+超哥线段树 我已经自毙了,自闭了!!!! update ...

  4. JWT、OAUTH2与SSO资料补充

    JWT: 阮一峰:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html https://blog.csdn.net/q ...

  5. iis默认文档有什么用?

    设置默认文档就是指在只输入路径,不输入具体网页名的时候,浏览器显示的默认网页名称. 比如说,服务器地址:http://123.xxx.com,在未设置默认文档的时候或指定的默认文档不存在时,要正常访问 ...

  6. .net core 问题:413 Request Entity Too Large nginx

    https://stackoverflow.com/questions/38698350/increase-upload-file-size-in-asp-net-core The other ans ...

  7. Machine.config与web.config

    应用范围的不同 结点介绍 原理介绍 异常 web.config详解

  8. 在服务器端对sshd做白名单

    1.添加用户 #useradd aaa #passwd aaa -->输入密码:123456 添加3个用户,bbb和ccc与aaa添加一样 2.添加白名单 #vim /etc/ssd/sshd_ ...

  9. centos nginx 中安装ssl证书 以及在项目中的使用

    今天阿里云的证书到期了,重新申请了一个,下面是从申请到安装以及结合项目使用的过程: 1.登录阿里云   2.在左侧找到SSL证书 3.申请免费的证书 4.下载证书 5.根据说明配置nginx 6.在项 ...

  10. Ubuntu ls: cannot open directory .: Permission denied

    把该目录赋予权限: sudo chmod xxx