爬虫工作量由小到大的思维转变---<第七十三章 > Scrapy爬虫详解一下HTTPERROE的问题

前言:

        在我们的日常工作中,有时会忽略一些工具或组件的重要性,直到它们引起一连串的问题,我们才意识到它们的价值。正如在Scrapy框架中的HttpErrorMiddleware(HTTP错误中间件)一样,在开始时,我并没有太重视它。但在实际工作中由于它引起的问题连贯性,让我深刻认识到了对其进行深入理解的必要性。对此,有必要在这个章节对HttpErrorMiddleware进行一番详尽的分析。

        问题也不会太多,主要讲的就是几个点;关于httperror在前文有过一个简单版本的论述

爬虫工作量由小到大的思维转变---<第五十三章 Scrapy 降维挖掘---中间件系列(2)> (HttpErrorMiddleware、OffsiteMiddleware和RefererMiddl)-CSDN博客

可以先看这篇文章~ 

正文:

        首先,通过源码剖析,我们可以了解到HttpErrorMiddleware的基本作用:它负责处理Spider的HTTP错误,根据配置来决定是否忽略非200响应。简单来说,当响应状态码在200到300之间,Scrapy会认为这是一个成功的响应,并继续其它处理。然而,如果响应状态码不在这个范围内,中间件将决定基于你的设置是否将其忽略:也就是说,如果你通过设置handle_httpstatus_all或
handle_httpstatus_list来明确指出希望接收非200响应,Scrapy会相应地处理这些响应而不是简单地抛出异常。

1.源码刨析:

        a.对应路径:

        b.对应源码:

"""
HttpError Spider Middleware该中间件处理Spider的HTTP错误。它根据配置决定是否忽略非200响应。See documentation in docs/topics/spider-middleware.rst
"""import loggingfrom scrapy.exceptions import IgnoreRequestlogger = logging.getLogger(__name__)# HttpError类继承自IgnoreRequest,用于表示被过滤的非200响应。
class HttpError(IgnoreRequest):"""表示一个非200响应被过滤的异常类。Attributes:response: 发生错误的响应对象。"""def __init__(self, response, *args, **kwargs):self.response = responsesuper().__init__(*args, **kwargs)# 处理HTTP错误的中间件类。
class HttpErrorMiddleware:"""处理Spider输入时的HTTP错误。Attributes:handle_httpstatus_all: 布尔值,配置项,表示是否允许所有非200响应。handle_httpstatus_list: 列表,配置项,包含允许的非200响应状态码。"""@classmethoddef from_crawler(cls, crawler):"""从爬虫实例创建中间件对象。Args:crawler: Crawler实例。Returns:HttpErrorMiddleware实例。"""return cls(crawler.settings)def __init__(self, settings):"""初始化中间件。Args:settings: Scrapy设置对象。"""self.handle_httpstatus_all = settings.getbool("HTTPERROR_ALLOW_ALL")self.handle_httpstatus_list = settings.getlist("HTTPERROR_ALLOWED_CODES")def process_spider_input(self, response, spider):"""处理Spider输入的响应。Args:response: 响应对象。spider: 当前处理的Spider。Returns:如果响应应该被忽略,则返回None;否则将响应传递给下一个中间件。"""# 如果响应状态码是200到300之间,则认为是成功响应,直接返回。if 200 <= response.status < 300:returnmeta = response.meta# 如果设置为允许所有非200响应,则直接返回。if meta.get("handle_httpstatus_all", False):return# 如果响应元数据中有指定允许的状态码列表,则只处理列表中的状态码。if "handle_httpstatus_list" in meta:allowed_statuses = meta["handle_httpstatus_list"]elif self.handle_httpstatus_all:returnelse:# 默认情况下,使用Spider或中间件的允许状态码列表。allowed_statuses = getattr(spider, "handle_httpstatus_list", self.handle_httpstatus_list)# 如果响应状态码在允许的列表中,则认为是有效响应,返回None。if response.status in allowed_statuses:return# 如果响应状态码未在允许的范围内,则抛出HttpError异常。raise HttpError(response, "Ignoring non-200 response")def process_spider_exception(self, response, exception, spider):"""处理Spider异常。Args:response: 响应对象。exception: 异常对象。spider: 当前处理的Spider。Returns:如果异常为HttpError,则记录日志并忽略该响应;否则将异常传递给下一个中间件。"""# 如果异常为HttpError,则认为是需要忽略的响应。if isinstance(exception, HttpError):spider.crawler.stats.inc_value("httperror/response_ignored_count")spider.crawler.stats.inc_value(f"httperror/response_ignored_status_count/{response.status}")logger.info("Ignoring response %(response)r: HTTP status code is not handled or not allowed",{"response": response},extra={"spider": spider},)return []

2.对代码进行总结:

        a.运行机制

  1.                 当status在【200,300】内的时候,直接返回(无异常);
  2.                 当status开始出现问题的时候,看你是否设置允许状态码;

--- 在spider里面,发送请求的时候会在mata里面带着handle_httpstatus_list或者handle_httpstatus_all  ;-->如果是all,表示所有的状态码都不会引发httpError的问题;而handle_httpstatus_list则是需要在集合里面设置对应允许的一些状态码;

--- 也可以直接在setting里面直接进行handle_httpstatus_list 的设置;(如图)

b.报错机制

在允许范围内的status通通不会报错,就没有

process_spider_exception

什么事了;   只有不在范围内的错误,会进行一个统计;

        这种设计非常灵活,允许开发者根据实际需求决定哪些HTTP状态码是可接受的,而哪些应当被视为错误。比如,在某些应用场景下,接收到404响应可能是正常的一部分,不应该中断整个爬取流程。因此,通过合理配置HttpErrorMiddleware,就可以实现这样的需求。

3.总结:

        HttpErrorMiddleware是Scrapy框架中一个非常重要的组件,尤其是在处理复杂网页爬取时。它不仅能帮助我们更灵活地处理HTTP错误,还能通过设置,让我们的爬虫更加健壮。了解它的工作原理和如何配置,对于开发高效的爬虫程序来说是非常关键的。通过对源码的解析和应用实践,我们能更好地利用这个中间件,优化我们的网络爬虫,不仅提升数据采集效率,还能保证数据的质量和完整性。

        总的来说,HttpErrorMiddleware加深了我们对Scrapy框架灵活性和强大功能的认识,是值得每个使用Scrapy框架的开发者深入了解和掌握的知识点。

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

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

相关文章

MATLAB R2017b安装的关键一步

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 MATLAB R2017b的安装文件比较庞大&#xff0c;由两个iso文件组成&#xff1a;R2017b_win64_dvd1.iso和R2017b_win64_dvd2.iso。安装时需要注意的是&#xff0c;首先使用DAEMON Tools Lite打开R2017b_win64_dvd1.iso&am…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

品鉴中的品鉴笔记:如何记录和分享自己的品鉴心得

品鉴云仓酒庄雷盛红酒的过程&#xff0c;不仅是品尝美酒&#xff0c;更是一次与葡萄酒深度对话的旅程。为了更好地记录和分享自己的品鉴心得&#xff0c;养成写品鉴笔记的习惯是十分必要的。 首先&#xff0c;选择一个适合的记录工具。可以是传统的笔记本&#xff0c;也可以是…

使用Git管理github的代码库-上

1、下载安装Git https://download.csdn.net/download/notfindjob/11451730?spm1001.2014.3001.5503 2、注册一个github的账号&#xff08;已经注册的&#xff0c;可略过这一步&#xff09; 3、打开git命令行&#xff0c;配置github账号 git config --global user.name &quo…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

攻防世界PHP2

1、打开靶机链接http://61.147.171.105:49513/&#xff0c;没有发现任何线索 2、尝试访问http://61.147.171.105:49513/index.php&#xff0c;页面没有发生跳转 3、尝试将访问 尝试访问http://61.147.171.105:49513/index.phps index.php 和 index.phps 文件之间的主要区别在于…

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制&#xff0c;通常是1024&#xff0c;当然可以更改数…

[机器学习-06] | Scikit-Learn机器学习工具包进阶指南:机器学习分类模型实战与数据可视化分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Linux 第二十九章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

FPGA第2篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介&#xff1a;首先&#xff0c;FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器&#xff0c;可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务&#xff0c;可以说是系统的"大脑"和"加速引擎&qu…

四款不同类型的企业防泄密软件推荐

在数字化快速发展的今天&#xff0c;企业数据的安全与保密显得愈发重要。防泄密软件作为一种专门的数据保护工具&#xff0c;已经逐渐成为企业不可或缺的安全屏障。本文将深入探讨防泄密软件对企业的意义&#xff0c;并介绍一些市面上主流的防泄密软件。 首先&#xff0c;防泄密…

哈希(Hash)

文章目录 1.stl提供的哈希容器1.1unordered_map和unordered_set容器1.1.1定义1.1.2这些容器和map和set的区别在于**&#xff1a;1.1.3物理结构 2 哈希&#xff08;实现哈希&#xff09;2.1本质&#xff1a;哈希表2.2底层原理&#xff1a;哈希概念2.2.1哈希方法2.2.2 哈希函数&a…

分布式锁之RedissonLock

什么是Redisson&#xff1f; 俗话说他就是看门狗&#xff0c;看门狗机制是一种用于保持Redis连接活跃性的方法&#xff0c;通常用于分布式锁的场景。看门狗的工作原理是&#xff1a;当客户端获取到锁之后&#xff0c;会对Redis中的一个特定的键设置一个有限的过期时间&#xff…

立聪堂助听器29周年暨第九届助听使者活动圆满落幕

5月10日对于立聪堂来说是个特别的日子&#xff0c;这家专注于听力健康领域的公司迎来了29周年。同时&#xff0c;立聪堂第九届助听使者代表及其家人也受邀参观立聪堂南京总部&#xff0c;共庆29周年。 易被忽视的老人听力健康 大数据显示&#xff0c;我国65岁以上老人&#x…

第六节笔记及作业----Lagent AgentLego 智能体应用搭建

关于 Agent 的相关理论 大语言模型存在一些局限性&#xff0c;比如会出现幻觉问题、有时效性问题以及可靠性问题。智能体的定义是具备感知、决策和行动能力的实体。智能体主要由感知部分、大脑部分和动作部分组成。智能体有多种类型&#xff0c;如 ReAct 类型&#xff08;侧重…

如何使用 ArcGIS Pro 计算容积率

容积率是指地上建筑物的总面积与用地面积的比率&#xff0c;数值越小越舒适&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 计算容积率&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑和小区数据&#xff0c;除了建筑和小区数据&am…

【联通官网及APP注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

使用Flink SQL实时入湖Hudi/Hive

文章目录 1 Hudi 简介2 COW和MOR3 接入COW模式Hudi表4 使用Flink SQL查看新接表5 使用Hive查看新接表6 总结 1 Hudi 简介 Hudi是一个流式数据湖平台&#xff0c;使用Hudi可以直接打通数据库与数据仓库&#xff0c;连通大数据平台&#xff0c;支持对数据增删改查。Hudi还支持同…

软件设计中的数字:7

“ 使软件更易理解的秘密&#xff1a;米勒法则” 小游戏 学习之前先一起玩一个小游戏。 3秒钟时间&#xff0c;看看下面的图片中有多少个小块&#xff1f; 3秒到了&#xff0c;数出来了吗&#xff1f;22个。 没数出来也没关系&#xff0c;我也没数出来o(╥﹏╥)o 现在&…

[AIGC] 压缩列表了解吗?快速列表 quicklist 了解吗?

文章目录 压缩列表了解吗&#xff1f;快速列表 quicklist 了解吗&#xff1f; 压缩列表了解吗&#xff1f; 压缩列表是 Redis 为了节约内存 而使用的一种数据结构&#xff0c;是由一系列特殊编码的连续内存快组成的顺序型数据结构。 一个压缩列表可以包含任意多个节点&#xf…