首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为我的Scrapy spider写了一个errback,但是回溯也在不断发生,为什么?

在Scrapy中,errback是用于处理请求发生错误时的回调函数。当一个请求发生错误时,Scrapy会调用errback函数来处理错误,并且可以选择重新发送请求或者进行其他操作。

回溯(backtrace)是指在程序执行过程中,当出现错误时,系统会将错误信息以及错误发生的位置进行记录,以便开发者进行错误定位和调试。在Scrapy中,当一个请求发生错误并调用errback函数时,如果在errback函数中发生了新的错误,那么系统会将这个新的错误信息添加到回溯中,从而形成回溯链。

回溯链的发生可能有以下几个原因:

  1. 递归调用:在errback函数中可能会再次发起新的请求,如果这个新的请求又发生错误并调用了errback函数,就会形成回溯链。这种情况下,需要检查errback函数中是否存在递归调用的情况,如果存在,需要进行相应的调整。
  2. 异常处理不当:在errback函数中可能存在异常处理不当的情况,导致新的错误发生。例如,没有正确处理异常或者没有正确捕获异常导致程序崩溃。这种情况下,需要仔细检查errback函数中的异常处理逻辑,确保异常能够被正确捕获和处理。
  3. 请求重试设置不当:Scrapy提供了请求重试的功能,可以在请求发生错误时自动进行重试。如果在errback函数中没有正确设置重试次数或者重试策略,就可能导致请求不断重试,从而形成回溯链。这种情况下,需要检查Scrapy的请求重试设置,确保设置合理。

为了解决回溯链的问题,可以采取以下措施:

  1. 检查errback函数中是否存在递归调用的情况,如果存在,需要进行相应的调整,避免无限循环。
  2. 确保errback函数中的异常处理逻辑正确,异常能够被正确捕获和处理,避免程序崩溃。
  3. 检查Scrapy的请求重试设置,确保设置合理,避免请求不断重试。

总结:回溯链的发生可能是由于递归调用、异常处理不当或者请求重试设置不当等原因导致的。为了解决回溯链的问题,需要仔细检查errback函数中的逻辑,并确保递归调用、异常处理和请求重试设置合理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

scrapy之原理

Scrapy Engine 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。...Spiders SpiderScrapy用户编写用于分析response并提取item(即获取到item)或额外跟进URL类。 每个spider负责处理一个特定(或一些)网站。...其提供了一个简便机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 Spider中间件(Middleware) 。...数据流(Data flow) Scrapy数据流由执行引擎控制,其过程如下: 1.引擎打开一个网站(open a domain),找到处理该网站Spider并向该spider请求第一个要爬取...只要在items中写了都会执行)—-> 自己写spider类变量 —–>内部方法misc (会生成所有spider一个list)、spiderloader 、crawler(_get_spider_loader

1.1K30

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用下载中间件用法和例子。...:9743 所以直接设置代理用,代理地址日本ip 然后settings.py配置文件中开启下载中间件功能,默认是关闭 ?...异常 如果其返回一个Response(可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response() 方法处理。...这里我们写一个简单例子还是上面的项目,我们中间件中继续添加如下代码: ? 然后spider中打印状态码: ? 这样当我们重新运行爬虫时候就可以看到如下内容 ?...这样设置之后我们就把失败重试中间件给关闭了,设置None就表示关闭这个中间件,重新启动爬虫我们可以看出没有进行重试直接报错了 ?

1.2K80
  • 听说你爬虫又被封了 ?

    目录 前言 Spider Middleware 瞎比比 前言 上一篇文章《爬虫利器初体验》中,我们举了个简单栗子,但是真实开发中这样爬虫代码很容易就会被封掉。那么怎么样才能避免这些事发生呢?...如果没有任何一个方法处理该异常, 则 request errback(Request.errback) 方法会被调用。如果没有代码处理抛出异常, 则该异常被忽略且不记录(不同于其他异常那样)。...如果其返回一个 Response (可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response() 方法处理。...如果其抛出一个 IgnoreRequest 异常,则调用 request errback( Request.errback)。...那么, scrapy 中如何来设置我们 ip 代理呢?

    47930

    python爬虫人门(10)Scrapy框架之Downloader Middlewares

    该设置是一个字典(dict),键中间件类路径,值其中间件顺序(order)。...如果没有任何一个方法处理该异常, 则requesterrback(Request.errback)方法会被调用。如果没有代码处理抛出异常, 则该异常被忽略且不记录(不同于其他异常那样)。...如果其返回一个 Response (可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response() 方法处理。...如果其抛出一个 IgnoreRequest 异常,则调用requesterrback(Request.errback)。...同时支持小数: DOWNLOAD_DELAY = 0.25 # 250 ms of delay 默认情况下,Scrapy两个请求间不等待一个固定值, 而是使用0.5到1.5之间一个随机值 *

    79480

    Python Scrapy框架之 Downloader Middleware使用

    ': 900, # Downloader side } 字典格式,其中数字优先级,越小优先调用。...如果没有任何一个方法处理该异常, 则requesterrback(Request.errback)方法会被调用。如果没有代码处理抛出异常,则该异常被忽略且不记录。...IgnoreRequest异常 如果其返回一个Response(可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response()...如果其抛出一个 IgnoreRequest 异常,则调用requesterrback(Request.errback)。 如果没有代码处理抛出异常,则该异常被忽略且不记录(不同于其他异常那样)。...这里我们写一个简单例子还是上面的项目,我们中间件中继续添加如下代码: ... def process_response(self, request, response, spider): response.status

    93431

    【源码解读】如何充分发挥 Scrapy 异步能力

    作为一个易上手高性能爬虫框架,Scrapy 使用 Twisted 异步网络框架处理并发请求。 但是日常工作和面试过程中,经常发现有些同学会笃定地认为 Scrapy 采用是多线程并发模型。..._scrape 函数返回后,该 Deferred 实例上注册 callback 和 errback 有: callback errback...它运行模式Spider Middlerware 类似,但是 实现细节上却存在很大区别。...Scrapy 提供一个下载中间件 scrapy.downloadermiddlewares.robotstxt 就利用了这种用 法,发出实际请求之前,根据需求先去请求了网站 robots.txt...首先,对于约定方法可以返回 Request 实例扩展组件,我们只需要像开发 Spider 代码一样, Request 指定实现了业务逻辑回调函数,然后将该 Request 作为方法返回值返回给 Scrapy

    3.4K30

    网络爬虫框架Scrapy详解之Request

    通常在Spider中创建这样一个请求,Downloader中执行这样一个请求。同时也有一个子类FormRequest继承于它,用于post请求。...若需要POST请求,用FormRequest即可 headers 请求头信息,一般settings中设置即可,可在middlewares中设置 body str类型,请求体,一般不需要设置(get...),可以多次执行相同请求 errback 抛出错误回调函数,错误包括404,超时,DNS错误等,第一个参数Twisted Failure实例 from scrapy.spidermiddlewares.httperror...', meta = {'name' : 'Zarten'}) Response中: my_name = response.meta['name'] 不过也有scrapy内置特殊key,非常有用,它们如下...子类,用于POST请求 这个类新增了一个参数 formdata,其他参数与Request一样,详细可参考上面的讲述 一般用法: yield scrapy.FormRequest(url="http:

    86800

    Python:Downloader Middlewares

    该设置是一个字典(dict),键中间件类路径,值其中间件顺序(order)。...如果没有任何一个方法处理该异常, 则requesterrback(Request.errback)方法会被调用。如果没有代码处理抛出异常, 则该异常被忽略且不记录(不同于其他异常那样)。...如果其返回一个 Response (可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response() 方法处理。...如果其抛出一个 IgnoreRequest 异常,则调用requesterrback(Request.errback)。...Scrapy代理IP、Uesr-Agent切换都是通过DOWNLOADER_MIDDLEWARES进行控制,我们settings.py同级目录下创建middlewares.py文件,包装所有请求。

    32110

    ScrapyMeta、异常处理

    Meta 信息传递 创建REQEUSTS对象时设置meta yield scrapy.FormRequest(meta={"keyword": keyword, "sta_date": sta_date.... max_retry_times 设置最大重试次数. dont_merge_cookies 和 cookiejar 操作cookiemeta参数, 但是不建议这么使用, 一般来说我们直接设置 request.headers...Spiders组件 异常处理中, Spider组件其实是处理RESPONSE对象或者请求之后产生异常, 一般作为一次请求异常处理终点, 也就是指定回调函数errorback. errorback...由下一层中间件继续处理, 如果你指定了errback, 最终会到达errback 返回REPONSE对象 中断异常链, 返回RESPONSE对象会到达Spiders组件 返回Request 中断异常链...# 补充cookie池 if isinstance(exception, IndexError): # 已经知道异常产生原因, 所以免除当前重试次数计数

    48110

    scrapy之ip池

    如果没有任何一个方法处理该异常, 则requesterrback(Request.errback)方法会被调用。如果没有代码处理抛出异常, 则该异常被忽略且不记录(不同于其他异常那样)。...如果其返回一个 Response (可以与传入response相同,可以是全新对象), 该response会被链中其他中间件 process_response() 方法处理。...如果其抛出一个 IgnoreRequest 异常,则调用requesterrback(Request.errback)。...Scrapy将不会调用任何其他中间件 process_exception() 方法。 如果其返回一个 Request 对象, 则返回request将会被重新调用下载。...– request对应spider 参考: 官网https://doc.scrapy.org/en/latest/topics/downloader-middleware.html 中文版: http

    1.1K20

    scrapy进阶开发(一):scrapy架构源码分析

    image.png Spider(我们编码一个网站爬虫) yield 一个 Request 出来,并发送给Engine(产生request,处理response) Engine拿到Request以后发送给...Scheduler(调度器) Scheduler生成一个Requests交给Engine Engine拿到 Schedulerrequest后(注意是Scheduler发来而不是Spider发来)...Item Piplines,将结果一步一步Piplines将数据持久化到不同存储体里,比如JSON,Mysql,ES等 源码分析 Scrapy 核心代码都在scrapy类库scrapy/core文件夹下...方法, # 但是scheduler里此时没有request,所以就会去从Spider中读取start_urls if not request: return...:元信息,(可以Request中传递) # encoding:网页编码格式,默认UTF-8 # priority:设置scheduler调度优先级 # dont_filter

    2.5K40

    scrapy0700:深度爬虫scrapy深度爬虫

    深度爬虫概述 爬虫程序,主要是用与数据采集处理一种网络程序,操作过程中针对指定url地址进行数据请求并根据需要采集数据,但是实际项目开发过程中,经常会遇到目标url地址数量不明确情况,如之前章节中提到智联招聘项目...,但是此时已经由框架完成了请求解析调度和下载过程,那么Scrapy到底做了哪些事情呢?...数据 pass 同时,可以通过响应对象构建一个POST请求重新发送,如下: import scrapy class MySpider(scarpy.Spider): # 定义爬虫名称...该类中方法extract_link()用于从响应对象response中提取符合定义规则链接 该类型只会被实例化一次,但是每次采集得到数据时重复调用 class scrapy.linkextractors.LinkExtractor...类型提取超链接url地址操作行为,可以一个爬虫程序中定义多个Rule对象,包含在一个rules列表中即可 class scrapy.spiders.Rule( # LinkExtractor

    1.8K20
    领券