scrapy-redis改造方法

scrapy-redis 的改造方法

要将一个Scrapy项目变成一个Scrapy-redis项目只需修改以下三点就可以了:

1. 将爬虫的类从`scrapy.Spider`变`scrapy_redis.spiders.RedisSpider`;或者是从`scrapy.CrawlSpider`变`scrapy_redis.spiders.RedisCrawlSpider`。
2. 将爬虫中的`start_urls`删掉。增加一个`redis_key="xxx"`。这个`redis_key`是为了以后在`redis`中控制爬虫启动的。爬虫的第一个url,就是在redis中通过这个发送出去的。
3. 在配置文件中增加如下配置:

    # Scrapy-Redis相关配置
    # 确保request存储到redis中
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"

    # 确保所有爬虫共享相同的去重指纹
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

    # 设置redis为item pipeline
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline': 300
    }

    # 在redis中保持scrapy-redis用到的队列,不会清理redis中的队列,从而可以实现暂停和恢复的功能。
    SCHEDULER_PERSIST = True

    # 设置连接redis信息
    REDIS_HOST = '127.0.0.1'
    REDIS_PORT = 6379
    REDIS_PASSWORD = 123456
运行爬虫:
1. 在爬虫服务器上。进入爬虫文件所在的路径,然后输入命令:`scrapy runspider [爬虫文件名]`。
2. 在`Redis`服务器上,推入一个开始的url链接 lpush [redis_key]这里写代码片 start_url`开始爬取。`这里写代码片`
<think>我们正在处理用户关于Scrapy-Redis分布式爬虫架构图的请求。根据之前提供的引用资料,我们知道:-引用[1]提到了对比scrapyscrapy-redis的架构图(但引用中并未直接提供图)-引用[2][3]都提到了scrapy-redis通过改变scrapy的调度队列,将起始URL从start_urls分离,改为从redis读取,从而实现分布式。-引用[4]提到分布式爬虫利用Scrapy-Redis将请求分布到多台服务器。由于用户明确要求架构图或示意图,虽然引用中没有直接提供图,但我们可以根据原理描述来构建一个文字描述的架构图,并解释各组件。根据引用[1][2][3][4]的共同描述,我们可以总结出Scrapy-Redis的架构核心是使用Redis作为分布式队列,替换了Scrapy原生的队列调度机制。以下是Scrapy-Redis的基本架构组件:1.多个Scrapy爬虫节点(可以是多台机器或多个进程)2.一个共享的Redis服务器(存储待抓取的URL队列,以及去重指纹等)3.Scrapy-Redis组件(替换了Scrapy原有的调度器、去重等模块)工作流程:-所有爬虫节点从同一个Redis队列中获取URL(即不再从各自的start_urls开始,而是从Redis中读取起始URL)-每个爬虫节点处理一个URL,生成新的请求再放入Redis队列-Redis还负责存储去重集合(使用Set)以避免重复抓取因此,我们可以用文字描述架构图如下:```+-----------------++-----------------++-----------------+|Scrapy爬虫节点1||Scrapy爬虫节点2||Scrapy爬虫节点N|+-------+---------++-------+---------++-------+---------+||||(获取URL与提交新请求)|(获取URL与提交新请求)||||+------------+-----------+----------+-------------+|||Redis服务器||+----------------+|||请求队列||||(list:spider:requests)||||||||去重集合||||(set:spider:dupefilter)|||+----------------+|||+----------------------+```解释:1.Redis服务器作为中央数据存储,包含一个请求队列(通常是一个列表,用于存放待抓取的请求)和一个去重集合(用于存放已经抓取过的URL的指纹,避免重复)。2.多个Scrapy爬虫节点(分布式)连接到同一个Redis服务器。3.每个爬虫节点从Redis请求队列中获取URL(通过阻塞或非阻塞方式),然后进行网页抓取。4.抓取过程中,爬虫节点会解析页面,提取新的URL,并将其放入Redis请求队列中(同时去重集合确保不会重复添加相同的URL)。5.所有节点共享同一个请求队列,因此实现了任务的分发和协同。这种架构允许动态扩展爬虫节点,提高爬取效率。注意:由于我们没有实际图片,以上用ASCII字符画表示架构图。如果用户需要更专业的图,建议搜索相关的技术博客或官方文档,通常会有更清晰的示意图。根据引用[1]提到有对比的架构图,我们也可以简要描述Scrapy原生架构和Scrapy-Redis架构的不同:-Scrapy原生架构:单个节点:引擎、调度器(维护在内存中的队列和去重集合)、下载器、爬虫等。每个节点独立,无法与其他节点共享任务。-Scrapy-Redis架构:将调度器替换为基于Redis的调度器(从Redis获取请求,并将新请求放入Redis),去重也使用Redis的集合。因此多个节点可以共享同一个调度队列。生成相关问题:考虑到用户询问了架构图,可能接下来会想了解搭建步骤、配置方法或具体工作流程,因此可以生成以下问题:1.Scrapy-Redis架构中Redis存储的数据结构是怎样的?2.如何配置Scrapy项目以使用Scrapy-Redis?3.Scrapy-Redis的去重原理是什么?4.Scrapy-Redis相比原生Scrapy有哪些优势?但请注意,用户要求生成相关问题,并且按照示例格式在最后添加。因此,我们整理回答如下:</think> ### Scrapy-Redis 分布式爬虫框架架构解析 根据引用资料[1][2][3][4]的描述,Scrapy-Redis 架构的核心原理是通过 Redis 实现分布式调度。以下是架构示意图及关键组件解析: ``` +----------------------+ +----------------------+ | Scrapy爬虫节点1 | | Scrapy爬虫节点N | | +------------------+ | | +------------------+ | | | Scrapy引擎 | | | | Scrapy引擎 | | | | +----------+ | | | | +----------+ | | | | | Redis |←|←|←|←|←|←|←|←|←|→| Redis | | | | | | 调度器 | | | | | | 调度器 | | | | +----|----------|--+ | | +----|----------|--+ | +------|----------|-----+ +------|----------|-----+ ↑ ↓ ↑ ↓ +--|----------|------------------|----------|--+ | ↓ ↑ ↓ ↑ | | +-------------------+ +----------------+ | | | Redis数据库 | | 数据存储 | | | | • 待爬URL队列 | | (MySQL/MongoDB) | | | | • 去重指纹库 |←|←|←|←|←|←|←|←|←|←|←| | | | • 请求状态跟踪 | | | | | +-------------------+ +-----------------+ | +---------------------------------------------+ ``` #### 关键组件说明: 1. **Redis数据库**(核心组件): - 🧺 `待爬URL队列`:存储所有待抓取的URL(有序集合或列表结构) - 🔍 `去重指纹库`:存放URL的哈希值实现分布式去重[^2] - 📊 `请求状态跟踪`:记录各爬虫节点的任务状态 2. **改造后的调度器**: - 替换了Scrapy原生调度器,从Redis而非内存队列读取URL[^3] - 通过`redis_keys.py`定义队列键名(如 `'spider:requests'`) 3. **分布式爬虫节点**: - 多个节点同时从Redis队列获取URL[^4] - 抓取后新发现的URL回传到Redis队列 - 数据统一存储到数据库(如MySQL/MongoDB) 4. **数据管道**: - 解析后的数据不经过Redis,直接存储到目标数据库 - 支持分布式去重处理(基于Redis的Set结构) #### 工作流程: 1. 主节点将种子URL放入Redis队列 2. 所有爬虫节点竞争获取URL资源 3. 节点下载页面并解析数据 4. 新发现的URL经去重后存入Redis队列 5. 解析结果直接存入目标数据库 6. Redis持续分发新URL直至队列清空 > 该架构实现了"多对一"的调度模式:多个爬虫节点从单一Redis中心获取任务,解决了Scrapy原生架构无法跨机器调度的问题[^1][^3]。实际部署时需保证Redis服务的高可用性,并合理配置`CONCURRENT_REQUESTS`参数避免节点过载[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值