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

爬虫程序中如何添加异常处理?

在爬虫程序中添加异常处理是确保程序稳定性和可靠性的关键步骤。异常处理可以帮助你在遇到错误时捕获问题、记录日志,并采取适当的措施,而不是让程序直接崩溃。以下是一些常见的异常处理方法和示例,帮助你在爬虫程序中实现健壮的错误处理机制。

一、捕获异常

在 PHP 中,可以使用 try-catch 块来捕获异常。在爬虫程序中,常见的异常包括网络请求失败、页面解析错误、数据缺失等。

示例代码

php

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;function get_page($url) {try {$client = new Client();$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3']]);return $response->getBody()->getContents();} catch (\Exception $e) {// 记录异常信息error_log("请求失败: " . $e->getMessage());return null;}
}

二、重试机制

在捕获异常后,可以设置重试机制,尝试重新发送请求。这在处理网络请求失败时特别有用。

示例代码

php

<?php
function get_page_with_retry($url, $max_retries = 3) {$attempts = 0;while ($attempts < $max_retries) {try {$client = new Client();$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3']]);return $response->getBody()->getContents();} catch (\Exception $e) {$attempts++;error_log("请求失败,尝试重新发送: " . $e->getMessage());if ($attempts >= $max_retries) {error_log("达到最大重试次数,请求失败");return null;}}}
}

三、日志记录

记录详细的日志信息可以帮助你在出现问题时快速定位和解决问题。可以使用 PHP 的 error_log 函数或第三方日志库(如 Monolog)来记录日志。

示例代码

php

<?php
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;// 创建日志记录器
$log = new Logger('crawler');
$log->pushHandler(new StreamHandler('logs/crawler.log', Logger::WARNING));function get_page($url) {try {$client = new Client();$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3']]);return $response->getBody()->getContents();} catch (\Exception $e) {$log->error("请求失败: " . $e->getMessage());return null;}
}

四、处理页面解析异常

在解析 HTML 内容时,可能会遇到页面结构变化或数据缺失等问题。可以通过捕获异常并记录日志来处理这些问题。

示例代码

php

<?php
use Symfony\Component\DomCrawler\Crawler;function parse_product_details($html) {try {$crawler = new Crawler($html);$products = [];$crawler->filter('.m-itemlist .items .item')->each(function (Crawler $node) use (&$products) {$title = $node->filter('.title')->text();$price = $node->filter('.price')->text();$shop = $node->filter('.shop')->text();$products[] = ['title' => trim($title),'price' => trim($price),'shop' => trim($shop)];});return $products;} catch (\Exception $e) {error_log("页面解析失败: " . $e->getMessage());return [];}
}

五、总结

通过上述方法,你可以在爬虫程序中添加异常处理机制,确保程序在遇到错误时能够稳定运行。捕获异常、设置重试机制、记录日志以及处理页面解析异常是提高爬虫程序健壮性的关键步骤。希望这些方法能帮助你在爬虫开发中更好地应对各种挑战。

相关文章:

爬虫程序中如何添加异常处理?

在爬虫程序中添加异常处理是确保程序稳定性和可靠性的关键步骤。异常处理可以帮助你在遇到错误时捕获问题、记录日志&#xff0c;并采取适当的措施&#xff0c;而不是让程序直接崩溃。以下是一些常见的异常处理方法和示例&#xff0c;帮助你在爬虫程序中实现健壮的错误处理机制…...

[250506] Auto-cpufreq 2.6 版本发布:带来增强的 TUI 监控及多项改进

目录 Auto-cpufreq 2.6 版本发布&#xff1a;带来增强的 TUI 监控及多项改进 Auto-cpufreq 2.6 版本发布&#xff1a;带来增强的 TUI 监控及多项改进 Auto-cpufreq&#xff0c;一款适用于 Linux 的免费开源自动 CPU 速度与功耗优化器&#xff0c;已发布其最新版本 2.6。该工具…...

探索Hello Robot开源移动操作机器人Stretch 3的技术亮点与市场定位

Hello Robot 推出的 Stretch 3 机器人凭借其前沿技术和多功能性在众多产品中占据优势。Stretch 3 机器人采用开源设计&#xff0c;为开发者提供了灵活的定制空间&#xff0c;能够满足各种不同的需求。其配备的灵活手腕组件和 Intel Realsense D405 摄像头&#xff0c;显著增强了…...

【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】

Harbor v2.13.0 详细安装步骤&#xff08;启用 HTTPS&#xff09; 1. 环境准备 系统要求&#xff1a;至少 4GB 内存&#xff0c;100GB 磁盘空间。 已安装组件&#xff1a; Docker&#xff08;版本 ≥ 20.10&#xff09;Docker Compose&#xff08;版本 ≥ v2.0&#xff09; 域…...

码蹄集——直角坐标到极坐标的转换、射线、线段

目录 MT1052 直角坐标到极坐标的转换 MT1066 射线 MT1067 线段 MT1052 直角坐标到极坐标的转换 思路&#xff1a; arctan()在c中是atan()&#xff0c;结果是弧度要转换为度&#xff0c;即乘与180/PI 拓展&#xff1a;cos()、sin()在c代码中表示方式不变 #include<bits/…...

accept() reject() hide()

1. accept() 用途 确认操作&#xff1a;表示用户完成了对话框的交互并确认了操作&#xff08;如点击“确定”按钮&#xff09;。 关闭模态对话框&#xff1a;结束 exec() 的事件循环&#xff0c;返回 QDialog::Accepted 结果码。适用场景 模态对话框&#xff08;通过 exec()…...

天文探秘学习小结

宇宙 宇宙大爆炸 时间 130亿年前 10-30次方秒内发生大爆炸 发现 20世纪80年代 哈勃发现 通过基于其他星系相对地球的移动速度得出的结论 哈勃发现离地球越远的星系 离开地球的速度越快 得出宇宙加速膨胀的结论 测量造父变星到地球的距离 哈勃测量的是一种恒星 叫造父变星 造…...

游戏引擎学习第261天:切换到静态帧数组

game_debug.cpp: 将ProfileGraph的尺寸初始化为相对较大的值 今天的讨论主要围绕性能分析器&#xff08;Profiler&#xff09;以及如何改进它的可用性展开。当前性能分析器已经能够正常工作&#xff0c;但我们希望通过一些改进&#xff0c;使其更易于使用&#xff0c;特别是在…...

利用 Kali Linux 进行信息收集和枚举

重要提示&#xff1a; 在对任何系统进行信息收集和枚举之前&#xff0c;务必获得明确的授权。未经授权的扫描和探测行为是非法的&#xff0c;并可能导致严重的法律后果。本教程仅用于教育和授权测试目的。 Kali Linux 官方链接&#xff1a; 官方网站&#xff1a; https://www…...

深入解析代理服务器:原理、应用与实战配置指南

一、代理服务器的核心原理与工作机制 1.1 网络通信的中介架构 代理服务器&#xff08;Proxy Server&#xff09;本质上是位于客户端与目标服务器之间的中间层节点&#xff0c;其核心工作机制遵循OSI模型的​​会话层​​与​​应用层​​协议。当客户端发起网络请求时&#x…...

[蓝桥杯 2025 省 B] 水质检测(暴力 )

暴力暴力 菜鸟第一次写题解&#xff0c;多多包涵&#xff01;&#xff01;! 这个题目的数据量很小&#xff0c;所以没必要去使用bfs&#xff0c;直接分情况讨论即可 一共两排数据&#xff0c;我们使用贪心的思想&#xff0c;只需要实现从左往右的过程中每个检测器相互连接即…...

区块链+数据库:技术融合下的应用革新与挑战突围

引言 近年来&#xff0c;区块链技术凭借其去中心化、不可篡改、透明可追溯等特性&#xff0c;逐渐从数字货币领域扩展到更广泛的应用场景&#xff0c;包括供应链管理、医疗健康、政务服务和数字身份等。与此同时&#xff0c;传统数据库系统在应对海量数据、多方协作与安全需求…...

油气地震资料信号处理中的NMO(正常时差校正)

油气地震资料信号处理中的NMO&#xff08;正常时差校正&#xff09;介绍与应用 NMO基本概念 **正常时差校正&#xff08;Normal Moveout Correction&#xff0c;NMO&#xff09;**是地震资料处理中的一项关键技术&#xff0c;主要用于消除由于炮检距&#xff08;source-recei…...

TDengine 车联网案例

简介 随着科技的迅猛发展和智能设备的广泛普及&#xff0c;车联网技术已逐渐成为现代交通领域的核心要素。在这样的背景下&#xff0c;选择一个合适的车联网时序数据库显得尤为关键。车联网时序数据库不仅仅是数据存储的解决方案&#xff0c;更是一个集车辆信息交互、深度分析…...

探索编程世界:从“爱编程的小黄鸭”B站账号启航

探索编程世界&#xff1a;从“爱编程的小黄鸭”B站账号启航 在编程学习的漫漫长路上&#xff0c;你是否常常为寻找优质、易懂的学习资源而烦恼&#xff1f;今天&#xff0c;我想给大家分享一个宝藏B站账号——“爱编程的小黄鸭”&#xff0c;希望能为大家的编程学习之旅提供一…...

使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录

使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录 步骤 1&#xff1a;初始化主仓库步骤 2&#xff1a;逐个添加子项目2.1 添加子项目远程仓库2.2 将子项目合并到主仓库的指定目录2.3 重复操作其他子项目 步骤 3&#xff1a;验证提交历史步骤 4&#xff08;可选&am…...

Django缓存框架API

这里写自定义目录标题 访问缓存django.core.cache.cachesdjango.core.cache.cache 基本用法cache.set(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get(key, defaultNone, versionNone)cache.add(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get_or_se…...

Linux云计算训练营笔记day02(Linux、计算机网络、进制)

Linux 是一个操作系统 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登录用户 管理员 root a 普通用户 nsd a 打开终端 放大: ctrl shift 缩小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目录 /root 当前登录的用户…...

LIO-Livox

用单台Livox Horizon (含内置IMU) 实现高鲁棒性的激光-惯性里程计&#xff0c;可在各类极端场景下鲁棒运行&#xff0c;并达到高精度的定位和建图效果。(城区拥堵、高速公路、幽暗隧道) 注&#xff1a;该系统主要面向大型室外环境中的汽车平台设计。用户可以使用 Livox Horizo…...

VNP46A3灯光遥感数据全球拼接并重采样

感谢Deepseek帮我写代码&#xff0c;本人在此过程中仅对其进行调试和部分修改&#xff1a; 灯光遥感2024年1月全球拼接结果 代码如下&#xff1a; import os import glob import h5py import numpy as np from osgeo import gdal, osr import rasterio from rasterio.merge im…...

CEF格式说明

又是一年护网季&#xff0c;现在甲方hw已经主流采用SIEM平台了&#xff0c;IPS、IDS、WAF、FW、EDR等安全数据经过安全态势感知这个二道贩子展现在蓝队面前&#xff0c;勉强能用&#xff0c;今天来说一下SIEM中常见的CEF格式&#xff0c;Common Event Format&#xff0c;公共事…...

【Trea】Trea国际版|海外版下载

Trea目前有两个版本&#xff0c;海外版和国内版。‌ Trae 版本差异 ‌大模型选择‌&#xff1a; ‌国内版‌&#xff1a;提供了字节自己的Doubao-1.5-pro以及DeepSeek的V3版本和R1版本。海外版&#xff1a;提供了ChartGPT以及Claude-3.5-Sonnet和3.7-Sonnt. ‌功能和界面‌&a…...

如何管理两个Git账户

背景 在开发过程中&#xff0c;我们有时需要同时使用 多个 Git 账户&#xff08;如个人 GitHub 账户和公司 GitLab 账户&#xff09;。但由于 Git 默认使用全局配置&#xff0c;可能会导致提交信息混乱、权限冲突等问题。本文将介绍如何在同一台机器上 安全、高效地管理多个 G…...

概统期末复习--速成

随机事件及其概率 加法公式 推三个的时候ABC&#xff0c;夹逼准则 减法准则 除法公式 相互独立定义 两种分析 两个解法 古典概型求概率&#xff08;排列组合&#xff09; 分步相乘、分类相加 全概率公式和贝叶斯公式 两阶段问题 第一个小概率*A在小概率的概率。。。累计 …...

Linux系统之shell脚本基础:条件测试、正整数字符串比较与if、case语句

目录 一.条件测试 1.三种测试方法 2.正整数值比较 3.字符串比较 4.逻辑测试 二.脚本中常用命令 1.echo命令 2.date命令 3.cal命令 4.tr命令 5.cut命令 6.sort命令 7.uniq命令 8.cat多行重定向 三.if语句 1.使用格式 2.if语句实例 四.case格式 1.使用格式 2…...

15.Spring Security对Actuator进行访问控制

15.Spring Security对Actuator进行访问控制 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocati…...

Eigen矩阵的平移,旋转,缩放

#include <Eigen/Core> #include <Eigen/Dense>平移 x轴 // 原始点或对象的坐标Eigen::Vector3d original_point(1.0, 2.0, 3.0);std::cout << "original_point: " << std::endl << original_point << std::endl;// x 轴上的平…...

基站综合测试仪核心功能详解:从射频参数到5G协议测试实战指南

基站综合测试仪是通信网络建设和维护中的关键工具&#xff0c;主要用于对基站设备进行全面的性能验证和故障诊断&#xff0c;确保其符合行业标准并稳定运行。其主要作用包括&#xff1a; 1. 基站发射机性能测试 射频参数测量&#xff1a;检测发射功率、频率精度、调制质量&…...

Android setContentView()源码分析

文章目录 Android setContentView()源码分析前提setContentView() 源码分析总结 Android setContentView()源码分析 前提 Activity 的生命周期与 ActivityThread 相关&#xff0c;调用 startActivity() 时&#xff0c;会调用 ActivityThread#performLaunchActivity()&#xf…...

BERT 微调

BERT微调 微调 BERT BERT 对每一个词元&#xff08; token &#xff09;返回抽取了上下文信息的特征向量 不同的任务使用不同的特征 句子分类 将 < cls > 对应的向量输入到全连接层分类 命名实体识别 识别一个词元是不是命名实体&#xff0c;例如人名、机构、位置…...

K8S使用--dry-run输出资源模版和兼容性测试

1、生成资源模版 使用 --dry-run 创建资源&#xff1a; kubectl create deploy web-ng --imagenginx:1.28 --replicas2 --dry-runclient -o yaml # 查询是否存在 web-ng的资源 kubectl get deployment -A |grep web-ng 通过以上命令可以看到&#xff0c;web-ng的deployment并没…...

01硬件原理图

一、硬件设计关键信息 原理图概要: 1. 核心板&#xff1a;上电时序控制&#xff0c;DDR3&#xff0c;Flash。 2. 底板&#xff1a;以太网&#xff0c;USB&#xff0c;IO&#xff0c;AD9361&#xff0c;射频链路等。 设计Xlinx的原理图和PCB设计需要的文档&#xff1a; 1、…...

算法 | 长颖燕麦优化算法AOO,算法原理,公式,深度解析+性能实测(Python代码)

以下是对长颖燕麦优化算法(AOO)的深度解析,结合其灵感来源、算法原理、公式推导及性能实测分析: 一、算法原理与行为建模 长颖燕麦优化算法(AOO)基于燕麦种子的三种自然行为设计优化策略,模拟其适应环境的动态过程: 种子传播(全局探索阶段) 行为模拟:种子通过风、水…...

5.1经典架构

一、大模型架构 了解常见的大模型架构&#xff0c;如 GPT 系列、LLaMA 系列、GLM 系列、Qwen 系列、DeepSpeek 系列等。对比他们之间的差异&#xff0c;以及每个模型演变过程 模型主要机构技术路线特点中文适配情况GPT 系列OpenAIDecoder-only对话能力强、商业化领先英文为主&a…...

BBS (cute): 1.0.2靶场渗透

BBS (cute): 1.0.2 来自 <BBS (cute): 1.0.2 ~ VulnHub> 前言&#xff1a;攻击机无法扫描靶机解决方案 1&#xff0c;在开机时&#xff0c;按下shift进入界面&#xff0c;按e进入该界面 2&#xff0c;ro替换为 rw signie init/bin/bash 3&#xff0c;按Ctrl键X键如果没成…...

Redis面试 实战贴 后面持续更新链接

面试问题列表&#xff1a; Redis支持哪些数据类型&#xff1f;各适用于什么场景&#xff1f; Redis为什么采用单线程模型&#xff1f;优势与瓶颈是什么&#xff1f; RDB和AOF持久化的区别&#xff1f;如何选择&#xff1f;混合持久化如何实现&#xff1f; Redis缓存穿透、雪…...

搭建spark yarn 模式的集群

搭建Spark YARN模式集群步骤 1. 环境准备 系统&#xff1a;采用Linux系统&#xff08;如Ubuntu、CentOS &#xff09;&#xff0c;借助ntp实现节点间时间同步&#xff0c;关闭防火墙及SELinux。 Java&#xff1a;安装JDK 8及以上版本&#xff0c;配置JAVA_HOME环境变量。 H…...

静态库和动态库的区别

简而言之&#xff1a;静态库是.o文件&#xff0c;是直接编译到进程里面的&#xff0c;其他的进程不能使用&#xff0c;动态库是.so文件&#xff0c;是放到linux的文件系统里面的&#xff0c;在程序运行的时候去拿来调用&#xff0c;所以多个进程都能访问 # Linux中的静态库与动…...

Relay算子注册

TVM 卷积算子注册代码深度解析 源码位置&#xff1a;src/relay/op/nn/convolution.cc 作用&#xff1a;conv2d等算子的注册实现 TVM_REGISTER_NODE_TYPE(Conv2DAttrs);TVM_REGISTER_GLOBAL("relay.op.nn._make.conv2d").set_body_typed([](Expr data, Expr weight,…...

俄罗斯电商市场:增长与变革中的新势力崛起

近年来&#xff0c;全球跨境电商市场格局正经历深刻变革&#xff0c;东南亚、非洲、拉美和中东等新兴市场凭借人口红利和互联网渗透率提升&#xff0c;成为国际电商企业竞相争夺的蓝海。然而&#xff0c;在这场全球化的电商浪潮中&#xff0c;俄罗斯市场正以惊人的增速和独特的…...

HHsuite3 的 HHblits 和 HHsearch比较

HHblits 与 HHsearch 的核心区别及远源同源检测能力对比 一、核心功能与定位差异 特征HHblitsHHsearch核心目标快速迭代搜索,构建高质量多序列比对(MSA)和 Profile HMM,用于大规模序列聚类与初步同源筛选。高精度 Profile HMM-HMM 比对,用于深度同源检测与结构 / 功能预测…...

C++(1)

一、从 C 到 C 1、引用&#xff08;掌握&#xff09; 1.1 概念 别名机制&#xff1a;引用本质上是对变量的一种别名&#xff0c;它就像变量的另一个名字&#xff0c;对引用的操作实际上就是对原变量的操作。从底层实现来看&#xff0c;引用可能是通过指针来实现的&#xff0…...

Android组件化 -> Debug模式下,本地构建module模块的AAR和APK

本地构建module模块的AAR gradle.properties isCommonApp false模块的build.gradle apply plugin: com.android.library&#xff1a;module模块编译manifest.srcFile src/main/AndroidManifest.xml&#xff1a;读取没有启动App和Activity的配置文件 if (isCommonApp.toBoo…...

“wsl --install -d Ubuntu-22.04”下载慢,中国地区离线安装 Ubuntu 22.04 WSL方法(亲测2025年5月6日)

从中国地区通过 wsl --install 或 Microsoft Store 安装 WSL 发行版&#xff08;如 Ubuntu&#xff09;时&#xff0c;下载速度往往非常慢&#xff0c;甚至卡在 0% 很久。这是因为微软服务器在国内访问速度受限。 以下是几种 解决方法&#xff0c;可加快 WSL 发行版&#xff0…...

CAN报文中的标准帧和扩展帧

目录 1. 标准帧&#xff08;Standard Frame&#xff09; 2. 扩展帧&#xff08;Extended Frame&#xff09; 3. 核心区别 4. 如何区分标准帧与扩展帧&#xff1f; 5. 应用场景 6. 注意事项 在CAN&#xff08;Controller Area Network&#xff09;总线协议中&#xff0c;标…...

使用AI应用开发平台搭建夸奖机器人,玩转AI【COZE入门案例-第1课】

Coze Coze是字节跳动旗下的产品,更注重用户友好性和C端场景优化。其主要特点包括: ‌快速部署‌:Coze提供拖拽式界面和丰富的插件(如天气查询、电商导流工具),适合快速搭建对话机器人和轻量化应用‌。‌生态集成‌:Coze依托字节生态,支持与飞书、抖音等平台的无缝集成…...

二叉树—中序遍历—非递归

初始状态 假设当前从根节点 b 开始&#xff0c;此时栈为空 。 第一步&#xff1a;处理根节点 b 的左子树 调用 goAlongLeftBranch 函数&#xff0c;从节点 b 开始&#xff0c;因为 b 有左子树&#xff08;节点 a &#xff09;&#xff0c;将 b 入栈&#xff0c;此时栈&#…...

空间内任意点到直线和平面的距离推导

前言 点到直线&#xff0c;点到面的距离公式的手工推导。很久没有数学推导了&#xff0c;再试一把。 一、初步推导 二、转换为标准的形式 三、两种特殊情况的验证 四、推广到3维的情况 结束语 可能从向量的角度来推导&#xff0c;更加的便捷。很多数学知识都忘记了&#xff0c;…...

代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串

代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串 151.翻转字符串里的单词 思路 我的想法是模拟&#xff0c;用状态机拾取单词&#xff0c;然后存到双重数组中&#xff0c;再反向读取输出状态机有…...

Unity学习笔记二

文章目录 3D数学公共计算结构体Mathf常用成员三角函数 向量Vector3基本成员点乘叉乘插值运算 四元数引出基本概念Quaternion结构体成员四元数运算 更多的Mono延迟函数协同程序多线程相关协程概念辨析协程本体协程调度器 Resources资源动态加载特殊文件夹Resources同步加载Resou…...