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

相关推荐
卷无止境3 分钟前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境9 分钟前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12313 分钟前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102161 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb001 小时前
一个项目带你入门AI应用开发01
python
0566461 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔2 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
0566462 小时前
Python康复训练——控制流与函数
开发语言·python·学习
天使day2 小时前
FastAPI快速入门
python·fastapi
databook2 小时前
用相关性分析消除“冗余特征”
python·机器学习·scikit-learn