爬虫工作量由小到大的思维转变---<第三十七章 Scrapy redis里面的key >

前言:

终于找到机会,开始把scrapy-redis细致地给大伙通一通了! 为什么非要细致讲scrapy-redis呢?

  • 1.市面上关于scrapy-redis的教程,都比较笼统; demo级别好写,但是一旦上了项目,就问题百出!
  • 2.scrapy-redis里面的思路,其实跟单个爬虫或者集合式爬虫他的思路有点不一样;

正文:

在使用Scrapy-Redis进行Scrapy分布式爬虫时,Redis中会出现一些特定的key,用于存储爬虫在运行过程中所需的数据。其中两个重要的key是"爬虫名:dupefilter"和"爬虫名:requests"。

  1. "爬虫名:dupefilter":

    • 功能:该key用于存储去重集合,用来避免在分布式爬取过程中重复请求相同的URL。
    • 工作原理:当爬虫向Redis请求队列添加一个新的请求时,它会先检查该请求是否已经存在于去重集合中。如果已经存在,则该请求会被忽略,不会再次被添加到队列中。如果该请求不存在于去重集合中,才会将其加入待抓取队列,并将其标记在去重集合中,以避免未来重复抓取。
  2. "爬虫名:requests":

    • 功能:该key用于存储待抓取请求队列,实际上是一个列表结构。
    • 工作原理:所有从spider发出且尚未被执行的Requests都会被序列化后存储在这个列表中。Scrapy-Redis的爬虫实例会不断从这个队列中取出Requests来执行。当一个Requests被取出并由某个爬虫实例成功抓取后,它就会从队列中移除。这样,即使有多个爬虫实例在运行,它们可以共享这个请求队列,实现分布式爬取的效果。

通过合理使用这两个key,Scrapy-Redis能够实现分布式爬虫的高效并发和去重处理。通过去重集合的机制,避免了重复请求相同的URL,提高了爬取效率。同时,利用请求队列的机制,多个爬虫实例可共享相同的待抓取请求,实现分布式集群化爬取,进一步加速数据采集过程。

案例说明:

spider.py


import scrapy
from scrapy_redis.spiders import RedisSpiderclass MySpider(RedisSpider):name = 'my_spider' # 爬虫名称allowed_domains = ['example.com'] # 允许爬取的域名列表def parse(self, response):# 解析响应数据的代码逻辑# ...# 获取详情页URLdetail_urls = response.xpath('//a[@class="detail-link"]/@href').getall()# 将解析到的详情页URL加入Redis请求队列for url in detail_urls:yield scrapy.Request(url, callback=self.parse_detail)def parse_detail(self, response):# 解析详情页面的代码逻辑# ...def make_request_from_data(self, data):url = data.decode('utf-8')return scrapy.Request(url, callback=self.parse_detail)def start_requests(self):# 起始URLurl = 'http://example.com'yield scrapy.Request(url, callback=self.parse)def redis_key(self, spider):# 设置Redis key为 "jihaiend2:requests"return f'{spider}:requests'

settings.py

REDIS_HOST = 'localhost' # Redis主机地址
REDIS_PORT = 6379 # Redis端口
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 去重过滤器类
SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 调度器类
SCHEDULER_PERSIST = True # 设置为True,保持爬虫状态持久化
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue' # 队列调度器类
main.pyfrom scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settingsspider = MySpider() # 创建爬虫实例
process = CrawlerProcess(get_project_settings()) # 创建爬虫进程
process.crawl(spider) # 添加爬虫到进程
process.start() # 启动爬虫进程进行爬取

对这两个keys的操作:

在Scrapy-Redis中,可以通过以下方式对 "dupefilter" 和 "requests" 这两个关键Key进行操作:

  1. 对 "dupefilter"(去重集合)的操作:

    • 添加请求:在爬虫代码中,在发送请求之前,可以通过调用 request.dont_filter = False 来确保该请求被添加到去重集合中。
    • 检查请求是否重复:Scrapy-Redis会自动检查请求的URL是否已经存在于去重集合中,如果存在,则认为该请求是重复的,不会被发送。这样可以避免重复请求相同的URL。
  2. 对 "requests"(待抓取请求队列)的操作:

    • 添加请求:在爬虫代码中,通过调用 yield scrapy.Request(url, callback=callback_function) 来将请求加入到Redis的请求队列中。其中 url 是要抓取的URL,callback_function 是对应的回调函数,用于处理该请求的响应。
    • 获取请求:爬虫实例会从Redis的请求队列中获取待抓取的请求,并将其分配给相应的回调函数进行处理。
    • 处理请求:在回调函数中,可以对从请求队列中获取的请求进行解析、处理和提取数据等。

通过上述操作,我们可以很方便地对这两个关键Key进行操作,实现分布式爬虫的去重和请求共享功能。Scrapy-Redis会自动处理 "dupefilter" 的去重机制和 "requests" 的请求队列,无需手动管理和操作。

如果你发现,你的redis里面并没有出现这两个keys,那么如何排查呢?

排查问题:

当 "dupefilter"(去重集合)和 "requests"(待抓取请求队列)这两个关键Key出现异常时,最可能的问题源头可以在以下几个方面:

  1. 配置错误:检查Scrapy-Redis的配置是否正确设置。确保在settings.py文件中正确配置了Redis的连接信息、去重过滤器、调度器和队列调度器等相关设置

  2. Redis连接问题:如果无法连接到Redis服务器,就无法正确使用这两个关键Key。检查Redis的主机地址、端口以及身份验证等连接参数是否正确,并确保Redis服务器正在运行。

  3. 网络通信问题:如果Scrapy爬虫无法与Redis服务器进行通信,可能是由于网络配置或防火墙等原因导致的。确保Redis服务器对Scrapy爬虫所在的机器可访问,并允许相应的端口通信。

  4. 错误的Key名称:如果 "dupefilter" 和 "requests" 的Key名称配置不正确,Scrapy-Redis将无法找到相应的Key,并可能导致异常。请确保将这两个Key的名称配置正确,并与Redis中对应的Key名称匹配。

  5. 异步任务处理问题:Scrapy-Redis通过异步任务处理请求队列和去重集合,在某些情况下,可能会有一些异步任务处理失败或超时。在这种情况下,需要检查和调整异步任务处理的相关设置,例如提高超时时间或增加异步任务处理的并发能力。

以上是一些常见的问题源头,可能导致 "dupefilter" 和 "requests" 这两个关键Key出现异常。在调试和排查问题时,应仔细检查并排除可能出现问题的这些方面,并确保正确配置和使用Scrapy-Redis的相关组件和功能。

 

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

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

相关文章

Java代码审计Shiro反序列化CB1链source入口sink执行gadget链

目录 0x00 前言 0x01 CC链&CB链简介 1. Commons Collections链是什么? 2. Commons BeanUtils链是什么? 0x02 测试Commons BeanUtils1链 0x03 Shiro550 - Commons BeanUtils1链 - 跟踪分析(无依赖) 1. 前置知识 2. Co…

Node开发基础

1. 概述 1.1 为什么要学习服务器端开发基础 能够和后端程序员更加紧密的配合 网站业务逻辑前置,学习前端技术需要后端技术支撑 扩宽知识视野,能够站在更高的角度审视整个项目 1.2 服务器端开发要做的事情 实现网站的业务逻辑 ---网站登录部分&#…

矩阵重叠问题判断

创作背景 看到一道题目有感而发想写一篇题解,涉及的是一种逆向思维 桌面窗体重叠 - 洛谷https://www.luogu.com.cn/problem/U399827题目来源于《信息学奥赛课课通》 大致就是给一个长方形的左上顶点坐标(x1,y1)和右下顶点坐标(x…

【设计模式】适配器和桥接器模式有什么区别?

今天我探讨一下适配器模式和桥接模式,这两种模式往往容易被混淆,我们希望通过比较他们的区别和联系,能够让大家有更清晰的认识。 适配器模式:连接不兼容接口 当你有一个类的接口不兼容你的系统,而你又不希望修改这个…

mini-spring-Bean含参实例化(三)

上一节,bean是在AbstractAutowireCapableBeanFactory.doCreateBean方法中用beanClass.newInstance()来实例化,仅适用于bean有无参构造函数的情况。 本节考虑含参的bean的实例化 考虑两个问题 一、串流程从哪合理的把构造函数的入参信息传递到实例化操作里…

各行业领域向chatgpt高质量提问的方式

一、技术/业务/事项咨询: ChatGPT可以回答关于技术领域以及工作生活等各方面的问题,包括最佳实践、开发工具、编程语言选择等,咨询标准方案等。 常见问法: 我准备做***,【目前的选择有***】,请告诉我选哪…

sql注入基础

一、SQL注入攻击的根源可以归结为两个主要因素: 程序命令和用户数据之间缺乏有效的隔离措施,以及对用户输入数据的信任。 程序命令和用户数据之间缺乏隔离:在一个应用程序中,程序命令(如SQL语句)和用户数据(即用户输入)应该被严格分离,以避免恶意用户利用输入数据来改…

云服务器定价_云服务器价格_云主机计费模式_腾讯云

腾讯云服务器租用价格表:轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月,云服务器CVM S5实例2核2G配置280.8元一年…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第六天-Qt UDP编程(物联技术666)

链接:https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码:1688 在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。这里我们还要了解一个名词Socket,也就是常说的“套接字”。 Qt 网络…

2024.1.18力扣每日一题——拿出最少数目的魔法豆

2024.1.18 题目来源我的题解方法一 排序前缀和方法二 优化版本 题目来源 力扣每日一题;题序:2171 我的题解 方法一 排序前缀和 结果与原始顺序无关,因此先进行排序,然后计算前缀和。 有官方题解证明:最终在 拿出最少…

ImageMagick使用手册

ImageMagick使用手册 文章目录 ImageMagick使用手册ImageMagick是什么指令总结1.查看版本2.官网验证指令解读3.svg转png4.png转ico5.将指定文件夹中的所有PNG图像转换为ICO图标 本教程持续更新,我学到多少就更新多少。关于ffmpeg如何安装可以看上一篇博客win系统环境…

zk集群--启动阶段集群选举

1.概述 zk作为一个内存数据库产品,启动一个zk实例对外提供服务的方式成为单机模式。既然单机模式就可以实现请求处理,那为何要引入集群模式呢,引入集群模式付出了那些代价呢,相应的有取得了那些收益呢? 首先&#xf…

强化学习(四)动态规划——1

动态规划算法(DP):在马尔可夫决策过程(MDP)的完美环境模型下计算最优策略。但其在强化学习中实用性有限,其一是它是基于环境模型已知;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…

【Unity】RayMarching体积云理论学习

RayMarching 体积云 RayMarching 是一种处理体积物体的方法 RayMarching 体积云的制作是基于屏幕后处理 屏幕空间重建世界坐标 目的是把屏幕坐标的每一个像素点转化成Unity世界坐标,可以得到射线的方向 如何在需要渲染的物体或者场景中使用RayMarching&#xff…

2023年12月青少年机器人技术等级考试(五级)理论综合试卷

2023年12月青少年机器人技术等级考试(五级)理论综合试卷 单选题 第 1 题 单选题 通常状况下,ESP32 WROOM模组的工作电压是?( ) A.3V B.3.3V C.3.6V D.5V 第 2 题 单选题 ESP32 WROOM模组中核&am…

PHP AES加解密示例【详解】

PHP AES加解密示例 前言 在Web开发中,数据的安全性至关重要。AES(Advanced Encryption Standard)是一种常用的对称加密算法,用于保护敏感数据的安全性。本文将详细介绍在PHP中如何使用AES算法进行加解密操作,以确保数…

java大数据hadoop2.9.2 Linux安装mariadb和hive

一、安装mariadb 版本centos7 1、检查Linux服务器是否已安装mariadb yum list installed mariadb* 2、如果安装了,想要卸载 yum remove mariadb rm -rf /etc/my.cnf rm -rf /var/lib/mysql 才能完全删除 3、安装mariadb 在线网络安装 yum install -y mari…

Webpack5入门到原理17:Loader 原理

loader 概念 帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。 loader 执行顺序 分类 pre: 前置 loadernormal: 普通 loaderinline: 内联 loaderpost: 后置 loader 执行顺序 4 类 loader 的执行优级为&#xff…

【ARM 嵌入式 编译系列 2.6 -- GCC 编译时间统计参数 -ftime-report -Q 】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 GCC 编译时间统计 GCC 编译时间统计 如果你想要统计 GCC 编译过程中各个阶段的时间,可以使用 GCC 的 -ftime-report 选项。这个选项可以让编译器在编译结束后报告每个编译阶段所花费的时间。要使用…

Linux fsck命令教程:如何检查和修复你的文件系统(附实例详解和注意事项)

Linux fsck命令介绍 fsck,全称File System Consistency Check,主要用于检查和修复Linux文件系统的不一致和错误。该工具用于解决潜在的文件系统问题。fsck可以为你提供检查和修复一切文件系统中的问题的功能,包括一些潜在的磁盘错误等。 Li…