爬虫抓取数据时如何处理异常?
在爬虫开发中,处理异常是确保爬虫稳定运行的关键环节。爬虫在运行过程中可能会遇到各种问题,例如网络请求失败、目标页面结构变化、数据缺失等。合理处理这些异常可以提高爬虫的鲁棒性,避免因小问题导致整个爬虫程序崩溃。以下是一些常见的异常处理方法和策略:
1. 网络请求异常处理
网络请求是爬虫中最容易出问题的部分,常见的异常包括超时、连接失败、目标服务器返回错误状态码等。
示例代码:
import requests
from requests.exceptions import RequestExceptiondef get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}try:response = requests.get(url, headers=headers, timeout=10) # 设置超时时间response.raise_for_status() # 检查HTTP状态码是否为200return response.textexcept RequestException as e:print(f"请求失败:{e}")return None
处理策略:
-
超时设置:通过
timeout
参数设置请求超时时间,避免爬虫因长时间等待而卡住。 -
重试机制:使用
requests
的Session
对象结合urllib3
的重试机制。 -
状态码检查:通过
response.raise_for_status()
检查HTTP状态码是否为200。
2. 页面解析异常处理
页面解析过程中可能会遇到HTML结构变化、目标元素缺失等问题,导致BeautifulSoup
或Selenium
抛出异常。
示例代码:
from bs4 import BeautifulSoupdef parse_html(html):soup = BeautifulSoup(html, "lxml")products = []try:items = soup.select(".product-item")for item in items:product = {"name": item.select_one(".product-name").text.strip(),"price": item.select_one(".product-price").text.strip(),"description": item.select_one(".product-description").text.strip()}products.append(product)except AttributeError as e:print(f"解析失败:{e}")return products
处理策略:
-
使用
try-except
块:捕获可能出现的AttributeError
等异常。 -
检查元素是否存在:在访问元素之前,使用
if
语句检查元素是否存在。 -
日志记录:记录异常信息,便于后续分析和修复。
3. 数据缺失处理
在爬取数据时,可能会遇到某些字段缺失的情况。例如,某些商品可能没有用户评价或图片链接。
示例代码:
def parse_html(html):soup = BeautifulSoup(html, "lxml")products = []items = soup.select(".product-item")for item in items:product = {"name": item.select_one(".product-name").text.strip() if item.select_one(".product-name") else "未知","price": item.select_one(".product-price").text.strip() if item.select_one(".product-price") else "未知","description": item.select_one(".product-description").text.strip() if item.select_one(".product-description") else "无描述"}products.append(product)return products
处理策略:
-
使用三元运算符:在提取数据时,检查元素是否存在,避免抛出异常。
-
设置默认值:为缺失的字段设置默认值,例如“未知”或“无描述”。
4. 动态内容加载异常处理
如果目标页面使用JavaScript动态加载内容,使用Selenium
时可能会遇到页面加载超时、元素未找到等问题。
示例代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException, NoSuchElementExceptiondef get_dynamic_html(url):options = webdriver.ChromeOptions()options.add_argument("--headless")driver = webdriver.Chrome(options=options)try:driver.get(url)driver.implicitly_wait(10) # 设置隐式等待时间items = driver.find_elements(By.CSS_SELECTOR, ".product-item")for item in items:name = item.find_element(By.CSS_SELECTOR, ".product-name").textprice = item.find_element(By.CSS_SELECTOR, ".product-price").textprint(f"商品名称:{name}, 价格:{price}")except TimeoutException:print("页面加载超时")except NoSuchElementException:print("未找到目标元素")finally:driver.quit()
处理策略:
-
设置隐式等待:通过
driver.implicitly_wait()
设置隐式等待时间,避免因页面加载缓慢导致元素未找到。 -
捕获异常:使用
try-except
块捕获TimeoutException
和NoSuchElementException
等异常。 -
资源清理:在
finally
块中关闭浏览器实例,确保资源被正确释放。
5. 日志记录
日志记录是爬虫开发中不可或缺的一部分,它可以帮助我们快速定位问题并修复。
示例代码:
import logging# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")def get_html(url):headers = {"User-Agent": "Mozilla/5.0"}try:response = requests.get(url, headers=headers)response.raise_for_status()return response.textexcept RequestException as e:logging.error(f"请求失败:{e}")return Nonedef parse_html(html):soup = BeautifulSoup(html, "lxml")products = []try:items = soup.select(".product-item")for item in items:product = {"name": item.select_one(".product-name").text.strip(),"price": item.select_one(".product-price").text.strip()}products.append(product)except AttributeError as e:logging.error(f"解析失败:{e}")return products
处理策略:
-
配置日志:使用
logging
模块配置日志,记录异常信息。 -
日志级别:根据需要设置日志级别,例如
INFO
、WARNING
、ERROR
等。 -
记录关键信息:在日志中记录关键信息,例如请求URL、异常类型、异常描述等。
6. 异常处理的最佳实践
-
明确异常类型:在捕获异常时,尽量明确异常类型,避免使用过于宽泛的
except
。 -
合理使用重试机制:对于网络请求等易出错的操作,可以结合重试机制提高成功率。
-
资源清理:确保在异常发生时,正确释放资源(如关闭文件、关闭数据库连接、关闭浏览器实例等)。
-
容错设计:在爬虫中加入容错设计,即使部分数据无法获取,也不影响整个程序的运行。
-
监控与报警:对于长时间运行的爬虫,可以结合监控工具(如Prometheus、Grafana)进行实时监控,并在异常发生时发送报警通知。
总结
合理处理异常是确保爬虫稳定运行的关键。通过捕获网络请求异常、页面解析异常、动态内容加载异常等常见问题,并结合日志记录和容错设计,可以显著提高爬虫的鲁棒性。希望本文的示例和策略能帮助你在爬虫开发中更好地应对各种异常情况,确保爬虫程序的高效、稳定运行。
相关文章:
爬虫抓取数据时如何处理异常?
在爬虫开发中,处理异常是确保爬虫稳定运行的关键环节。爬虫在运行过程中可能会遇到各种问题,例如网络请求失败、目标页面结构变化、数据缺失等。合理处理这些异常可以提高爬虫的鲁棒性,避免因小问题导致整个爬虫程序崩溃。以下是一些常见的异…...
【DeepSeek探索篇(四)】高效学习与工作,从搭建DeepSeek个人知识库开始!
高效学习与工作,从搭建DeepSeek个人知识库开始! 打工人和学习者必看!你为何急需一个个人知识库?搭建个人知识库需要用到哪些技术呢?一、模型微调与RAG技术简介二、RAG技术原理剖析 揭秘Embedding:为何它是D…...
游戏引擎学习第125天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天,当我们离开时,工作队列已经完成了基本的功能。这个队列虽然简单,但它能够执行任务,并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…...
【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT
今日号外:🔥🔥🔥 DeepSeek团队正式启动为期五天的开源计划 Day3:DeepGEMM。DeepGEMM 是一个专为简洁高效的 FP8 通用矩阵乘法(GEMM)设计的库,具有细粒度缩放功能,如 Deep…...
Zabbix问题记录2--踩坑HttpRequest,header添加无效
背景 在试图尝试通过Zabbix接入DeepSeek API的时候,由于使用了HTTP的方式,所以需要使用Zabbix 自带的HttpRequest库进行请求,产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...
DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖
最近是接了一个需求咨询图像处理类的,甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全, 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件,能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...
【嵌入式】RTOS安装和测试
RTOS 安装 安装RTOS,可采用RT-Linux框架 [RT-Linux — 快速使用手册](2. RT-Linux — 快速使用手册—基于LubanCat-RK356x系列板卡 文档),apt没有安装包,更新ubuntu系统版本后仍然不行,后更新国内软件源仍然没有检测到安装包。后…...
MySQL的存储引擎
存储引擎的概念 存储引擎:负责将数据存储在物理存储设备(如磁盘)上的结构和机制。存储引擎决定了数据库如何管理、组织和访问数据。) 因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型…...
瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发
触觉智能分享,瑞芯微RK安卓Android主板GPIO按键配置方法,方便大家更好利用空闲IO!由触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持安卓Android、开源鸿蒙Open…...
数据安全_笔记系列09_人工智能(AI)与机器学习(ML)在数据安全中的深度应用
数据安全_笔记系列09_人工智能(AI)与机器学习(ML)在数据安全中的深度应用 人工智能与机器学习技术通过自动化、智能化的数据分析,显著提升了数据分类、威胁检测的精度与效率,尤其在处理非结构化数据、复杂…...
跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)
飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案: 一、背景痛点与解决方案 在技术文档创作中,数学公式的跨平台渲染一直存在三大痛点: 飞书云文档:原生KaTeX渲染与导出功能存在语法限制微软Word:Math…...
Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
Redis 提供了两种主要的持久化机制,分别是 RDB(Redis Database)和 AOF(Append Only File),下面将详细介绍它们的原理、优缺点。 RDB(Redis Database) 原理 RDB 持久化是将 Redis 在某个时间点上的数据集快照以二进制文件的形式保存到磁盘上。可以通过手动执行 SAVE …...
Leetcode-接雨水(单调栈)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …...
[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)
一、介绍 昨天有提到官方已经支持了Skyreels,皆大欢喜,效果更好一些,还有GGUF量化版本,进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建,我体验下来感觉更稳了一些,生成速度也更快…...
安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!
引言: 电力行业正经历智能化变革,安宝特AR数字化工作流以四大核心优势,为电力企业打造全场景智慧运维方案! 四大颠覆性功能,直击行业痛点 1、高度自定义作业流程 支持图文指引、语音播报、AI实时识别(如…...
游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...
微软推出Office免费版,限制诸多,只能编辑不能保存到本地
易采游戏网2月25日独家消息:微软宣布推出一款免费的Office版本,允许用户进行基础文档编辑操作,但限制颇多,其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论,业界人士对其背后的商业策略和用户体验…...
spring中的注解介绍
本篇文章专门用来介绍spring中的各种注解。 1、RestController 1、含义 2、举例 3、使用场景 RestController 通常用于开发 RESTful API,适合返回 JSON 或 XML 数据的场景 4、总结 RestController 是 Spring 中用于简化 RESTful Web 服务开发的注解,它结…...
修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板
前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...
DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
项目地址:https://github.com/deepseek-ai/DeepEP 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (2/5)! 引言 在大模型训练中,混合专家模型(Mixture-of-Experts, MoE)因其动…...
计算机毕业设计 ——jspssm506Springboot 的旧物置换网站
作者:程序媛9688 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题)…...
观成科技:海莲花“PerfSpyRAT”木马加密通信分析
1.概述 在2024年9月中旬至10月,东南亚APT组织“海莲花”通过GitHub发布开源安全工具项目,针对网络安全人员发起了定向攻击。通过对相关攻击活动进行分析,可以将其与一些海莲花的样本关联起来。这些样本的通信数据结构与海莲花此前使用的攻击…...
在使用 npm link 进行本地 npm 包调试时,是否需要删除项目中已安装的依赖包取决于你的调试场景和依赖管理方式
1. 默认情况下不需要删除已安装的包 npm link 的工作原理: 当你在项目中运行 npm link <package-name> 时,npm 会创建一个符号链接(symlink),将项目的 node_modules/<package-name> 指向全局的软链包&am…...
Springboot快速接入豆包大模型
背景 突然接到上面的通知,想要在系统里面接入各大模型的能力,我这边随机选了个豆包,然后快速对接了一下,很顺利,一把过,现在文档的快速入门还是很ok的,在此记录一下过程,给宝子们参考…...
w803|联盛德|WM IoT SDK2.X测试|window11|TOML 文件|外设|TFT_LCD|测试任务|(5):TFT_LCD_LVGL示例
TFT_LCD_LVGL 功能概述 此应用程序是使用 WM IoT SDK 进行 LVGL 功能的示例。它演示了如何初始化 TFT LCD 设备,并创建 LVGL DEMO Task 进行 LVGL 模块的初始化,并展示 LVGL 原生的不同 Demo 场景, 例如: Widgets, Music Player, Benchmark…...
java23种设计模式-观察者模式
观察者模式(Observer Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...
【MySQL 一 数据库基础】深入解析 MySQL 的索引(3)
索引 索引操作 自动创建 当我们为一张表加主键约束(Primary key),外键约束(Foreign Key),唯一约束(Unique)时,MySQL会为对应的的列自动创建一个索引;如果表不指定任何约束时,MySQL会自动为每一列生成一个索引并用ROW_I…...
本地部署 deepseek-r1 1.5B方法-ubuntu20.04 python3.10 pycharm虚拟环境
1. 环境安装 ubuntu20.04 python3.10 pycharm虚拟环境 2.拉取代码 虚拟环境下安装vllm: pip install vllm ubuntu命令窗口安装 sudo apt install git-lfs 初始化 Git LFS 安装 Git LFS 后,你需要虚拟环境命令窗口初始化它:git lfs i…...
【Qt】为程序增加闪退crash报告日志
背景 随着软件代码量的增加,软件崩溃闪退的肯能行越来越大,其中一些是难以复现的,比如访问了访问了非法地址、被操作系统杀死等。 为此,在软件出现闪退情况时,尽可能多的记录闪退发生时信息,对排查闪退原…...
Visual Studio打开文件后,中文变乱码的解决方案
文件加载 使用Unicode(UTF-8)编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。...
某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠
摘要:纯电动商用车的工作环境存在路况复杂、工况恶劣等情况,导致整车电气设备的磨损速率加快,造成电气设备绝缘电阻持续下降,如不及时处理,可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发࿰…...
eclogy后台运维笔记(写的很乱,只限个人观看)
组织权限: 矩阵管理 这个很重要,比如进行流程操作者的选择时,我们进行需要选择财务部的出纳,会计,总经理。我们不能去直接选定一个人,万一这个人离职了,那所有的流程都要手动修改,…...
结构型模式 - 适配器模式 (Adapter Pattern)
结构型模式 - 适配器模式 (Adapter Pattern) 适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 类适配器,适用于要适配的类是一个接口…...
[2/11]C#性能优化-不要使用空析构函数-每个细节都有示例代码
前言 在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。 当然,同样是所有程序的关键环节。 通过遵循下述建议,可以有效地减少不必要的对象创建,从而减轻GC的负担,提高应用程序的整体性能。记住…...
0-基于强化学习的图Transformer算法求解车辆路径问题(2023)
文章目录 Abstract1 Introduction2. Related Work2.1 引言2.2.基于RNN的VRP解决方案2.3.基于GNN的VRP解决方案2.4.基于Transformer的车辆路径问题求解方法3 边嵌入注意力模型3.1 编码器3.1.1 边嵌入多头注意力3.1.2. 前馈网络(FFN)、批量归一化和残差连接3.2 解码器3.2.1 解码…...
Linux:互斥
目录 一、互斥概念 二、互斥的使用函数 三、互斥的底层原理 一、互斥概念 互斥,全称是线程互斥,互斥是一套解决方案,用来保护临界资源。一般在多线程的代码中,要使用互斥这套解决方案来保护临界资源。 主要从代码的角度理解互斥…...
单例模式——c++
一个类,只能有1个对象 (对象在堆空间) 再次创建该对象,直接引用之前的对象 so构造函数不能随意调用 so构造函数私有 so对象不能构造 如何调用私有化的构造函数: 公开接口调用构造函数 调用构造函数:singleTon instance; 但…...
C++之string类的模拟实现(超详细)
们学习东西,先学习如果使用它,然后再学习如何实现它 文章目录 目录 1. 命名空间以及头文件 2.string类的成员变量 3.string类的成员函数 3.1 构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 赋值运算符重载 3.5 c_str函数 3.6 size函数 3.7 clea…...
【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 密钥创建与配置
文章目录 1 前言2 准备工作3 具体配置过程3.1. 本地生成 GPG 密钥3.2. 导出 GPG 密钥3.3. 将密钥配置到 Git 中3.4. 测试提交 4 问题排查记录5 小结与复盘 1 前言 昨天在更新我的第二个 Vim 专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git 操作问题:如何在 …...
【原创工具】同文件夹PDF文件合并 By怜渠客
【原创工具】同文件夹PDF文件合并 By怜渠客 原贴:可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题,并非是软件内自主实现的PDF合并,而是调用的pdftk这一工具,但楼主并没有提供pdftk,而…...
kafka-leader -1问题解决
一. 问题: 在 Kafka 中,leader -1 通常表示分区的领导者副本尚未被选举出来,或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析: 1. 副本同步问题: 在 Kafka 集群中&…...
图像融合+语义
图像配准+融合语义方法总结 1.Joint framework of image registration and fusion RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion(2022CVPR) Unsupervised misaligned infrared and visible image fusion via…...
AI人工智能机器学习之监督学习和集成学习
1、概要 本篇学习AI人工智能机器监督学习框架下的集成学习,以鸢尾花iris数据集、随机森林模型和梯度提升为示例,从代码层面测试和讲述监督学习和集成学习能。 2、监督学习和集成学习 - 简介 监督学习和集成学习是机器学习领域中的两个重要概念。 监督…...
通过返回的key值匹配字典中的value值
需求 页面中上面搜索项有获取字典枚举接口,table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典,下面也是通过字典匹配,所以尽量统一封装一个函数,每个组件保证最少变动tabl…...
30 分钟从零开始入门 CSS
HTML CSS JS 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 30 分钟从零开始入门 CSS-CSDN博客 JavaScript 指南:从入门到实战开发-CSDN博客 前言 最近也是在复习,把之前没写的博客补起来,之前给大家介绍了 html,现在是 CSS 咯…...
矩阵的奇异值(SVD)分解和线性变换
矩阵的奇异值(SVD)分解和线性变换 SVD定义 奇异值分解(Singular Value Decomposition,简称 SVD)是一种重要的线性代数工具,能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...
Kubernetes与Docker:区别与优劣总结
在云原生技术栈中,Docker和Kubernetes是两大核心工具,但它们的功能定位和使用场景截然不同。本文将从技术原理、架构设计、功能特性及适用场景等角度,深入分析两者的区别与优劣,并结合实际应用场景说明如何协同使用。 一、核心技术…...
表单验证和正则表达式
表单验证 表单:收集用户信息,并把信息发送给服务器程序进行处理 what 验证数据的格式,将符合标准数据格式要求的数据,发送给后台。 对用户的输入做格式校验,确保能够发送到后台服务器的数据一定是正确的。降低服务器…...
汽车免拆诊断案例 | 保时捷车发动机偶发熄火故障 2 例
案例1 2008款保时捷卡宴车行驶中发动机偶发熄火 故障现象 一辆2008款保时捷卡宴车,搭载4.8 L 自然吸气发动机,累计行驶里程约为21万km。车主反映,该车行驶中发动机偶发熄火;重新起动,发动机能够起动着机ÿ…...
mongodb【实用教程】
MongoDB 是一个开源的文档型数据库管理系统 下载安装 Windows 系统 https://blog.csdn.net/weixin_41192489/article/details/126777309 GUI工具 【推荐】MongoDB Compass https://www.mongodb.com/zh-cn/docs/compass/current/ Robo 3T https://blog.csdn.net/weixin_4119248…...