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 爬虫即可实现分布式部署,轻松应对大规模数据抓取任务!

相关推荐
冷雨夜中漫步8 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴8 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再8 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手10 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威11 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ12 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha12 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy12 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法