Scrapy框架spider类异常处理

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者:zhu6201976

一、捕获Request所有网络相关异常

在spider类中,我们构造Request对象或FormRequest对象时,可传递参数errback回调函数。该回调函数可捕获Request所有网络相关异常,如图所示:

文档地址:Requests and Responses — Scrapy 2.11.1 documentation

  • errback (collections.abc.Callable) –

    a function that will be called if any exception was raised while processing the request. This includes pages that failed with 404 HTTP errors and such. It receives a Failure as first parameter. For more information, see Using errbacks to catch exceptions in request processing below.

    Changed in version 2.0: The callback parameter is no longer required when the errback parameter is specified.

解释:errback参数接收一个function,以处理该request时任意网络异常,如404 Not Found等。errback回调函数第一个参数为Failure对象,包含失败的Request对象和失败原因。

源码示例:Requests and Responses — Scrapy 2.11.1 documentation

import scrapyfrom scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutErrorclass ErrbackSpider(scrapy.Spider):name = "errback_example"start_urls = ["http://www.httpbin.org/",  # HTTP 200 expected"http://www.httpbin.org/status/404",  # Not found error"http://www.httpbin.org/status/500",  # server issue"http://www.httpbin.org:12345/",  # non-responding host, timeout expected"https://example.invalid/",  # DNS error expected]def start_requests(self):for u in self.start_urls:yield scrapy.Request(u,callback=self.parse_httpbin,errback=self.errback_httpbin,dont_filter=True,)def parse_httpbin(self, response):self.logger.info("Got successful response from {}".format(response.url))# do something useful here...def errback_httpbin(self, failure):# log all failuresself.logger.error(repr(failure))# in case you want to do something special for some errors,# you may need the failure's type:if failure.check(HttpError):# these exceptions come from HttpError spider middleware# you can get the non-200 responseresponse = failure.value.responseself.logger.error("HttpError on %s", response.url)elif failure.check(DNSLookupError):# this is the original requestrequest = failure.requestself.logger.error("DNSLookupError on %s", request.url)elif failure.check(TimeoutError, TCPTimedOutError):request = failure.requestself.logger.error("TimeoutError on %s", request.url)

从示例可知,errback可捕获所有网络相关异常,如:HttpError、DNSLookupError、TCPTimedOutError等。因此,我们可以在构造Request对象时,传递该参数,捕获spider中所有与网络相关的异常。

二、捕获所有解析异常

构造Request对象时,仅传递errback参数只能捕获该请求相关网络异常,并不能捕获到解析相关异常。因此,需要再次try catch捕获,以下案例捕获程序中的ValueError 和 Name Not DefinedError。

  def parse(self, response, **kwargs):method_name = sys._getframe().f_code.co_name# 2.解析异常需单独捕获try:1 / 0aaaexcept Exception as e:self.logger.error(f'{method_name} Exception {e}')

三、完整代码及运行效果

import sysimport scrapyclass BaiduSpider(scrapy.Spider):name = "baidu"# allowed_domains = ["baidu.com"]# start_urls = []def start_requests(self):# 1.构造请求errback回调 可捕获请求异常yield scrapy.Request('https://www.baidu7489764654.com', callback=self.parse, errback=self.parse_errback)yield scrapy.Request('https://www.baidu.com', callback=self.parse, errback=self.parse_errback)def parse(self, response, **kwargs):method_name = sys._getframe().f_code.co_name# 2.解析异常需单独捕获try:1 / 0aaaexcept Exception as e:self.logger.error(f'{method_name} Exception {e}')def parse_errback(self, failure):# 处理请求异常self.logger.error(f'{failure.request.url} {failure.value}')

 

四、总结

经过上述2个步骤,理论上来说,spider类中所有异常已被成功捕获。不管是请求相关的网络异常,还是解析过程中的代码异常,都能成功捕获并处理,代码健壮性较佳。

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

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

相关文章

JAR包文件修改

项目中遇到修改JAR包中的某个依赖或者配置的话一般分为两种方式 1、压缩文件只能用来修改(1)配置文件(2)Java类(3)Mapper文件 2、使用Java 命令来 (1)解压Jar包 (2&…

BugKu:Simple SSTI

1.进入此题 2.查看源代码 可以知道要传入一个名为flag的参数,又说我们经常设置一个secret_key 3.flask模版注入 /?flag{{config.SECRET_KEY}} 4.学有所思 4.1 什么是flask? flask是用python编写的一个轻量web开发框架 4.2 SSTI成因(SST…

【数据结构与算法】:堆排序和选择排序

1. 堆排序 堆排序是一种比较复杂的排序算法,因为它的流程比较多,理解起来不会像冒泡排序和选择排序那样直观。 1.1 堆的结构 要理解堆排序,首先要理解堆。堆的逻辑结构是一棵完全二叉树,物理结构是一个数组。 (如果不知道什么是…

链表的中间结点——每日一题

题目链接: OJ链接 题目: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释&…

sql注入笔记整理

概念 发生在与数据库交互时;将未经过滤的用户输入信息合并到执行代码中造成恶意代码的执行错误注入 extractvalue(xml_flag,xpath) 如果出错打印xpath内容;数据库不识别#~符号 extractvalue(1,concat(~,database(),~)) 会打印出~数据库名~ updatexml(xml…

【架构师】-- 成长路线图

成长为软件架构师不是一件容易的事,这篇文章列举了架构师需要学习的技术储备,给出了成为软件架构师的路线图,帮助有志于在架构领域成长的同学可以明确学习的方向。原文:Master Plan for becoming a Software Architect[1] 软件架…

【优选算法专栏】专题十八:BFS解决拓扑排序(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

shamrockcms代码审计-啥也没有

shamrockcms 环境搭建 使用阿里源,创建数据库,运行shamrockcms.sql文件,将configure.properties中的jdbc修改为自己本地或者其他ip数据库连接,并且将ueditor.config.json中的master修改为localhost或者其他自己设置的ip 危险组件…

2024mathorcup数学建模D题思路模型代码

目录 2024mathorcup数学建模D题思路模型代码:开赛后第一时间更新,更更新见文末名片 如下为2023MathorCup 高校数学建模挑战赛D题思路解析: 2024mathorcupD题思路模型获取见此 2024mathorcup数学建模D题思路模型代码:开赛后第一时…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理:智能决策与自动发现 一、引言 在今天这个数据驱动的时代,我们经常会听到人们提及“知识图谱”这个词。知识图谱,作为一种结构化知识的表达方式,已经成为智能系统不可或缺的一部分,它通过连接大量的…

Ubuntu Desktop Server - Resource temporarily unavailable

Ubuntu Desktop Server - Resource temporarily unavailable 1. 问题2. 解决方案References 1. 问题 foreverstrongubuntu:~$ sudo apt-get install libatlas-base-dev [sudo] password for foreverstrong: E: Could not get lock /var/lib/dpkg/lock - open (11: Resource t…

numpy,matplotilib学习(菜鸟教程)

所有内容均来自于: NumPy 教程 | 菜鸟教程 Matplotlib 教程 | 菜鸟教程 numpy模块 numpy.nditer NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 for x in np.nditer(a, orderF):Fortran order,即是列序优先&#x…

动态规划专训2——路径问题

1.不同路径 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” 问总共有多少条不同的路径 因为题…

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言,决定直接通过实践的方式上手,而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路,准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题,再去查看相应的文档。 首先需要准备卡片对应的图片…

【STL】顺序容器与容器适配器

文章目录 1顺序容器概述1.1array1.2forward_list1.3deque 2.如何确定使用哪种顺序容器呢?3.容器适配器的概念4.如何定义适配器呢? 1顺序容器概述 给出以下顺序容器表: 顺序容器类型作用vector可变大小的数组,支持快速访问&#…

lua学习笔记15(元表的学习)

print("*****************************元表的学习*******************************") print("*****************************元表的概念*******************************") --任何变量都可以作为另一个表变量的元表 --任何表变量都可以有自己的元表 --当我…

谷歌浏览器变黑色背景 扩展程序 Hacker Vision

这个扩展程序能够把浏览器的背景变成黑色,长时间阅读文章的时候护眼效果很不错 效果如下

《前端面试题》- JS基础 - call()、apply()、bind() 的区别

call 、bind 、 apply 这三个函数的功能都是改变this的指向问题,但是也存在一定的区别。 call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,apply 的所有参数都必须放在一个数组里面传进去bind 除了返回是函数以外,它 的参数和…

美团一面:说说synchronized的实现原理?问麻了。。。。

引言 在现代软件开发领域,多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而,多线程环境下的数据同步与资源共享问题也随之而来,处理不当可能导致数据不一致、死锁等各种并发问题。为此,Java语言提供了一种内置…

HwBinder流程分析

HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用,后者是给一般的应用程序使用,为了不影响现有的binder,单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成:hwservermanager、server、client…