当前位置: 首页 > news >正文

可狱可囚的爬虫系列课程 16:爬虫重试机制

一、retrying模块简介

在爬虫中,因为我们是在线爬取内容,所以可能会因为网络、服务器等原因导致报错,那么这类错误出现以后,我们想要做的肯定是在报错处进行重试操作,Python提供了一个很好的模块,能够直接帮助我们实现重试操作,它就是retrying模块。当然,重试操作不仅仅只用于爬虫,还可以用于其他更广泛的领域。

retrying 是一个用Python编写的重试库,用于将重试行为添加到常规任务中,让你写的代码拥有重试功能。官方文档:https://github.com/rholder/retrying

二、案例讲解

我这里有一些网址,现在要求编写一个爬虫程序,将这些网站访问一遍,那么应该如何确保程序能够顺利的执行完成呢,有些小伙伴会说使用异常捕获防止程序出现意外,这是一种解决办法,那么如果我再要求一个网站的请求不能等待过长时间并且针对于有错误的地址进行重试,应该如何解决呢,这个时候我们就需要引入重试机制。

(1)无重试机制的爬虫

import requestsdef requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')UrlList = ['https://www.chinanews.com/scroll-news/news5.html', 'https://ssr4.scrape.center/','https://www.chinanews.com/scroll-news/news12.html', 'https://www.chinanews.com/scroll-news/news3.html','https://www.chinanews.com/scroll-news/news8.html', 'https://www.chinanews.com/scroll-news/news2.html','https://www.chinanews.com/scroll-news/news11.html', 'https://www.chinanews.com/scroll-news/news1.html','https://www.chinanews.com/scroll-news/news4.html', 'https://www.chinanews.com/scroll-news/news7.html','https://www.chinanews.com/scroll-news/news10.html', 'https://www.chinanews.com/scroll-news/news9.html','https://www.chinanews.com/scroll-news/news6.html']
for i in UrlList:print(f'正在访问:{i}')requests_url(i)

这段代码在执行时,报了Read timed out的异常提示超时,那么超时的原因有多种,可能是本地网络原因、也可能是网址服务器原因等,此时便需要使程序具备能够重试的功能。

(2)引入了重试机制的爬虫

接下来我们导入安装好的retrying模块,只要在需要重试的函数前面添加指定的装饰器,即可使程序具备重试功能,看以下修改:

from retrying import retry@retry
def requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')

(3)重试机制修订

引入了 retrying 的代码存在一个弊端,如果这个网址本身就是联不通的,那么它会永远重试下去,这并不是我们想看到的,所以还要添加一下参数:stop_max_attempt_number(最大重试次数),可以给这个参数指定一个数字,比如下面指定的数字5,便是让其最多重试5次。

from retrying import retry@retry(stop_max_attempt_number=5)
def requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')

但是这样的修改还是不尽人意,虽然添加了最大重试次数,但非常快速的机械性的连续重试,总有一种会随时出发反爬机制的感觉,所以还可以设置两次重试之间的等待时间:wait_fixed(单位是毫秒),代码如下:

from retrying import retry@retry(stop_max_attempt_number=5, wait_fixed=2000)
def requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')

不过我还是建议重复性的操作添加点随机性比较好,将 wait_fixed 修改为 wait_random_min 和 wait_random_max,表示从指定的时间范围内随机一个等待时间。

from retrying import retry@retry(stop_max_attempt_number=5, wait_random_min=1000, wait_random_max=2000)
def requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')

三、最终代码

import requests
from retrying import retry@retry(stop_max_attempt_number=5, wait_random_min=1000, wait_random_max=2000)
def requests_url(href):URL = hrefHeaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}resp = requests.get(url=URL, headers=Headers, timeout=3)if resp.status_code == 200:print(f'{href}访问成功')UrlList = ['https://www.chinanews.com/scroll-news/news5.html', 'https://ssr4.scrape.center/','https://www.chinanews.com/scroll-news/news12.html', 'https://www.chinanews.com/scroll-news/news3.html','https://www.chinanews.com/scroll-news/news8.html', 'https://www.chinanews.com/scroll-news/news2.html','https://www.chinanews.com/scroll-news/news11.html', 'https://www.chinanews.com/scroll-news/news1.html','https://www.chinanews.com/scroll-news/news4.html', 'https://www.chinanews.com/scroll-news/news7.html','https://www.chinanews.com/scroll-news/news10.html', 'https://www.chinanews.com/scroll-news/news9.html','https://www.chinanews.com/scroll-news/news6.html']
for i in UrlList:print(f'正在访问:{i}')try:requests_url(i)except:print('重试结束,依旧报错,跳过,进行下一项任务!')

四、总结

重试机制仅仅是让爬虫在某一网站访问不通的情况下多尝试几次,最终还是会报错,所以重试机制依旧需要与异常捕获结合使用。

相关文章:

可狱可囚的爬虫系列课程 16:爬虫重试机制

一、retrying模块简介 在爬虫中,因为我们是在线爬取内容,所以可能会因为网络、服务器等原因导致报错,那么这类错误出现以后,我们想要做的肯定是在报错处进行重试操作,Python提供了一个很好的模块,能够直接帮…...

第十五届蓝桥杯----B组cpp----真题解析(小白版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 必看前言!!!!!一、试题A:握手问题1.题意分析2.代码解答 二、试题B:小球反弹1.题意…...

软考架构师笔记-数据库系统

1.7 数据库系统 三级模式-两级映射 三级模式 外模式:用户视图概念模式:只涉及描述内模式:存储方式的描述 两级映射 外模式-概念模式映射概念模式-内模式映射 数据库的设计 步骤 需求分析 输出为需求分析、数据流图(Data FLow Diagram-DF…...

Spring AI 1.0.0-M6 快速开始(一)

Spring AI 1.0.0-M6 入门一、存储库二、依赖管理完整maven 入门 Spring 是JAVA中我们经常使用的框架之一,Spring AI不断的发展迭代目前已经到M6版本据说上半年会出一个稳定版本。 本节提供了如何开始使用Spring AI的M6。 一、存储库 1.0 M6 -添加Spring存储库 需…...

go 分布式redis锁的实现方式

go 语言以高并发著称。那么在实际的项目中 经常会用到锁的情况。比如说秒杀抢购等等场景。下面主要介绍 redis 布式锁实现的两种高并发抢购场景。其实 高并发 和 分布式锁 是一个互斥的两个状态: 方式一 setNX: 使用 redis自带的API setNX 来实现。能解决…...

Unity中Stack<T>用法以及删除Stack<GameObject>的方法

Unity中Stack用法以及删除Stack的方法 介绍Stack<T>的APIStack<T> 常用方法创建和初始化 Stack<T>Push 和 Pop 操作Stack<T>遍历清空栈检查栈是否包含某个元素 栈的典型应用场景撤销操作深度优先搜索&#xff08;DFS&#xff09;注意事项 总结 介绍 因…...

Vue进阶之Vue3源码解析(二)

Vue3源码解析 运行runtime-coresrc/createApp.tssrc/vnode.ts.tssrc/renderer.ts runtime-domsrc/index.ts 总结 运行 runtime-core src/createApp.ts vue的创建入口 import { createVNode } from "./vnode";export function createAppAPI(render) {return funct…...

linux的文件系统及文件类型

目录 一、Linux支持的文件系统 二、linux的文件类型 2.1、普通文件 2.2、目录文件 2.3、链接文件 2.4、字符设备文件: 2.5、块设备文件 2.6、套接字文件 2.7、管道文件 三、linux的文件属性 3.1、关于权限部分 四、Linux的文件结构 五、用户主目录 5.1、工作目录…...

如何下载安装 PyCharm?

李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网&#xff0c;点击 "Download" 按钮25。 版本选择&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费使用&#xff0c;适合个人学习和基础开发。 专业版&#xff08;Professional&#…...

3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点,SolidWorks/UG/Catia等三维软件通用

软件下载地址&#xff1a; SolidWorks/UG/Catia等三维软件通用&#xff0c;3D空间曲线批量散点化软件V1.0正式发布&#xff0c;将空间线条导出坐标点 - 陶小桃Blog在三维设计领域&#xff0c;工程师常需将复杂空间曲线转化为离散坐标点以用于逆向工程、有限元分析、数控加工或…...

WPS AI+office-ai的安装、使用

** 说明&#xff1a;WPS AI和OfficeAI是两个独立的AI助手&#xff0c;下面分别简单讲下如何使用 ** WPS AI WPS AI是WPS自带AI工具 打开新版WPS&#xff0c;新建文档后就可以看到菜单栏多了一个“WPS AI”菜单&#xff0c;点击该菜单&#xff0c;发现下方出现很多菜单&#xf…...

java后端开发day27--常用API(二)正则表达式爬虫

&#xff08;以下内容全部来自上述课程&#xff09; 1.正则表达式&#xff08;regex&#xff09; 可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps&#xff1a;一…...

拼电商客户管理系统

内容来自&#xff1a;尚硅谷 难度&#xff1a;easy 目 标 l 模拟实现一个基于文本界面的 《 拼电商客户管理系统 》 l 进一步掌握编程技巧和调试技巧&#xff0c;熟悉面向对象编程 l 主要涉及以下知识点&#xff1a; 类结构的使用&#xff1a;属性、方法及构造器 对象的创建与…...

华为:Wireshark的OSPF抓包分析过程

一、OSPF 的5包7状态 5个数据包 1.Hello&#xff1a;发现、建立邻居&#xff08;邻接&#xff09;关系、维持、周期保活&#xff1b;存在全网唯一的RID&#xff0c;使用IP地址表示 2.DBD&#xff1a;本地的数据库的目录&#xff08;摘要&#xff09;&#xff0c;LSDB的目录&…...

Android项目优化同步速度

最近项目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg库&#xff0c;发现原来通过google官方的代码仓&#xff0c;下载太慢了&#xff0c;每秒KB级别的速度。&#xff08;之前下gradle/gradle plugin都不至于这么慢&#xff09;&#xff0c;于是想到配置国内镜像源来提…...

在线教育网站项目第二步 :学习roncoo-education,服务器为ubuntu22.04.05

一、说明 前端技术体系&#xff1a;Vue3 Nuxt3 Vite5 Vue-Router Element-Plus Pinia Axios 后端技术体系&#xff1a;Spring Cloud Alibaba2021 MySQL8 Nacos Seata Mybatis Druid redis 后端系统&#xff1a;roncoo-education&#xff08;核心框架&#xff1a;S…...

STM32-GPIO详解

目录 一&#xff1a;GPIO基本概念 ​编辑 二&#xff1a;GPIO的实际应用 三&#xff1a;功能描述 四&#xff1a;GPIO库函数 五&#xff1a;寄存器 GPIO相关寄存器功能 一&#xff1a;GPIO基本概念 GPIO是英文General Purpose Input/Output的缩写&#xff0c;中文翻译为…...

【Framework系列之Client】UIManager和UIPanel模块介绍

今天来介绍一下UIManager和UIPanel模块&#xff0c;话不多说直接开始。 UIManager 功能介绍 UIManager是管理UIPanel的唯一模块&#xff0c;UIManager的主要功能包括&#xff1a; 提供打开、隐藏、关闭UIPanel的相关接口。负责UIPanel对象的创建以及初始化。负责储存UIPanel对…...

阿里云操作系统控制台——ECS操作与性能优化

引言&#xff1a;在数字化时代&#xff0c;云服务器作为强大的计算资源承载平台&#xff0c;为企业和开发者提供了灵活且高效的服务。本文将详细介绍如何一步步操作云服务器 ECS&#xff0c;从开通到组件安装&#xff0c;再到内存全景诊断&#xff0c;帮助快速上手&#xff0c;…...

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)

背景&#xff1a; 已经用这个脚本的记得设置Wifi时候&#xff0c;关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开&#xff0c;一天要重新连接&#xff0c;点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本&#xff0c;那样我就可以解放双手&…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...