标签:#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全体系技能:基础搭建、数据解析、自动分页、双渠道持久化、防爬中间件、动态渲染、分布式集群,完全具备企业爬虫开发能力!