当前位置: 首页 > 面试题库 >

scrapy和scrapy-redis有什么区别?为什么选择redis数据库?

赵经国
2023-05-12

Scrapy的简介

 Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。

scrapy-redis分布式爬虫

scrapy-redis是在原来的scrapy的基础上,重写Scheduler,让调度器到共享队列中取Request(该request请求时去重的)。去重主要是利用了redis的集合类型。


Scrapy和Scrapy-Redis是两个Python框架,用于构建网络爬虫。它们之间的主要区别在于数据的调度和存储方式。

Scrapy是一个强大的、基于事件驱动的异步爬虫框架。它使用自己的调度器和内存队列来管理爬取请求,并将爬取到的数据存储在各种目标中,如文件、数据库等。Scrapy可以方便地实现单机爬虫,但在分布式环境下需要额外的工作来管理多个爬虫实例之间的请求和数据。

Scrapy-Redis是Scrapy框架的一个插件,它提供了分布式爬虫的支持,使用Redis作为中心化的调度器和队列。它将爬取请求和爬取数据存储在Redis数据库中,实现了多个爬虫实例之间的请求和数据共享。这样可以更容易地实现分布式爬虫,使得多个爬虫实例可以协同工作,提高爬取效率。

选择Redis作为数据库的主要原因是其高性能和灵活性。Redis是一个内存数据库,具有快速的读写速度,可以轻松处理高并发的请求。此外,Redis还支持多种数据结构和丰富的操作命令,适合存储和处理各种类型的数据。这使得Redis成为一个理想的选择,用于存储和调度爬虫的请求和数据。

下面是一个使用Scrapy-Redis构建分布式爬虫的简单代码示例:

# 在settings.py中配置Scrapy-Redis
# 设置Redis作为调度器和去重器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置Redis连接信息
REDIS_HOST = 'localhost'
REDIS_PORT = 6379

# 创建一个Spider继承RedisSpider
import scrapy
from scrapy_redis.spiders import RedisSpider

class MySpider(RedisSpider):
    name = 'my_spider'
    allowed_domains = ['example.com']

    # 定义Redis Key的名称
    redis_key = 'my_spider:start_urls'

    def parse(self, response):
        # 解析爬取到的页面数据
        # 处理爬取结果
        pass

# 运行爬虫
# 启动Redis服务
# 执行以下命令运行爬虫
scrapy runspider my_spider.py

在上面的代码中,我们定义了一个名为MySpider的爬虫,继承自RedisSpider。通过设置redis_key,我们告诉Scrapy-Redis从Redis中读取起始URL,并将爬取结果存储回Redis中。这样,多个爬虫实例可以通过Redis共享URL和数据。

 类似资料:
  • 问题内容: 我想使用 Redis的-PY 缓存一些数据,但我无法找到之间的差异的一个合适的解释和。它们相等吗? 此外,在Redis Python Docs中找不到关于的参数的清晰文档。任何想法? 问题答案: 这似乎很清楚: 和 您需要向后兼容吗?使用。不在乎吗 使用。 2017-03-31 以下是从github.com链接引用的向后兼容性的详细信息: 除了上述更改之外,Redis类是StrictR

  • 1、Redis相比memecache,拥有更多的数据结构和支持更丰富的数据操作。 (1)Redis支持key-value,常用的数据类型主要有String、Hash、List、Set、Sorted Set。 (2)memecache只支持key-value。 2、内存使用率对比,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。 3、性

  • 问题内容: 在我的应用程序中,我使用Redis数据库。我查阅了他们的文档,但找不到HSET和HMSET之间的区别。 问题答案: HSET过去只能设置一个键值对。如果需要一次设置多个,则必须使用HMSET(M表示多重)。几年前进行了更改,以允许两个命令都接受多个对。现在,HMSET已不再是多余的了。 根据官方文件: 根据Redis 4.0.0,HMSET被视为已弃用。请在新代码中使用HSET。

  • 问题内容: 我想在不同节点上的2个应用程序之间共享会话;但是,我很困惑Cookie和Redis会话存储之间的区别是什么;例如Cookie会话可能如下所示: 在Redis中,一个会话存储可能看起来像这样: 但是,我很困惑如何共享这些会话。在cookie方法中,请求包含会话的状态,而我看不到Redis中的会话实际上如何匹配到2个应用程序之间的状态。有什么建议如何在2个机架应用程序之间使用Redis /

  • 本文向大家介绍props.children.map和js的map有什么区别?为什么优先选择react的?相关面试题,主要包含被问及props.children.map和js的map有什么区别?为什么优先选择react的?时的应答技巧和注意事项,需要的朋友参考一下 React.Children.map 能够处理未知数据类型,即使 React.children 是 null 和 undefined 也

  • 问题内容: http://download.redis.io/redis-stable/deps/geohash- int/geohash_helper.c 通过上面的URL,我们知道有两个概念,一个是geohashBoundingBox,另一个是Area,我的问题是有什么区别它们之间,为什么我们都需要它们?还有为什么句子“ geohashGetCoordRange(&long_range,&la

  • 问题内容: 各自的优缺点是什么?请建议何时使用一种而不是另一种。 问题答案: 数据存储 发布/订阅是发布者/订阅者平台,不是数据存储。无论是否有订阅者,发布的消息都会消失。 在Redis Streams中,stream是一种数据类型,它本身就是一种数据结构。消息或条目存储在内存中,并保留在那里直到被命令删除。 同步/异步通信 发布/订阅是同步通信。各方需要同时处于活动状态才能进行通信。Redis在

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。