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

相关推荐
“AI国潮设计-小江”6 分钟前
AIGC实战:Python+SDXL批量生成英歌舞IP立牌,解锁猪猪蛋糕“反差萌”流量密码(附完整API源码)
开发语言·人工智能·python·prompt·aigc
成信吴彦祖26 分钟前
当前专业的无人机RID侦测主站供应商主要有哪些
python·1024程序员节
编程的一拳超人34 分钟前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
fanruitian44 分钟前
python anaconda jupyter notebook
python
云和数据.ChenGuang1 小时前
Python 菜鸟入门:字典(dict)类型详解与 CRUD 实战案例
开发语言·人工智能·python
小白今天也很酷1 小时前
MCXN947更新板载DAP_Link固件的方法
c语言·python·单片机·ubuntu·excel·1024程序员节
小羊没烦恼!1 小时前
.NET无侵入自动化探针原理和主流实现
运维·开发语言·javascript·python·自动化·.net·1024程序员节
立康科普1 小时前
含多肽钙的补钙产品是什么?和普通钙片有什么区别?
python·1024程序员节
“AI国潮设计-小江”10 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy10 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh