首先,要了解两者的区别,就要清楚scrapy-redis是如何产生的,有需求才会有发展,社会在日新月异的飞速发展,大量相似网页框架的飞速产生,人们已经不满足于当前爬取网页的速度,因此有了分布式爬虫,让其可以并行的爬取更多但又不尽相同的网页,这样大大节省了之前同步完成页面爬取所浪费的时间,同步与异步的差距不是一点点的,所以scrapy-redis更加适应于当前形势。好了,步入正轨。

  两者的主要区别就是scrapy-redis在scrapy的基础上增加了redis数据库,同时呢,由于这个redis数据库的存在,就导致了几大新增组件应运而生,---可以实现分布式爬虫,---简单url去重,---持续性爬取,增量式爬虫,---以及遵守Rule规则可以实现深度爬虫等等。下面具体阐述在redis加入之后造成的具体模块改变。

一、Scheduler(调度器模块)

  Scheduler 负责对新的 request 迕行入列和出列的操作。 Scrapy 本身丌支持爬虫分布式,多个 spider 丌能共享待爬取队列 Scrapy queue, scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬 取的 request,便能让多个 spider 去同一个数据库里读取。

二、Duplication Filter(redis  set去重)

  Duplication Filter 利用了 redis 的 set 不重复的特性实现去重 scrapy-redis 调度器从引擎接受 request,将 request 的指纹存⼊redis 的 set 检查是否重 复,并将丌重复的 request push 写⼊redis 的 request queue。引擎请求 request(Spider 发出的)时,调度器从 redis 的 request queue 队列⾥里根据优 先级 pop 出⼀个 request 迒回给引擎,引擎将此 request 发给 spider 处理。

三、Item Pipeline(管道模块)

  引擎将爬取到的 Item 传给 Item Pipeline,scrapy-redis 的 Item Pipeline 将爬取到的 Item 存⼊redis 的 items queue。

四、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. <scrapy爬虫>scrapy命令行操作

    1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...

  2. python爬虫scrapy之scrapy终端(Scrapy shell)

    Scrapy终端是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码. 其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码. ...

  3. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  4. Scrapy之Scrapy shell

    Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据 ...

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

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

  6. Django缓存系统选择之Memcached与Redis的区别与性能对比

    Django支持使用Memcached和Redis这两种流行的内存型数据库作为缓存系统.我们今天来看Memcached和Redis的区别和性能对比. redis和memcached的区别 1.Redi ...

  7. scrapy - 给scrapy 的spider 传值

    scrapy - 给scrapy 的spider 传值 方法一: 在命令行用crawl控制spider爬取的时候,加上-a选项,例如: scrapy crawl myspider -a categor ...

  8. MySql、Mongodb和Redis的区别

    NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...

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

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

  10. Scrapy中scrapy.Request和response.follow的区别

    在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...

随机推荐

  1. Python中的is和==的区别

    Python中的is和==的区别 1. is 是比较内存地址id() a = "YongJie" b = "YongJie" print(id(a)) #233 ...

  2. Java8系列 (六) 新的日期和时间API

    概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...

  3. (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成 ...

  4. Coremail接口存配置读取漏洞POC

    Coremail产品诞生于1999年,经过二十多年发展,如今从亿万级别的运营系统,到几万人的大型企业,都有了Coremail的客户. 截止2019年,Coremail邮件系统产品在国内已拥有10亿终端 ...

  5. C++学习笔记7_多态

    1. 类与类之间的关系class A{ public: int a; void funcA() {}}包含: class B { public: void funcB(){} A a; }//如果类B ...

  6. 爬虫之scrapy安装与基本使用

    安装:pip install scrapy基本使用 1. 创建项目:scrapy startproject 项目名 cd 项目名 2. 生成爬虫 1. 创建spider爬虫:scrapy genspi ...

  7. NOIP模拟13

    上来看了一遍题,发现T2似乎不可做...暴力只给20分怎么玩? T1感觉是要离线处理,但是看了一会发现不会,遂决定先打暴力.然后去把T2 20分拿了,回去看T1,手摸了一下样例,成功推出式子,5分钟码 ...

  8. 来探讨一下最近面试问的ThreadLocal问题

    中高级阶段开发者出去面试,应该躲不开ThreadLocal相关问题,本文就常见问题做出一些解答,欢迎留言探讨. ThreadLocal为java并发提供了一个新的思路, 它用来存储Thread的局部变 ...

  9. java架构之路-(NoSql专题)MongoDB快速上手

    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".在现代的计算系统上每天网络上都会产生庞大的数据量.这些数据有很大一部分是由关系数据库管理系统(RD ...

  10. PHP结合SQL语句写一句话木马

    一.基础类的一句话--功能仅限于验证漏洞了,实际中太容易被查出出来: 1 <?php @eval($_GET["code"])?> 2 <?php @system ...