Python利用Scrapy框架部署分布式爬虫

其实我们知道Scrapy框架本身并不直接支持分布式爬虫,但是我们可以借助Scrapy-Redis库来实现分布式爬虫。Scrapy-Redis利用Redis数据库作为共享队列,这样就可以允许多个Scrapy爬虫实例协同工作,最终从而实现分布式爬取。

在这里插入图片描述

使用Scrapy框架部署分布式爬虫,最主要依赖 Scrapy-Redis 库来实现任务分发和状态共享。以下是详细步骤和代码示例可以供大家参考:

核心原理

利用 Redis 数据库 作为共享队列,实现:

1、统一的任务调度(Scheduler)

2、分布式去重(Dupefilter)

3、数据汇总存储

部署步骤

1. 环境准备
pip install scrapy scrapy-redis redis

确保所有机器可访问 Redis 服务器(需提前安装并运行)。

2. 修改 Scrapy 项目
(1) settings.py 配置
# 启用 Scrapy-Redis 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 启用 Redis 去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 持久化任务队列(爬虫暂停后不丢失)
SCHEDULER_PERSIST = True

# Redis 连接设置
REDIS_HOST = '192.168.1.100'  # Redis 服务器 IP
REDIS_PORT = 6379
# REDIS_PASSWORD = 'your_password'  # 如果有密码

# 使用 RedisPipeline 存储数据
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300,
}

# 可选:爬虫起始键名(自定义)
REDIS_START_URLS_KEY = 'my_spider:start_urls'
(2) 爬虫文件(如 my_spider.py
from scrapy_redis.spiders import RedisSpider

class MyDistributedSpider(RedisSpider):
    name = 'distributed_spider'
    redis_key = 'my_spider:start_urls'  # 与 settings 中的键一致

    def parse(self, response):
        # 解析逻辑
        yield {
            'title': response.css('h1::text').get(),
            'url': response.url
        }
        # 提取新链接并加入队列
        for next_page in response.css('a::attr(href)').getall():
            yield response.follow(next_page, callback=self.parse)
3. 向 Redis 添加起始 URL

在 Redis 中插入起始 URL(所有爬虫从此处取任务):

redis-cli lpush my_spider:start_urls https://example.com/page1
redis-cli lpush my_spider:start_urls https://example.com/page2
4. 部署到多台机器

1、将项目代码复制到所有工作节点。

2、确保每台机器:

  • 能访问 Redis 服务器
  • 安装相同的 Python 依赖

3、在各节点启动爬虫:

scrapy crawl distributed_spider

高级配置

自定义调度队列

# settings.py
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'  # 默认优先级队列
# 可选:FifoQueue(先进先出), LifoQueue(后进先出)

增量爬取控制
设置 SCHEDULER_FLUSH_ON_START = True 启动时清空队列(默认 False)。

数据存储位置
爬取结果自动存入 Redis 键 distributed_spider:items(爬虫名作为前缀)。

监控与管理

1、查看 Redis 队列状态

redis-cli
> KEYS *  # 查看所有键
> LLEN my_spider:start_urls  # 查看待爬队列长度
> SMEMBERS distributed_spider:dupefilter  # 查看去重指纹集合

2、动态添加新任务

redis-cli lpush my_spider:start_urls "https://new-url.com"

常见问题解决

爬虫不工作

  • 检查 Redis 连接(防火墙、密码)。
  • 确认 redis_key 名称在爬虫和 Redis 中一致。

去重失效

  • 确保所有爬虫使用相同的 DUPEFILTER_CLASS

性能瓶颈

  • 增加 Redis 内存或使用集群。
  • 优化爬虫解析逻辑(避免阻塞操作)。

完整架构图

+----------------+      +----------------+      +----------------+
|  爬虫节点 1    |      |  爬虫节点 2    |      |  爬虫节点 N    |
| (运行Scrapy)   |      | (运行Scrapy)   | ...  | (运行Scrapy)   |
+-------+--------+      +-------+--------+      +-------+--------+
        |                       |                       |
        |      从Redis取任务      |                       |
        +------------+-----------+-----------------------+
                     |
              +------v------+
              |   Redis     |
              | (中央调度)   |
              +------+------+
                     |
              +------v------+
              | 数据存储/处理 | (如MySQL、MongoDB、文件)
              +-------------+

通过以上步骤,是不是觉得也不是很难,这样就可以让 Scrapy 爬虫即可实现分布式部署,轻松应对大规模数据抓取任务!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值