当前位置:首页>python>Python爬虫零基础实战⑬:Scrapy‑Redis分布式爬虫实战,多机协同、断点续爬、全局去重,突破单机采集上限

Python爬虫零基础实战⑬:Scrapy‑Redis分布式爬虫实战,多机协同、断点续爬、全局去重,突破单机采集上限

  • 2026-10-10 15:36:42
Python爬虫零基础实战⑬:Scrapy‑Redis分布式爬虫实战,多机协同、断点续爬、全局去重,突破单机采集上限

标签:#Python爬虫 #Scrapy‑Redis #分布式爬虫 #断点续爬 #全局去重 #大规模采集

前言

前面我们完整学习了Scrapy全套单机能力:项目搭建、XPath解析、自动分页、CSV/MySQL持久化、下载中间件(随机UA、代理IP、Selenium动态渲染)。单机爬虫足以应付中小型采集任务。

但遇到超大规模全站采集,单机就会遇到致命瓶颈:

❌ 单机CPU、带宽、并发数有限,海量数据爬取速度严重滞后

❌ 程序意外终止、服务器重启,内存任务全部丢失,只能从头重爬

❌ 多进程/多机器同时爬取,无统一任务管理,大量链接重复采集

想要实现企业级海量数据采集,必须解锁Scrapy终极能力——Scrapy-Redis分布式爬虫。

核心原理是将爬虫任务队列、URL去重指纹全部托管Redis,实现多机共享任务、全局唯一去重、断电重启续爬,彻底突破单机性能上限。本篇全程保姆级实操,从零部署、改造项目、调试运行,所有代码可直接落地复用!


一、分布式核心原理(零基础秒懂)

1、普通单机Scrapy痛点

任务队列、去重指纹全部存储在本地内存,程序关闭即清空,每一台电脑、每一个进程都是独立个体,无法互通任务。

2、Scrapy-Redis分布式核心优势

  • ✅ Redis中心调度:统一存储待爬请求、URL指纹、任务状态,所有爬虫节点共享

  • ✅ 多机协同抢任务:多台服务器、多进程同时工作,横向扩容提升爬取速度

  • ✅ 断点续爬:Redis持久化存储任务,重启爬虫不丢任务,无需重复全量爬取

  • ✅ 全局去重:所有节点共用一套指纹库,全网杜绝重复爬取

通俗理解:Redis是任务总指挥,所有爬虫节点是打工工人,统一派单、统一查重、任务永不丢失。


二、环境依赖一键安装

需要额外安装分布式核心组件与Redis客户端,使用清华镜像源提速,规避安装超时、失败问题:

pip install scrapy-redis pymysql redis -i https://pypi.tuna.tsinghua.edu.cn/simple/

依赖功能说明

✅ scrapy-redis:Scrapy分布式专属扩展框架,重构调度器与去重器

✅ redis:Python连接Redis服务的官方客户端

✅ pymysql:延续前文MySQL数据持久化能力,无缝兼容

额外必备:本地/服务器安装Redis服务,开启常驻运行,记住连接地址、端口。


三、分布式爬虫改造(核心代码)

普通Scrapy爬虫无法分布式运行,需要继承RedisSpider父类,替换原生爬虫模板,修改任务分发逻辑。直接替换spiders目录下爬虫全部代码:

import scrapyfrom scrapy_redis.spiders import RedisSpiderfrom my_spider.items import ArticleItemclass DistributeCrawlSpider(RedisSpider):    # 爬虫唯一名称    name = "distribute_spider"    # 限制爬取域名,防止跨站乱爬    allowed_domains = ["demo.scrapy.com"]    # 分布式核心:Redis任务key(所有节点共用)    redis_key = "spider:start_urls"    def parse(self, response):        # 解析列表页数据,逻辑与单机爬虫完全一致        article_list = response.xpath("//div[@class='list-item']")        for article in article_list:            item = ArticleItem()            item["title"] = article.xpath(".//h2/a/text()").get(default="")            item["link"] = article.xpath(".//h2/a/@href").get(default="")            item["publish_time"] = article.xpath(".//span[@class='time']/text()").get(default="")            item["desc"] = article.xpath(".//p[@class='desc']/text()").get(default="")            yield item        # 自动分页逻辑不变,新请求自动存入Redis队列        next_href = response.xpath("//a[contains(text(),'下一页')]/@href").get()        if next_href:            next_url = response.urljoin(next_href) yield scrapy.Request(url=next_url, callback=self.parse)

✅ 核心改造要点

1、废弃原生 scrapy.Spider,继承 RedisSpider 分布式父类;

2、删除 start_urls 初始链接,改为 redis_key 由Redis统一推送任务;

3、解析、分页、数据产出逻辑无需改动,无缝兼容旧业务代码。


四、settings.py分布式全局配置(必改)

在原有防爬、管道配置基础上,新增分布式核心配置,替换原有调度器、去重器,开启断点续爬。直接复制覆盖对应配置:

# ========== 分布式Redis核心配置 ==========# 启用Redis调度器(接管任务队列)SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 启用Redis全局去重器(接管URL指纹)DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 开启断点续爬:爬虫停止不清空Redis任务与指纹SCHEDULER_PERSIST = True# 优先级队列:高权重链接优先爬取SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"# Redis连接配置(根据自己服务修改)REDIS_HOST = "127.0.0.1"REDIS_PORT = 6379REDIS_PASSWORD = NoneREDIS_DB = 0# ========== 原有基础配置(保留不变) ==========ROBOTSTXT_OBEY = FalseCONCURRENT_REQUESTS = 4DOWNLOAD_DELAY = 1.5RETRY_ENABLED = TrueRETRY_TIMES = 3# 数据存储管道ITEM_PIPELINES = {    "my_spider.pipelines.CsvPipeline": 200,    "my_spider.pipelines.MysqlPipeline": 300,}# 防爬中间件(随机UA、代理IP继续生效)DOWNLOADER_MIDDLEWARES = {    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,    'my_spider.middlewares.RandomUserAgentMiddleware': 300,    'my_spider.middlewares.ProxyIpMiddleware': 400,}

核心参数解析

SCHEDULER_PERSIST = True:生产环境必开,爬虫 crash、重启、关机,任务队列和去重指纹永久保留,实现真正断点续爬。


五、分布式爬虫完整启动流程

分布式爬虫和单机爬虫启动逻辑完全不同,严格按照以下三步操作:

步骤1:启动Redis服务

确保本地/服务器Redis正常运行,端口开放、连接正常。

步骤2:启动所有爬虫节点(多机/多进程)

每一台工作机器、每一个进程都执行启动命令,进入监听等待状态:

scrapy crawl distribute_spider

步骤3:向Redis推送初始任务(启动爬虫)

所有节点就绪后,推送起始URL,所有节点自动抢任务、同步开工,两种方式任选其一:

方式一:redis-cli命令行推送(新手推荐)

lpush spider:start_urls "https://demo.scrapy.com/list"

方式二:Python脚本推送(自动化部署推荐)

import redisr = redis.Redis(host="127.0.0.1", port=6379, db=0, decode_responses=True)# 推送初始列表页链接r.lpush("spider:start_urls", "https://demo.scrapy.com/list")

推送瞬间,所有监听节点立刻开始分布式协同爬取,无需额外操作!


六、多机分布式部署实操规范

1、所有爬虫节点代码完全一致,保证解析规则、存储逻辑、配置统一;

2、所有节点Redis配置统一指向中心Redis服务器公网IP,禁止使用127.0.0.1;

3、服务器务必放行6379端口,设置Redis密码,禁止公网裸奔;

4、数据库统一接入中心MySQL服务,实现多机数据集中入库,方便统一管理;

5、无需手动分配任务,Redis自动负载均衡,节点越多,爬取速度越快。


七、Redis任务调试指令(必备运维技能)

连接redis-cli,可实时查看爬虫任务状态,方便排查问题:

# 查看初始任务列表lrange spider:start_urls 0 -1# 查看待爬取请求数量llen spider:requests# 清空所有任务(测试重置专用)del spider:start_urls spider:requests spider:dupefilter

字段说明

spider:requests:待爬取任务队列;spider:dupefilter:全局URL去重指纹集合。


八、新手高频踩坑避坑汇总

❌ 坑1:爬虫启动无任务、不爬取

排查redis_key名称是否和推送key一致、Redis网络是否连通、是否成功lpush推送链接。

❌ 坑2:多机运行重复爬取数据

未启用Redis去重器,确认settings中已替换 DUPEFILTER_CLASS 配置。

❌ 坑3:重启爬虫任务全部清空

未开启 SCHEDULER_PERSIST = True,同时需开启Redis RDB/AOF数据持久化。

❌ 坑4:外网机器无法连接Redis

修改Redis绑定IP、关闭保护模式、防火墙放行端口,配置访问密码。

❌ 坑5:搭配Selenium内存溢出

分布式节点不建议大量使用浏览器渲染,大规模场景建议解耦独立渲染服务,避免内存暴涨。


九、企业级进阶拓展思路

  • 1、增量分布式爬虫:仅推送新增列表链接,实现增量采集,减少重复消耗;

  • 2、任务优先级管控:核心高价值链接设置高优先级,优先采集落地;

  • 3、爬虫状态监控:实时读取Redis队列长度,监控任务剩余量、节点运行状态;

  • 4、动静分离架构:爬虫节点负责请求解析,独立服务处理JS渲染,提升集群稳定性。



文末结语

分布式爬虫是Scrapy技术栈的最终分水岭,也是企业爬虫开发的核心门槛。

单机爬虫只能应付小型测试场景,而Scrapy-Redis分布式集群,真正实现了海量数据、高速采集、稳定不崩、不重不漏的生产级能力。

至此,你已完整掌握Scrapy全体系技能:基础搭建、数据解析、自动分页、双渠道持久化、防爬中间件、动态渲染、分布式集群,完全具备企业爬虫开发能力!

最新文章

随机文章