一、概要

1.分布式爬虫概念

        分布式爬虫是一种利用多台机器协同工作的网络爬虫系统,通过任务分解、并行处理和资源共享,高效抓取并处理海量网页数据。其核心在于将爬取任务分配到不同节点,避免单点性能瓶颈,同时支持动态扩展和容错机制,适用于大规模数据采集场景。

        在爬虫众多框架中,scrapy-redis是最常用的实现分布式爬虫的框架,它区别于之前我们学习的scrapy,它将Redis作为他的调度器队列,所有的请求对象均从Redis获取,Redis的set集合会自动对所有请求对象进行去重,从实现了多台机器同时爬取和断点续爬的功能。

2.分布式爬虫流程

        下图形象的展示了scrapy-redis的工作流程,可以看到和我们之前的scrapy的spider,schedule换了个方向,spider被放到了最上方。

        下面这个图更加形象的展示四台主机同时连接Redis服务器进行爬虫的过程。当然我们也可以扩充到多台主机的情况。在scrapy-redis中,Redis服务端被称作master主机,而把用于跑爬虫程序的机器称为slave。

        简要概括,scrapy-redis的工作流程如下:

  1. 调度器共享:所有爬虫实例共享同一个 Redis 中的请求队列,新发现的 URL 会被统一存入队列。
  2. 请求去重:利用 Redis 的集合结构(Set)对请求 URL 进行全局去重,避免重复爬取。
  3. 任务分配:各爬虫从 Redis 队列中竞争获取待爬 URL,实现负载均衡。
  4. 数据存储:爬取到的数据可统一存入 Redis 或其他存储系统(如数据库)。
  5. 断点续传:Redis 持久化保存爬取进度,支持暂停后恢复。

二、分布式爬虫准备

1.准备工作

        我们准备三台电脑进行分布式爬取,(忽略图中的centos),其中远程Ubuntu16.04作为我们的Redis服务器(master端),不负责爬取,只负责数据的分配。而使用Windows和另外一台本地虚拟机Ubuntu16.04作为slaver端进行爬虫的执行。

        

           

2.Master端配置

        首先我们在远程ubuntu服务器上安装Redis,命令如下:

sudo apt install redis-server

        接下来我们尝试打开redis-cli,并ping,如果返回pong就说明安装成功了。命令如下:

redis-cli
ping

        接下来我们要配置Redis,允许远程主机连接。操作如下:

sudo vi /etc/redis/redis.conf

               第一步,将bind 127.0.0.1注释掉。

        第二步,将protected mode从yes改成no。关闭保护模式。

        然后按ESC,输入:wq!保存,输入下面命令重启Redis即可。

sudo systemctl restart redis-server

       然后准备好Redis的主机IP地址,后续连接需要要到。

        如果你是远程Redis的话,不要忘了关闭防火墙,并开放相应的6379端口。本地的话就不用了。

3.Slaver端配置

        首先我们给两台slaver分别安装上scrapy和scrapy-redis,注意scrapy安装2.8以下的版本,这样才能和scrapy-redis兼容,scrapy-redis安装最新版本即可。输入以下命令即可安装。

        注意!!!这里一定要重新安装twisted旧版本,因为新版本的scrapy不兼容。所以下图的命令还要再加一个。

pip install twisted==22.10.0

        安装完成之后接下来我们测试一下两台slaver能否正常连接Redis服务器。

        可以直接在slaver端装上Redis的图形化界面控制端,用来测试Redis的连接。当然,如果是ubuntu,也可以通过运行Python脚本来测试是否能够正常连接Redis。这里给出方法:

  •  对于Windows

        安装包:https://wwql.lanzout.com/b052o0lmf,密码:3rsj。

        链接中包含redis图形化界面和redis安装包,我们只需要安装图形化界面即可。我这里临时测试,就不下载工具了,直接用PyCharm的自带的Redis链接工具连接了。如果你对PyCharm不太熟悉,建议直接使用图形化界面。

        下面给出在PyCharm中链接Redis的方法:

  • 对于Ubuntu

        我们采用一个简单的Python脚本来测试是否能够正常连接Redis服务器。脚本如下,注意主机和其它选项要改成你自己的:

import redisdef test_redis_connection(host, port=6379, password=None, db=0):"""测试Redis连接:param host: Redis服务器地址:param port: 端口 (默认6379):param password: 密码 (可选):param db: 数据库编号 (默认0)"""try:# 创建Redis连接r = redis.Redis(host=host,port=port,password=password,db=db,socket_timeout=3  # 3秒超时)# 发送PING命令测试连接response = r.ping()if response:print(f"✅ 连接成功!Redis版本: {r.info()['redis_version']}")return Trueexcept Exception as e:print(f"❌ 连接失败: {str(e)}")return Falseif __name__ == "__main__":# 在此处填写Redis连接信息HOST = "your_redis_host"  # 替换为实际主机IP/域名PORT = 6379               # 替换为实际端口PASSWORD = None           # 如有密码,替换为字符串(如: "mypassword")DB = 0                    # 替换为实际数据库编号# 执行测试test_redis_connection(host=HOST,port=PORT,password=PASSWORD,db=DB)

三、分布式爬虫实现

        scrapy-redis的分布式爬虫实现步骤可以总结为以下几步:

  1.         编写scrapy爬虫项目
  2.         更换默认spider父类为Redis类
  3.         修改配置文件setting.py
  4.         设置起始url的key 为[top250:start_urls]  

1.爬虫生成

        这里我们用最经典的豆瓣电影top250作为示例。首先在控制台输入下面命令生成爬虫项目。

#创建项目
scrapy startproject douban
cd douban
#创建Spider
scrapy genspider movie_rank movie.douban.com

        生成的项目目录如下:

        接着这里我直接复制使用之前已经写好了的豆瓣top250爬虫逻辑,建议先提前将基础爬虫逻辑用scrapy写完,然后修改成scrapy-redis即可。

     具体的代码逻辑可以直接参考我之前的文章,scrapy爬取豆瓣250。

2.修改父类

        打开movie_rank.py,导入Scrapy_redis的redis-spider,然后让爬虫类继承它。

3.修改setting.py

        打开settings.py文件,将以下设置覆盖掉,使用scrapy-redis的配置,不建议将管道添加Redis,因为Redis适合存取常用数据。Redis地址要记得换成自己的。

# Obey robots.txt rules
# 关闭遵守协议
ROBOTSTXT_OBEY = False
# 持久化配置
SCHEDULER_PERSIST = True
# 使用scrapy - redis调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# scrapy - redis指纹过滤器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# redis链接地址
REDIS_URL ='redis://127.0.0.1:6379/0'
# 任务的优先级别
SCHEDULER_QUEUE_CLASS ='scrapy_redis.queue.PriorityQueue'
# 存放的管道,可以开通第一个,数据会保存到redis,但不建议这么做
ITEM_PIPELINES = {# 'scrapy_redis.pipelines.RedisPipeline': 300,'douban.pipelines.DoubanPipeline': 301,
}
# 请求头
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q = 0.9,*/*;q = 0.8','Accept - Language': 'en','User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}

4.设置起始url的key

        因为我们的爬取URL都是要从Redis获取的,所有我们不需要手动设置起始的URL,也就是START_URL,在scrapy-Redis中,只需要设置redis-key,scrapy就会自动去Redis中寻找起始的url。操作如下:

        

# 前面是爬虫名,后面是固定start_urls
redis_key = 'movie_rank:start_urls'

5.slaver1测试

        接下来我们可以尝试运行slaver1的scrapy-redis项目。

scrapy crawl movie_rank

        可以看到卡在了此处,因为程序正在等待我们向Redis中添加起始URL。

         我们现在尝试使用Python脚本在Redis中添加Redis_key作为起始URL。

import redis# 连接到Redis
r = redis.Redis(host='127.0.0.1', port=6379)# 添加起始URL
r.lpush('movie_rank:start_urls', 'https://book.douban.com/top250')

        可以看到爬虫自动读取到了我们添加的URL,不过抓取失败了,因为400错误码,我们的请求头有问题。在scrapy-Redis中,默认的请求头是scrapy-Redis,我们需要修改它。

        我们在中间件中重写下载器中间件的请求头,示例代码如下:

class DoubanDownloaderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the downloader middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_request(self, request, spider):# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# - or return a Response object# - or return a Request object# - or raise IgnoreRequest: process_exception() methods of#   installed downloader middleware will be calledrequest.headers.setdefault('User-Agent', self.get_random_ua())print(request.headers)return Nonedef get_random_ua(self):# 随机 User-Agent 列表user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36']return random.choice(user_agents)

        然后再设置中启用中间件,再次运行可以看到成功拿到数据了。

6.slaver2测试
        接下来我们来调试slaver2,slaver2使用的是Ubuntu16.04操作系统,所以需要提前准备好Python解释器和其他配置项。这里就不多加赘述了。

        然后将我们之前的项目全部打包放入任意位置。不需要做任何修改,直接运行爬虫即可。这里就不再演示,大家可以自己尝试一下。

四、总结

最后附上源码地址:豆瓣读书分布式爬虫: 采用scrapy-Redis实现豆瓣阅读分布式爬虫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920146.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920146.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920146.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机智能化交通红绿灯堵车流量红外设计

1 系统功能介绍 本设计题目为 基于51单片机智能化交通红绿灯堵车流量红外设计,主要用于十字路口交通信号智能控制,通过红外避障检测车流量,自动调节红绿灯时间,缓解拥堵。该系统由单片机、LED灯、红外避障传感器、LCD1602液晶显示…

VsCode 上的Opencv(C++)环境配置(Linux)

1.下载Opencv1.新建文件demo_cpp,在demo_cpp中新建third_parties文件2.OPENCV官网下载OpenCV-4.12.03.将下载好的opencv-4.12.0.zip压缩包在third_parties中解压,//以下均无特殊说明,均在vscode里的TERMINAL中输入 sudo apt-get install unzip//用于解压.zip文件 cd third_part…

sql xml模板

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"com.example.mapper.UserMapper&quo…

docker在自定义网络中安装ElasticSearch和Kibana

创建自定义网络 创建一个名为 es-net 的桥接网络。这将作为 Elasticsearch 和 Kibana 的私有通信通道。 # 创建网络 docker network create es-net # 查看网络是否创建成功 docker network ls启动 Elasticsearch 容器 安装命令 docker run -d \--name elasticsearch \--net…

基于51单片机射频RFID停车刷卡计时收费系统设计

1 系统功能介绍 本设计题目为 基于51单片机射频RFID停车刷卡计时收费系统设计&#xff0c;旨在实现停车场车辆的刷卡计时和收费管理。系统通过单片机控制&#xff0c;结合 RFID 射频识别技术、LCD1602 显示以及蜂鸣器报警&#xff0c;实现停车时间的智能计时、累加及超时提醒功…

Netty源码—性能优化和设计模式

1.Netty的两大性能优化工具 (1)FastThreadLocal FastThreadLocal的作用与ThreadLocal相当&#xff0c;但比ThreadLocal更快。ThreadLocal的作用是多线程访问同一变量时能够通过线程本地化的方式避免多线程竞争、实现线程隔离。 Netty的FastThreadLocal重新实现了JDK的ThreadLoc…

Linux网络设备分析

🐧 Linux 网络设备驱动深入分析 本文将详细分析 Linux 网络设备驱动的工作原理、实现机制和代码框架,并通过一个虚拟网卡实例展示其实现,最后介绍常用的工具和调试手段。 1️⃣ Linux 网络设备驱动概述 Linux 网络设备驱动是内核中负责管理网络硬件(如以太网卡、Wi-Fi …

计算机视觉:从 “看见” 到 “理解”,解锁机器感知世界的密码

早上醒来&#xff0c;你拿起手机&#xff0c;人脸识别瞬间解锁屏幕&#xff1b;开车上班时&#xff0c;车载系统通过摄像头实时识别车道线&#xff0c;提醒你不要偏离&#xff1b;去医院做检查&#xff0c;医生用 AI 辅助的医学影像系统快速定位肺部微小结节&#xff1b;逛超市…

深入了解linux系统—— 线程封装

C11线程库 C11也提供了对应的线程库&#xff0c;在头文件<thread>中&#xff1b;C11将其封装成thread类&#xff0c;通过类实例化出对象&#xff0c;调用类内成员方法进行线程控制。 #include <iostream> #include <thread> #include <unistd.h> using…

安全防御-SCDN如何保护网站安全

随着互联网的快速发展&#xff0c;越来越多的企业依赖在线服务来运行其核心业务。与此同时&#xff0c;网络攻击的频率和复杂性也在不断增加&#xff0c;恶意流量成为许多企业头疼的问题。为了有效地提高网站的安全性和稳定性&#xff0c;德迅云安全加速SCDN被许多用户关注。今…

运筹优化(OR)-在机器学习(ML)浪潮中何去何从?

在如今机器学习的浪潮中&#xff0c;机器学习相关的岗位日益增多&#xff0c;而运筹优化的岗位却相对较少。这是今年我秋招过程中看到的现象。企业越来越希望候选人不仅能建模求解&#xff0c;还能理解如何用数据驱动优化。需要我们有一个完整的技术栈。那么我们就来看看OR与ML…

GitHub Copilot 在 VS Code 上的终极中文指南:从安装到高阶玩法

GitHub Copilot 在 VS Code 上的终极中文指南&#xff1a;从安装到高阶玩法 前言 GitHub Copilot 作为 AI 编程助手&#xff0c;正在彻底改变开发者的编码体验。本文将针对中文开发者&#xff0c;深度解析如何在 VS Code 中高效使用 Copilot&#xff0c;涵盖基础设置、中文优化…

安全测试、web探测、httpx

&#x1f4a2; 简介 httpx 是一个快速且多用途的HTTP工具包&#xff0c;允许使用retryablehttp库运行多个探测器。它旨在通过增加线程数量来保持结果的可靠性。 功能 &#x1f92a; 发送 GET、POST、PUT、DELETE 等 HTTP 请求支持流式传输支持重定向支持身份验证支持代理支持 …

CNN 中 3×3 卷积核等设计背后的底层逻辑

为什么卷积核爱用 33&#xff1f;CNN 设计 “约定俗成” 的底层逻辑 做深度学习的同学&#xff0c;对 CNN 里 33 卷积核、最大池化、BN 层这些设计肯定不陌生&#xff0c;但你有没有想过&#xff1a;为啥卷积核总选 33&#xff1f;池化层为啥默认最大池化&#xff1f;BN 层又是…

税务岗位职场能力解析与提升路径规划

税务岗位作为企业运营的核心环节之一&#xff0c;对从业者的专业能力与综合素质要求极高。从基础税务核算到战略税务筹划&#xff0c;职场能力的提升需要系统化的路径规划。以下从核心能力、阶段化提升路径及证书价值三个维度展开分析。核心能力体系构建专业税务能力是基础&…

MySQL 索引:结构、对比与操作实践指南

MySQL系列 文章目录MySQL系列前言案例一、认识MySQL与磁盘1.1 MySQL与存储1.2 MySQL 与磁盘交互基本单位二、 MySQL 数据交互核心&#xff1a;BufferPool 与 IO 优化机制三、索引的理解3.1 测试案例3.2 page3.3 页目录3.3 对比其他结构四、聚簇索引 VS 非聚簇索引五、索引操作5…

GitHub 热榜项目 - 日榜(2025-08-24)

GitHub 热榜项目 - 日榜(2025-08-24) 生成于&#xff1a;2025-08-24 统计摘要 共发现热门项目&#xff1a;20 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术热点&#xff1a;1&#xff09;AI应用爆发式创新&#xff0c;包括神经拟真伴侣&#…

纯净Win11游戏系统|24H2专业工作站版,预装运行库,无捆绑,开机快,游戏兼容性超强!

哈喽&#xff0c;大家好&#xff01; 今天给大家带来一款 Windows 11 游戏版本系统镜像&#xff0c;软件已放在文章末尾&#xff0c;记得获取。 一、软件获取与启动 解压后双击exe即可直接运行&#xff0c;无需额外安装。首次启动界面简洁&#xff0c;引导清晰。 二、系统选…

CI/CD 学习之路

目录 简介&#xff1a; 1、工具介绍&#xff1a; 2、搭建jenkins 1&#xff09;创建一个文件Dockerfile&#xff0c;文件无后缀&#xff0c;写入以下代码 2&#xff09;在Dockerfile文件所在目录执行&#xff08;my-jenkins-android 未自定义镜像名称&#xff09; 3&#xf…

马斯克宣布开源Grok 2.5:非商业许可引争议,模型需8×40GB GPU运行,Grok 3半年后开源

昨晚&#xff0c;马斯克在 X 平台连续发布多条消息&#xff0c;宣布其人工智能公司 xAI 已正式开源 Grok 2.5 模型。这款模型是 xAI 在 2024 年的主力模型&#xff0c;如今完全向公众开放。与此同时&#xff0c;马斯克还预告了下一代模型 Grok 3 的开源计划&#xff0c;预计将在…