爬虫工作量由小到大的思维转变---<第二十九章 Scrapy的重试机制(避混淆)>

前言:

单纯讲重试的问题---因为今天有人私了我 `他的代码`,我忽然觉得这里有一个误区;顺便给哥们你混淆的理论里,再搅和搅和....哈哈哈

正文:

拨乱反正:

在Scrapy中,默认情况下,当一个请求失败时,会进行自动重试。重试次数的计算是基于原始请求的 meta 属性中的 retry_times 字段。


例如,若全局重试次数设置为3,当第一次请求失败时,retry_times 字段的初始值为3。随后,经过每次重试,retry_times 的值会依次减少,直到为0。

案例说明:
class MySpider(scrapy.Spider):name = 'example'def start_requests(self):url = 'http://www.example.com'yield scrapy.Request(url, self.parse, meta={'retry_times': self.settings.get('RETRY_TIMES', 3)})def parse(self, response):if response.status == 200:# 成功处理响应的逻辑passelse:retry_times = response.meta.get('retry_times', self.settings.get('RETRY_TIMES', 3))if retry_times > 0:next_request = response.request.copy()next_request.meta['retry_times'] = retry_times - 1yield next_requestelse:# 超过重试次数,放弃重试pass

----我为什么要说这个呢? 因为我看到他的代码,在增加"retry_times"的次数,导致这个request如果失效,他能一直错下去;  (正确的代码如下,哥们儿你自己提哈):

def process_response(self, request, response, spider):if response.status >= 400:  # 请求超时,可能是IP的问题# 获取当前使用的代理IPproxy = request.meta.get('proxy', None)if proxy:self.remove_proxy(proxy)  # 从代理池中删除该IPif request.meta['retry_times'] > 0:# 重新获取一个随机的代理IP,并重试请求new_proxy = self.get_proxy()  # 获取一个新的代理IPif new_proxy:new_request = request.copy()new_request.meta['proxy'] = new_proxynew_request.meta['retry_times'] -= 1return new_requestreturn response

我稍微改进了一下,如果重试都失败了,那抛异常没毛病了吧:

   def process_response(self, request, response, spider):if response.status >= 400:  # 请求超时,可能是IP的问题# 获取当前使用的代理IPproxy = request.meta.get('proxy', None)if proxy:self.remove_proxy(proxy)  # 从代理池中删除该IPif request.meta['retry_times'] > 0:new_proxy = self.get_proxy()  # 获取一个新的代理IPif new_proxy:new_request = request.copy()new_request.meta['proxy'] = new_proxynew_request.meta['retry_times'] -= 1if new_request.meta['retry_times'] == 0:# 重试次数超过全局重试次数时,抛出异常raise Exception('URL重试次数超过限制')return new_requestreturn response

备注:(记得从你的全局settings中,获取重试次数哈),如果你不获取的话,虽然scrapy默认会重试,但你获取不到重试的值!!! 因为他不是显式的!

global_retry_times = get_project_settings().get('RETRY_TIMES', 3)  # 获取全局设置的重试次数
request_retry_times = request.meta.get('retry_times', global_retry_times)  # 获取请求的重试次数

或者,你在spiders的时候,meta函数里面添加个'RETRY_TIMES';例如:

  custom_settings = {'RETRY_TIMES': 3,  # 设置重试次数为 3 次}def start_requests(self):yield scrapy.Request(f'https://www.example.com/zq/1?date={self.timeday}', callback=self.parse,meta={'retry_times': self.settings.getint('RETRY_TIMES')})

最后,我再补个知识点(看了你的代码):

关于中间件的:
DOWNLOADER_MIDDLEWARES = {"你的爬虫名.middlewares.A!!!!Middleware": 543,"你的爬虫名.middlewares.B!!!!Middleware": 600,"你的爬虫名.middlewares.C!!!!Middleware": 900,
}

正常来说:

请求(request)的时候他的执行顺序,如你听到的--->从A到B到C;

但是:

响应(response)的时候,他的执行顺序,不如你所写--->从C到B到A!!!

对咯--->他是倒着来的! 不是按你理解的那个顺序跑的...

所以,别在不是处理异常的中间件类里边写异常~容易给你自己玩跑偏了,导致该接收异常的收不到!!! 

你去看看我

爬虫工作量由小到大的思维转变---<第二十八章 Scrapy中间件说明书>-CSDN博客

.... 在A类里边干B类的事,就是耍流氓....哪怕你发现了,什么都别做,他会根据流程滚到属于管他的那个类里边被处理掉的;放心...

总结:

1.重试是在做减法! 不要去给他+了;

2.不要一出异常就抛,给每个url请求一个机会,也有可能是咱网络或者IP其他别的问题呢?

3.彻底抛出url请求异常,最好写在重试次数结束之后;

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

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

相关文章

Android : 画布的使用 简单应用

示例图: MyView.java: package com.example.demo;import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Vi…

C++ 之LeetCode刷题记录(四)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅,多学多练,尽力而为。 先易后难,先刷简单的。 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共…

建筑覆膜板和传统木板有什么不同?

在建筑领域,选择合适的模板材料对于确保施工质量和效率至关重要。近年来,建筑覆膜板因其独特的优势越来越受到青睐,与传统木板相比,它们在多个方面展现出显著的差异。 材料和制作工艺 建筑覆膜板:这种板材是由木材切片…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别优惠,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年,756元3年、4核8G12M带宽646元15个月等&#xf…

【linux】touch的基本使用

碎碎念 刚接触linux时候的几个最基础的命令之一,用来创建文件。如果使用touch --help的时候会发现作者对于touch的简介:Update the access and modification times of each FILE to the current time.用于修改文件的访问和时间戳 带我的leader属于那种…

Linux安装GitLab教程

Linux安装GitLab教程 1、配置yum源 相当于新建一个文件,通过这个文件来安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo 把这些配置粘进去 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gp…

TCP与UDP是流式传输协议吗?

TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议,它们用于在网络中传输数据。它们不是流式传输协议,而是提供了不同的数据传输特性: 1. TCP(传输控制协议&#xff0…

C++ Qt开发:SqlTableModel映射组件应用

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlTableModule组件的常用方法及灵活运用。 …

深入解析C语言中void (*signal(int ,void(*)(int) ) ) (int)

目录 深入解析C语言中的signal函数声明 1. signal函数声明 1.1 signal是一个函数 1.2 返回类型是一个函数指针 2. 函数指针的理解 3. 简化声明使用typedef 为啥不这么写typedef void (*)(int) acc? 代码: 结论 深入解析C语言中的signal函数声明…

编程笔记 html5cssjs 004 我的第一个页面

编程笔记 html5&css&js 004 我的第一个页面 一、基本结构二、HTML标签三、HTML元素四、HTML属性五、编写第一个网页六、使用VSCODE小结 开始编写网页,并且使用第一个网页成为一个母板,用于完成后续内容的学习。有一个基本要求,显示结…

二叉树数据结构:深入了解二叉树的概念、特性与结构

在探索栈和队列之后(大家可以移步至我的数据结构专栏):T-rLN的数据结构专栏 我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界,从最基本的概念和结构开始,逐步深入了解二叉树的顺序结构…

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

hyper-v ubuntu 3节点 k8s集群搭建

前奏 搭建一主二从的k8s集群,如图所示,准备3台虚拟机。 不会创建的同学,可以看我上上篇博客:https://blog.csdn.net/dawnto/article/details/135086252 和上篇博客:https://blog.csdn.net/dawnto/article/details/135…

(04730)半导体器件之基本放大器工作原理(三)

本文主要阐述多级与差动放大器 为使输入的微弱信号进行放大后能获得足够的输出功率去推动负载运行,往往要采用所谓的多级放大电路,信号逐级通过放大,直至得到输出信号。这就必须考虑放大电路级与级之间的信号传递方法,或者称为耦…

henauOJ 1069: 三连击

题目描述 本题为提交答案题&#xff0c;您可以写程序或手算在本机上算出答案后&#xff0c;直接提交答案文本&#xff0c;也可提交答案生成程序。 #include <bits/stdc.h> #define endl \n using namespace std; void GordenGhost(); vector<int>a; bool vis[10]…

微软官方系统镜像安装U盘制作

https://www.microsoft.com/zh-cn/software-download/windows11https://www.microsoft.com/zh-cn/software-download/windows10工具下载地址 #win10 https://download.microsoft.com/download/b/0/5/b053c6bc-fc07-4785-a66a-63c5aeb715a9/MediaCreationTool21H2.exehttps://d…

GC控制器(Garbagecollector)源码解析

KubeController Garbagecollector 本文从源码的角度分析KubeController Garbagecollector相关功能的实现。 本篇kubernetes版本为v1.27.3。 kubernetes项目地址: https://github.com/kubernetes/kubernetes controller命令main入口: cmd/kube-controller-manager/controller-…

k8s的网络类型

部署 CNI 网络组件 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命名空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localho…

internet download manager 6.42怎么删除卸载,2024最新idm卸载不干净怎么解决

internet download manager 6.42简称为IDM&#xff0c;这是一款非常好用的下载软件&#xff0c;很多小伙伴都在使用。如果后续我们不再需要使用该软件&#xff0c;小伙伴们知道具体该如何将其卸载掉吗&#xff0c;其实卸载方法是非常简单的&#xff0c;只需要进行几个非常简单的…

Qt+Opencv:模板匹配

一、模板匹配应用场景闲聊 在很多机器视觉的应用场景都有用到模板匹配的功能&#xff0c;常常用来判断是否有目标检测对象&#xff0c;以及检测对象在图像中的位置。譬如在AOI检测软件中&#xff0c;通过拍摄Mark点的图像&#xff0c;进行mark模板的匹配&#xff0c;从而进行晶…