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 scrapy

from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutError


class 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 failures
        self.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 response
            response = failure.value.response
            self.logger.error("HttpError on %s", response.url)

        elif failure.check(DNSLookupError):
            # this is the original request
            request = failure.request
            self.logger.error("DNSLookupError on %s", request.url)

        elif failure.check(TimeoutError, TCPTimedOutError):
            request = failure.request
            self.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 / 0
          aaa
      except Exception as e:
          self.logger.error(f'{method_name} Exception {e}')

三、完整代码及运行效果

import sys

import scrapy


class 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 / 0
            aaa
        except 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类中所有异常已被成功捕获。不管是请求相关的网络异常,还是解析过程中的代码异常,都能成功捕获并处理,代码健壮性较佳。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小米强硬表态!敦促智己公司立即道歉 不接受个人轻描淡写的非正式道歉

快科技4月9日消息,在智己L6的发布会上,小米SU7成了“主角”之一,方方面面进行了对标和暗讽。 甚至官方还将智己L6和小米SU7 Max的各项参数与价格直接对比,引起了不小关注。 小米强硬表态!敦促智己公司立即道歉 不接受…

electron打包Vue前端

Electron-Forge 打包Vue项目 效果:electronforge可将前端静态页面打包成.exe、.deb和.rpm等,能适配各种平台 示例:Windows环境下将前端 Vue 项目打包成exe文件 打包后的 exe 文件 运行 exe 文件 一、项目准备 开源项目 RouYi 下载 本…

【分布式事务与分库分表】

文章目录 🔊博主介绍🥤本文内容分布式事务介绍分布式事务解决方案1. 2PC(Two Phase Commit)方案2. JTA/XA规范实现3. Seata AT模式实现4. TCC实现使用hmily实现TCC Spring Cloud Alibaba项目中整合Seata来实现分布式事务管理1. **…

C语言面试题之环路检测

环路检测 实例要求 1、给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点;2、若环不存在,请返回NULL;3、如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在…

Java项目:基于Springboot+vue实现的中国陕西民俗前后台管理系统设计与实现(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue实现的中国陕西民俗管理系统设计与实现设 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界…

Docker 搭建私有镜像仓库

一、镜像仓库简介 Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方,让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库: 公共镜像仓库 Docker Hub 是…

20240326-2-LightGBM面试题

LightGBM面试题 1. 简单介绍一下LightGBM? LightGBM是一个梯度 boosting 框架,使用基于学习算法的决策树。 它可以说是分布式的,高效的。 从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(G…

从0到1实现RPC | 07a 更新pom依赖方式

当前工程目录进行编译时 mvn clean install,会报错。原因是 rpc-core和rpc-demo-api不是一个spring boot项目,没有启动类。 默认在根pom文件中引入了spring的parent,导致子模块都是web项目,所以需要更新pom文件。 在根目录的pom文…

直播系统的短视频直播源码,带有多功能后台系统的直播短视频平台 APP 源码。

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 此源码是一个直播系统,集直播、短视频等功能,根据市场趋势开发并推出思乐直播APP,APP功能丰富且可在后台管理系统进行配置,做到按需求来…

UE5、CesiumForUnreal实现建筑白模生长动画效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试3.参考资料1.实现目标 在上篇文章加载本地建筑轮廓GeoJson数据生成建筑白模的基础上,本文通过材质“顶点偏移”实现建筑白模生长效果,GIF动图如下所示: 2.实现过程 常用的实现建筑生长效果的方式有两种,…

随机潮流应对不确定性?计及分布式发电的配电系统随机潮流计算程序代码!

前言 随着分布式电源在电力系统中所占比例的不断扩大,研究分布式发电对系统稳态运行的影响势在必行。带分布式发电的潮流计算常常用来评估其并网后对系统的影响,同时它也是分析分布式发电对电网稳定性的影响等其他理论研究工作的基础。然而,许多分布式发…

Feature Pyramid Networks for object detection

FPN 总述1.引言2.相关工作3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 4. 应用用于 RPN用于 Fast R-CNN 核心代码复现FPN网络结构ResNet Bottleneck完整代码 总述 下图中,蓝色边框表示的是特征图,边框越粗表…

视频号带货真的能成为2024年赚钱的新风口吗?

随着互联网技术的飞速发展和消费者购物习惯的不断转变,视频号带货这一新兴商业模式逐渐走进大众视野。在短视频平台日益火爆的今天,很多人都在思考,视频号带货是否会成为2024年赚钱的新风口? 首先,视频号带货具备成为新风口的潜力…

【项目】棋海争锋

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 项目介绍 WebSocket介绍 使用 项目创建 数据库设计 用户模块 登录接口 注册接口 获取用户信息接口 匹配模块 …

4.9学习总结

一.File类 (一).概述: File 类的对象代表操作系统的文件(文件、文件夹),File 类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功…

安卓四大组件——Service篇

1.作用 长时间位于后台(无界面)完成用户指定操作 1.1两类状态 (a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于sta…

7-15 计算圆周率

题目链接&#xff1a;7-15 计算圆周率 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <stdio.h>// 分子&#xff1a;阶乘 static unsigned long long int JieCheng (unsigned int n) {if (n 1) {return 1;} else {return n * JieCheng(n…

spring-cloud微服务负载均衡器ribbon

注意&#xff1a;2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBalancer替代&#xff0c;所以要查看springboot&#xff0c;springcloud&#xff0c;sprincloudalibaba的版本链接对应&#xff0c;Ribbon负载均衡都是在springboot版本2.4…

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度

一、算法的时间和空间复杂度 文章目录 一、算法的时间和空间复杂度1、时间复杂度2、空间复杂度 二、Transformer的时间复杂度分析1、 self-attention 的时间复杂度2、 多头注意力机制的时间复杂度 三、transformer的空间复杂度 算法是指用来操作数据、解决程序问题的一组方法。…

前端二维码工具小程序使用说明书

一、产品概述 前端二维码工具小程序是一款便捷、高效、易用的二维码生成与识别工具。本产品支持根据用户输入的文本或链接生成二维码&#xff0c;同时提供扫一扫功能以识别二维码内容&#xff0c;并支持将识别到的内容复制到剪贴板。此外&#xff0c;产品还提供了美化功能&…