豆瓣Top250分布式爬虫实战|从单机到多机,Scrapy-Redis核心用法全拆解

张开发
2026/4/17 4:26:39 15 分钟阅读

分享文章

豆瓣Top250分布式爬虫实战|从单机到多机,Scrapy-Redis核心用法全拆解
豆瓣Top250分布式爬虫实战从单机到多机Scrapy-Redis核心用法全拆解今天带大家从零落地豆瓣电影Top250分布式爬虫全程对比普通单机爬虫与Scrapy-Redis分布式爬虫的差异嵌入完整对比代码、实操步骤拆解每一步推进逻辑避开实操坑点让大家既能看懂原理也能直接上手运行。本次实战核心目标用Scrapy-Redis将普通单机爬虫改造为分布式爬虫验证多机协同、自动去重、断点续爬的优势对比两者在代码、效率、容错性上的差异完成豆瓣Top250电影数据标题、导演、剧情简介的爬取与存储。实战环境2台Windows主机爬虫节点、1台Linux服务器部署Redis作为中央调度中心Python 3.9、Scrapy 2.8.0、Scrapy-Redis 0.7.2、Redis 6.2.6。一、前期准备单机vs分布式环境配置差异拆解在动手写代码前先明确两者的环境配置差异——普通单机爬虫无需依赖Redis而分布式爬虫的核心是“Redis中央调度”必须先完成Redis部署与多节点连通这是分布式爬虫能正常运行的前提。1.1 普通单机爬虫环境极简配置仅需在本地安装基础依赖无需配置Redis一行命令即可完成pipinstallscrapy配置完成后直接编写爬虫代码即可启动无需额外配置调度相关环境适合小规模爬取。1.2 分布式爬虫环境核心配置分布式爬虫需要“多节点Redis中央调度”分两步配置缺一不可第一步所有爬虫节点2台Windows主机安装依赖pipinstallscrapy scrapy-redis第二步Linux服务器部署Redis核心中央调度中心安装Redis后修改配置文件redis.conf关闭保护模式protected-mode no、允许远程连接bind 0.0.0.0、设置密码requirepass 你的密码避免未授权访问。开启Redis持久化RDBAOF确保断点续爬时进度不丢失配置save 60 10060秒内有100次修改则持久化开启appendonly yes。启动Redis服务开放对应端口默认6379确保两台爬虫节点能ping通Redis服务器且能正常连接Redis。关键差异普通单机爬虫“单节点无依赖”分布式爬虫“多节点Redis依赖”Redis的作用是统一管理任务队列、实现去重与断点续爬。二、代码编写从单机到分布式3处修改搞定改造附完整对比代码这是本次实战的核心的环节——分布式爬虫无需改动解析逻辑仅需修改3处调度相关代码就能将普通单机爬虫改造为分布式爬虫。下面直接上完整对比代码每一处差异都标红说明。2.1 普通单机爬虫完整代码douban_spider_single.pyimportscrapyfromDouban.itemsimportDoubanItem# 普通单机爬虫继承scrapy.SpiderclassMoviesSpider(scrapy.Spider):namemovies_single# 爬虫名称单机可随意命名allowed_domains[movie.douban.com]# 单机爬虫固定写死起始URL仅单台机器从该URL开始爬取start_urls[https://movie.douban.com/top250]# 列表页解析逻辑分布式无需修改defparse(self,response):lisresponse.xpath(//ol[classgrid_view]/li)forliinlis:hrefli.xpath(.//div[classhd]/a/href).get()titleli.xpath(.//div[classhd]/a/span[1]/text()).get()yieldscrapy.Request(href,callbackself.parse_detail,meta{title:title})# 详情页解析逻辑分布式无需修改defparse_detail(self,response):# 解析导演处理可能的空值避免报错directorresponse.xpath(//*[idinfo]/span[1]/span[2]/a/text()).get()or未知# 解析剧情简介去除空格、换行summaryresponse.xpath(//div[idlink-report-intra]/span[propertyv:summary]/text()).get()or无简介summarysummary.strip().replace(\n,).replace( ,)# 输出数据yieldDoubanItem(titleresponse.meta[title],directordirector,summarysummary)2.2 分布式爬虫完整代码douban_spider_distributed.pyimportscrapyfromDouban.itemsimportDoubanItem# 分布式爬虫导入RedisSpider核心修改1fromscrapy_redis.spidersimportRedisSpider# 分布式爬虫继承RedisSpider核心修改1classMoviesSpider(RedisSpider):namemovies_distributedallowed_domains[movie.douban.com]# 分布式爬虫删除start_urls核心修改2避免多节点重复爬取# start_urls [https://movie.douban.com/top250] # 注释掉禁止写死# 分布式爬虫添加redis_key核心修改3作为任务队列名称redis_keyafei# 所有节点都监听这个队列领取任务# 列表页解析逻辑与单机完全一致无需修改defparse(self,response):lisresponse.xpath(//ol[classgrid_view]/li)forliinlis:hrefli.xpath(.//div[classhd]/a/href).get()titleli.xpath(.//div[classhd]/a/span[1]/text()).get()yieldscrapy.Request(href,callbackself.parse_detail,meta{title:title})# 补充下一页URL解析单机可加可不加分布式必须加确保任务持续推进next_urlresponse.xpath(//span[classnext]/a/href).get()ifnext_url:next_urlhttps://movie.douban.com/top250next_urlyieldscrapy.Request(next_url,callbackself.parse)# 详情页解析逻辑与单机完全一致无需修改defparse_detail(self,response):directorresponse.xpath(//*[idinfo]/span[1]/span[2]/a/text()).get()or未知summaryresponse.xpath(//div[idlink-report-intra]/span[propertyv:summary]/text()).get()or无简介summarysummary.strip().replace(\n,).replace( ,)yieldDoubanItem(titleresponse.meta[title],directordirector,summarysummary)2.3 核心修改点总结3处必记修改位置普通单机爬虫分布式爬虫修改原因继承类scrapy.Spiderscrapy_redis.spiders.RedisSpider让爬虫具备分布式调度能力能够监听Redis任务队列起始URLstart_urls [“xxx”]写死删除start_urls避免多节点同时从起始URL爬取导致数据重复任务队列无redis_key “afei”所有节点监听该队列统一领取任务实现中央调度关键提醒解析逻辑parse、parse_detail完全不变分布式只改“调度方式”不改“爬取逻辑”这也是Scrapy-Redis的便捷之处。三、配置优化settings.py配置对比单机vs分布式除了爬虫代码settings.py的配置也有差异主要集中在Redis相关配置与去重、管道配置直接上对比配置复制即可使用。3.1 普通单机爬虫settings.py核心配置# 基础配置BOT_NAMEDoubanSPIDER_MODULES[Douban.spiders]NEWSPIDER_MODULEDouban.spiders# 反爬配置单机、分布式通用USER_AGENTMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36ROBOTSTXT_OBEYFalse# 不遵守robots协议豆瓣robots禁止爬取需关闭DOWNLOAD_DELAY1# 请求间隔1秒避免触发反爬# item管道配置单机可存入本地文件ITEM_PIPELINES{Douban.pipelines.DoubanPipeline:300,}# 单机爬虫无需Redis相关配置3.2 分布式爬虫settings.py核心配置# 基础配置与单机一致BOT_NAMEDoubanSPIDER_MODULES[Douban.spiders]NEWSPIDER_MODULEDouban.spiders# 反爬配置与单机一致需严格配置避免多节点触发反爬USER_AGENTMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36ROBOTSTXT_OBEYFalseDOWNLOAD_DELAY1# 多节点需保持一致避免请求过于密集# 分布式核心配置Redis相关新增REDIS_URLredis://:你的密码Redis服务器IP:6379/0# 连接RedisREDIS_PARAMS{password:你的密码}# 额外密码配置双重保障# 分布式核心配置自动去重新增DUPEFILTER_CLASSscrapy_redis.dupefilter.RFPDupeFilter# Redis自动去重SCHEDULERscrapy_redis.scheduler.Scheduler# 使用Redis调度器SCHEDULER_PERSISTTrue# 调度器持久化实现断点续爬# item管道配置分布式建议存入Redis/MySQL统一管理数据ITEM_PIPELINES{# 存入Redis管道Scrapy-Redis自带scrapy_redis.pipelines.RedisPipeline:300,# 如需存入MySQL可添加自定义管道优先级低于Redis管道# Douban.pipelines.DoubanMysqlPipeline: 400,}四、实战启动单机vs分布式启动流程对比附命令配置与代码都完成后分别启动单机与分布式爬虫对比启动流程与运行效果直观感受两者的差异。4.1 普通单机爬虫启动单节点启动流程极简无需启动Redis直接在项目根目录执行命令scrapy crawl movies_single运行效果单台机器从start_urls开始串行爬取列表页→详情页爬取过程中若中断只能重新启动进度丢失且无法多机协同爬取速度慢。4.2 分布式爬虫启动多节点Redis分布式启动分3步必须按顺序执行否则无法正常运行启动Redis服务Linux服务器推入起始URLRedis客户端任意节点执行均可启动所有爬虫节点2台Windows主机分别执行运行效果两台节点同时监听Redis的“afei”队列领取任务起始URL、详情页URL、下一页URL一台节点爬取列表页另一台爬取详情页互不干扰任务完成后自动领取新任务实现多机协同。五、实战验证核心优势对比启动后分别运行单机与分布式爬虫爬取豆瓣Top250全部数据对比两者的核心指标验证分布式爬虫的优势结果如下表所示对比指标普通单机爬虫Scrapy-Redis分布式爬虫2节点优势体现爬取耗时约40分钟约15分钟多机协同速度提升60%数据重复率若多开进程重复率100%0%Redis自动去重避免重复爬取节省资源断点续爬无中断后需重新爬取有重启后继续未完成任务容错性强避免进度丢失任务管理无只能本地查看进度Redis实时查看任务队列、已完成任务便于监控适合大规模爬取扩展性无法扩展只能单台运行可新增节点速度随节点数量提升适配大规模数据爬取场景六、实操坑点拆解避坑必看结合本次实战整理了4个分布式爬虫高频坑点单机爬虫基本不会遇到大家实操时重点注意坑点1Redis连接失败 → 排查3点Redis服务器防火墙是否开放6379端口、配置文件是否允许远程连接、密码是否正确建议用redis-cli测试连接telnet RedisIP 6379。坑点2多节点重复爬取 → 大概率是忘记删除start_urls或redis_key不一致确保所有节点的redis_key相同且未写死start_urls。坑点3IP被豆瓣封禁 → 分布式多节点请求密集更容易触发反爬除了设置DOWNLOAD_DELAY建议配置IP代理池、User-Agent池避免单一IP/UA过度请求。坑点4断点续爬失效 → 未开启SCHEDULER_PERSIST True或Redis未配置持久化导致任务队列丢失需同时开启调度器持久化与Redis持久化。七、实战总结与拓展本次实战通过对比普通单机爬虫与Scrapy-Redis分布式爬虫清晰掌握了分布式爬虫的核心原理与实操技巧总结核心要点核心差异单机爬虫“单节点、无调度、无容错”适合小规模爬取分布式爬虫“多节点、Redis中央调度、自动去重、断点续爬”适合大规模爬取。改造关键仅需3处代码修改继承类、删除start_urls、添加redis_key解析逻辑不变开发成本低。核心原理Scrapy-Redis将Scrapy的任务队列、去重、调度功能迁移至Redis实现多节点共享任务协同工作。拓展方向性能优化新增更多爬虫节点配置动态IP代理池进一步提升爬取速度。数据存储将Redis中的数据导入MySQL、MongoDB便于后续数据查询与分析。监控优化搭建Redis监控面板实时查看任务进度、节点运行状态及时排查问题。本次实战代码为scrapy中的主python文件需要完整项目模板含items.py、pipelines.py的同学评论区留言“豆瓣分布式”我会统一回复。关注我后续持续分享爬虫实战、数据采集相关技巧避开更多坑点

更多文章