Scrapy 和 scrapy-redis的区别

Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。

pip install scrapy-redis

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

  • Scheduler
  • Duplication Filter
  • Item Pipeline
  • Base Spider

scrapy-redis架构

如上图所⽰示,scrapy-redis在scrapy的架构上增加了redis,基于redis的特性拓展了如下组件:

Scheduler

Scrapy改造了python本来的collection.deque(双向队列)形成了自己的Scrapy queue(https://github.com/scrapy/queuelib/blob/master/queuelib/queue.py)),但是Scrapy多个spider不能共享待爬取队列Scrapy queue, 即Scrapy本身不支持爬虫分布式,scrapy-redis 的解决是把这个Scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。

Scrapy中跟“待爬队列”直接相关的就是调度器Scheduler,它负责对新的request进行入列操作(加入Scrapy queue),取出下一个要爬取的request(从Scrapy queue中取出)等操作。它把待爬队列按照优先级建立了一个字典结构,比如:

    {优先级0 : 队列0优先级1 : 队列1优先级2 : 队列2}

然后根据request中的优先级,来决定该入哪个队列,出列时则按优先级较小的优先出列。为了管理这个比较高级的队列字典,Scheduler需要提供一系列的方法。但是原来的Scheduler已经无法使用,所以使用Scrapy-redis的scheduler组件。

Duplication Filter

Scrapy中用集合实现这个request去重功能,Scrapy中把已经发送的request指纹放入到一个集合中,把下一个request的指纹拿到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。这个核心的判重功能是这样实现的:

 def request_seen(self, request):# self.request_figerprints就是一个指纹集合  fp = self.request_fingerprint(request)# 这就是判重的核心操作  if fp in self.fingerprints:return Trueself.fingerprints.add(fp)if self.file:self.file.write(fp + os.linesep)

在scrapy-redis中去重是由Duplication Filter组件来实现的,它通过redis的set 不重复的特性,巧妙的实现了Duplication Filter去重。scrapy-redis调度器从引擎接受request,将request的指纹存⼊redis的set检查是否重复,并将不重复的request push写⼊redis的 request queue。

引擎请求request(Spider发出的)时,调度器从redis的request queue队列⾥里根据优先级pop 出⼀个request 返回给引擎,引擎将此request发给spider处理。

Item Pipeline

引擎将(Spider返回的)爬取到的Item给Item Pipeline,scrapy-redis 的Item Pipeline将爬取到的 Item 存⼊redis的 items queue。

修改过Item Pipeline可以很方便的根据 key 从 items queue 提取item,从⽽实现 items processes集群。

Base Spider

不在使用scrapy原有的Spider类,重写的RedisSpider继承了Spider和RedisMixin这两个类,RedisMixin是用来从redis读取url的类。

当我们生成一个Spider继承RedisSpider时,调用setup_redis函数,这个函数会去连接redis数据库,然后会设置signals(信号):

  • 一个是当spider空闲时候的signal,会调用spider_idle函数,这个函数调用schedule_next_request函数,保证spider是一直活着的状态,并且抛出DontCloseSpider异常。

  • 一个是当抓到一个item时的signal,会调用item_scraped函数,这个函数会调用schedule_next_request函数,获取下一个request。

Scrapy 和 scrapy-redis的区别相关推荐

  1. 爬虫教程( 2 ) --- 爬虫框架 Scrapy、Scrapy 实战

    From:https://piaosanlang.gitbooks.io/spiders/content/ scrapy-cookbook :https://scrapy-cookbook.readt ...

  2. Crawler之Scrapy:Scrapy简介、安装、使用方法之详细攻略

    Crawler之Scrapy:Scrapy简介.安装.使用方法之详细攻略 目录 scrapy简介 Scrapy进行安装 Scrapy使用方法 scrapy简介 Scrapy是Python开发的一个快速 ...

  3. php多选批量修改数据库数据类型有哪些_php面试题之memcache和redis的区别

    这篇文章介绍的内容是关于php面试题六之memcache和redis的区别,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Memcache和Redis区别: * Redis中,并不是所 ...

  4. 十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --upgrade pip 2.安装,wheel(建议网络安装) pip install whee ...

  5. Memcached与Redis的区别和选择

    一.Memcached简介 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fi ...

  6. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  7. MySQL 和 Redis 的区别以及应用场景

    目录 一.mysql 和 redis 的区别 1. 数据类型 2. 本质区别 二.redis 优缺点及使用场景 1. 使用redis有哪些好处? 2. redis 相比memcached 有哪些优势? ...

  8. Crawler之Scrapy:Scrapy的简介、安装、使用方法之详细攻略

    Crawler之Scrapy:Scrapy的简介.安装.使用方法之详细攻略 目录 Scrapy的简介 Scrapy的安装 1.成功解决Failed building wheel for Twisted ...

  9. scrapy简介-scrapy框架1-python

    scrapy官方文档地址:https://docs.scrapy.org/en/latest/ 1.scrapy简介 Scrapy是适用于Python的一个快速.高层次的屏幕抓取和web抓取框架,用于 ...

  10. Scrapy中scrapy.loader.processors、scrapy.contrib.loader.processor的区别

    区别就是scrapy.contrib.loader.processor模块导入了scrapy.loader.processors中的所有内容: Lib/site-packages/scrapy/loa ...

最新文章

  1. java 什么是内存屏障,java内存屏障和可见性
  2. DBProvider 连接 Oracle 10g 数据库的问题
  3. c语言必背数据结构_数据结构(C语言)考试重点必背
  4. 02Prism WPF 入门实战 - 建项
  5. 前端学习(3120):react-hello-react的setstate的一个说明
  6. css —— 图片环绕+首行缩进
  7. python爬取网页上的特定链接_自学python爬虫二:如何正常操作urllib2通过指定的URL抓取网页内容...
  8. 智能仓储管理系统分析?
  9. [转载]一个任务超时退出的装饰器,用起来真方便
  10. 局域网文件共享手机访问电脑文件软件
  11. 北斗导航 | 北斗高精度定位在智能驾驶汽车领域的应用
  12. 百度富文本编辑器UEditor
  13. 腾讯校招 针对找工作的小伙伴们
  14. pat计算机程序考试考试时间,pat报名条件
  15. 【CSS】同色系背景
  16. 浅析 | 海岸试验数据管理系统TDM-设计理念(系统特征)
  17. 英语钻石法则(七)——【听-问答-复述故事】
  18. 死亡公司公墓数据(IT桔子)
  19. 【李佳辉_周报_2022.10.30】
  20. 全能UI设计师到底需要具备哪些能力呢?

热门文章

  1. PhoneGap插件入门(转)
  2. 数据加密:RSA 密钥
  3. 网络电话全民亲情祝福 中秋团圆新方式
  4. 数加:从数据工程师到CDO的七次升职路
  5. zabbix监控vsftp服务,发生故障并自动恢复
  6. PHP正则判断手机号码格式/邮箱正则
  7. 让想法更加结构化!思维导图工具MindManager
  8. IntelliJ IDEA 如何从SVN导入项目 怎么部署 就是路劲和tomcat配置等等 步骤希望
  9. html和jsp的差异
  10. Mysql搭建PXC集群 - Percona XtraDB Cluster