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 配置
ini 复制代码
# 启用 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
python 复制代码
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(所有爬虫从此处取任务):

arduino 复制代码
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

高级配置

自定义调度队列

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

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

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

监控与管理

1、查看 Redis 队列状态

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

2、动态添加新任务

arduino 复制代码
redis-cli lpush my_spider:start_urls "https://new-url.com"

常见问题解决

爬虫不工作

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

去重失效

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

性能瓶颈

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

完整架构图

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

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

相关推荐
程序员小远5 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
心无旁骛~6 小时前
python多进程和多线程问题
开发语言·python
星云数灵6 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
计算机毕设匠心工作室6 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥6 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
计算机毕设小月哥8 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
Keep_Trying_Go8 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
计算机毕设匠心工作室9 小时前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
Trouville0110 小时前
Pycharm软件初始化设置,字体和shell路径如何设置到最舒服
ide·python·pycharm