scrapy-redis 和 scrapy 有什么区别

scrapy 是一个 Python 爬虫框架,爬取效率极高,但是不支持分布式。而 scrapy-redis 是一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让 scrapy 支持分布式策略, Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。

scrapy-redis 和 scrapy 有什么区别-Worktile社区

一、scrapy-redis

scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署。

  1. scrapy-redis使用redis list存放待爬取的request
  2. scrapy-redis在setting配置SCHEDULER = “scrapy_redis.scheduler.Scheduler”替换原本的待爬取队列。使用redis进行任务分发与调度,把所有待爬取的请求都放入redis,所有爬虫都去redis读取请求。
  3. Scrapy-Redis中的去重是由Duplication Filter组件实现的,该组件利用Redis中set集合不重复的特性,巧妙地实现了这个功能。首先Scrapy-Redis调度器接收引擎递过来的请求,然后将这个请求指纹存入set集合中检查是否重复,并把不重复的请求加入到Redis的请求队列中。
  4. scrapy-redis不再使用原有的Spider类,重写RedisSpider继承Spider和RedisMixin类。当我们生成一个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是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

  1. 调度器、管道不可以被分布式集群共享
  2. scrapy使用改造后的collection.deque(双端队列)存放待爬取的request
  3. scrapy中跟待爬取队列直接相关的是Scheduler(调度器),scheduler负责对新的requests进行入列操作,把待爬取的队列安装优先级建立字典,根据request中的priority属性做优先级(越小的优先级越高)进行出队列操作(不能共享)。
  4. scrapy把已发送的request指纹放到集合中,下一个request指纹拿到集合中对比,存在说明已经爬取过不继续执行操作。

三、scrapy-redis 和 scrapy 的区别

scrapy 是一个 Python 爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而 scrapy-redis 是一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让 scrapy 支持分布式策略, Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。

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

1、Scheduler

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

Scrapy中跟“待爬队列”直接相关的就是调度器Scheduler,它负责对新的request进行入列操作(加入Scrapy queue),取出下一个要爬取的request(从Scrapy queue中取出)等操作。它把待爬队列按照优先级建立了一个字典结构,然后根据request中的优先级,来决定该入哪个队列,出列时则按优先级较小的优先出列。为了管理这个比较高级的队列字典,Scheduler需要提供一系列的方法。但是原来的Scheduler已经无法使用,所以使用Scrapy-redis的scheduler组件。

2、Duplication Filter

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

在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处理。

3、Item Pipeline

引擎将(Spider返回的)爬取到的Item给Item Pipeline,scrapy-redis 的Item Pipeline将爬取到的 Item 存⼊redis的 items queue。修改过Item Pipeline可以很方便的根据 key 从 items queue 提取item,从⽽实现 items processes集群。

4、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-redis特征

  1. 分布式爬取:您可以启动多个spider工程,相互之间共享单个redis的requests队列。最适合广泛的多个域名网站的内容爬取。
  2. 分布式数据处理:爬取到的scrapy的item数据可以推入到redis队列中,这意味着你可以根据需求启动尽可能多的处理程序来共享item的队列,进行item数据持久化处理。
  3. Scrapy即插即用组件:Scheduler调度器 + Duplication复制 过滤器,Item Pipeline,基本spider。

文章标题:scrapy-redis 和 scrapy 有什么区别,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/34714

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年1月8日 上午4:49
下一篇 2023年1月8日 上午6:07

相关推荐

  • git如何删除本地分支命令

    在git中删除本地分支的命令:一、查看当前本地分支;二、删除本地分支。 查看当前本地分支的命令是git branch,该命令可以列出所有本地分支;删除本地分支的命令是git branch -d local_branch_name。 一、查看当前本地分支 该命令可以列出所有本地分支。 运行实例: 此例…

    2023年3月16日
    65700
  • 体系管理员的主要工作内容是什么

    体系管理员的工作主要包括:1、维护质量安全;2、落实内部审核工作;3、对审核情况进行实施;4、负责文章的编制。在此基础上形成一套完整的“企业管理基本法”,通过基本法对企业进行管理和约束,确保企业的正常运营和盈利。 系管理员的工作主要包括维护质量安全、落实内部审核工作、对审核情况进行实施、负责文章的编…

    2022年11月6日
    89900
  • 哪些是开源软件的优点

    开源软件的优点:1、安全性好;2、更多的顾客导向;3、更好的支持服务;4、成本更低;5、可靠性高;6、无升级推送;7、自由和灵活性高;8、透明度高。安全性好是指,当开发以开源方式进行,用户能直接的校验供应商是如何对待安全问题的。 1、安全性好 安全是一件复杂的事情。这就是为什么开源开发是构建安全解决…

    2023年1月15日
    9700
  • 测试用例excel怎么写

    测试用例excel怎么写:1、制作下拉菜单;2、设置背景颜色变化;3、设置执行比。制作下拉菜单是指先选中某列,再点击数据,设置值为“通过”、“未通过”注意中间为英文逗号;设置背景颜色变化是指先选中该列,再点击开始,设置单元格值等于某值时的颜色变化。 一、测试用例excel怎么写 1、制作下拉菜单 2…

    2023年4月4日
    8400
  • java在线编程网站有哪些

    java在线编程网站有:1、LintCode;2、codecademy;3、Coursera;4、CSDN;5、Exercism。LintCode 是Java学习爱好者的福音,它不仅有算法题、数据库题、Java题目可以刷,还有Java和Sql的教程的手把手教程,一遍做题一边学习加深印象。 1、Lin…

    2023年2月6日
    3.1K00
  • 市场营销的核心是什么

    市场营销的核心是交换,市场营销是个人或组织通过创造并同他人交换产品和价值以满足需求和欲望的一种社会和管理过程,交换过程是一个主动、积极地寻找机会,满足双方需求和欲望的社会过程和管理过程。 一、市场营销的核心 市场营销是个人或组织通过创造并同他人交换产品和价值以满足需求和欲望的一种社会和管理过程。根据…

    2023年1月4日
    33700
  • 安卓模拟器与真机有什么差别

    差别主要有:一、性能;二、兼容性;三、网络连接;四、电池寿命;五、调试和测试。安卓模拟器通常比真机慢,因为它需要模拟安卓系统在计算机上的运行。虽然现代计算机的性能越来越强大,但安卓模拟器仍然需要更多的资源才能够运行流畅。 一、性能 安卓模拟器通常比真机慢,因为它需要模拟安卓系统在计算机上的运行。虽然…

    2023年5月29日
    300
  • 为什么开源很重要

    开源很重要的原因在于:这种知识共享和集体创新使整个社区受益。将技术锁定在专利、版权和昂贵的许可之后会限制进步。在过去几十年里,许多流行的开源项目促进了全球技术的快速进步。 为什么开源很重要? 开源的想法源于技术社区。技术创新需要全球协作才能发展。例如,假设美国的一个编程团队为金融应用程序开发新的开源…

    2022年11月8日
    6500
  • UE4C编程学习路线可以怎么安排

    UE4C编程学习路线有以下几个阶段:1、虚幻引擎综合运用;2、虚幻引擎蓝图实践;3、C++课程;4、虚幻引擎C++;5、虚幻引擎功能模块。虚幻引擎综合运用主要学习虚幻引擎各个模块和相关软件。 学习路线分为以下几个阶段: 一、虚幻引擎综合运用 主要学习虚幻引擎各个模块和相关软件,包括Photoshop…

    2023年2月8日
    5700
  • mysql和sql server的区别是什么

    mysql和sql server的区别在于以下几个方面:1、历史方面;2、应用场景方面;3、在架构方面。历史方面是指,mysql的开始的核心思维,主要是开源、简便易用。SQL Server开始是由Microsoft, Sybase and Ashton-Tate三家公司拦下的生意,是为IBM公司的O…

    2023年2月18日
    11000

发表回复

登录后才能评论
联系我们
站长微信
站长微信
分享本页
返回顶部