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

如何在PHP爬虫中处理异常情况的详细指南

一、常见的异常类型

在爬虫开发中,可能会遇到以下几种常见的异常情况:

  1. 网络请求失败:目标服务器不可用或网络连接问题。

  2. 页面结构变化:目标网站更新了HTML结构,导致选择器无法正确匹配。

  3. 反爬机制触发:请求频率过高或被识别为爬虫,导致被限制访问。

  4. 数据解析错误:页面内容缺失或格式不符合预期,导致解析失败。

二、异常处理机制

(一)使用try-catch块捕获异常

在PHP中,可以使用try-catch块来捕获和处理异常。以下是一个示例:

<?php
require 'vendor/autoload.php';use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;function get_html($url) {$client = new Client();try {$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36']]);return $response->getBody()->getContents();} catch (Exception $e) {echo "请求失败: " . $e->getMessage() . "\n";return null;}
}function parse_html($html) {try {$crawler = new Crawler($html);$products = [];$crawler->filter('div.product-item')->each(function (Crawler $node) use (&$products) {$title = $node->filter('h3.product-title')->text();$price = $node->filter('span.product-price')->text();$link = $node->filter('a.product-link')->attr('href');$products[] = ['title' => $title,'price' => $price,'link' => $link];});return $products;} catch (Exception $e) {echo "解析失败: " . $e->getMessage() . "\n";return [];}
}function get_product_list($keyword, $page = 1) {$base_url = "https://www.17zwd.com/search";$url = $base_url . "?q=" . urlencode($keyword) . "&page=" . $page;$html = get_html($url);if ($html) {return parse_html($html);}return [];
}try {$keyword = "书籍"; // 替换为实际关键词$products = get_product_list($keyword);foreach ($products as $product) {echo "商品名称: " . $product['title'] . "\n";echo "商品价格: " . $product['price'] . "\n";echo "商品链接: " . $product['link'] . "\n";echo "----------------------\n";}
} catch (Exception $e) {echo "发生错误: " . $e->getMessage() . "\n";
}

(二)记录日志

在生产环境中,仅仅打印错误信息是不够的。建议将错误信息记录到日志文件中,以便后续分析和排查问题。可以使用PHP的error_log函数或第三方日志库(如monolog)来记录日志。

使用error_log记录日志:

function log_error($message) {error_log($message . "\n", 3, "/path/to/error.log");
}function get_html($url) {$client = new Client();try {$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36']]);return $response->getBody()->getContents();} catch (Exception $e) {log_error("请求失败: " . $e->getMessage());return null;}
}
使用monolog记录日志:

composer require monolog/monolog

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

(三)重试机制

在网络请求失败时,可以设置重试机制,尝试重新发送请求。可以通过递归或循环实现重试逻辑。

function get_html($url, $retry = 3) {$client = new Client();try {$response = $client->request('GET', $url, ['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36']]);return $response->getBody()->getContents();} catch (Exception $e) {if ($retry > 0) {echo "请求失败,正在重试... ($retry)\n";return get_html($url, $retry - 1);} else {echo "请求失败: " . $e->getMessage() . "\n";return null;}}
}

(四)优雅地处理反爬机制

如果被目标网站识别为爬虫并限制访问,可以尝试以下策略:

  1. 降低请求频率:增加请求间隔时间。

  2. 更换User-Agent:随机选择不同的User-Agent。

  3. 使用代理服务器:通过代理服务器发送请求,避免被封禁IP。

function get_html($url) {$client = new Client();$user_agents = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15"];try {$response = $client->request('GET', $url, ['headers' => ['User-Agent' => $user_agents[array_rand($user_agents)]]]);return $response->getBody()->getContents();} catch (Exception $e) {echo "请求失败: " . $e->getMessage() . "\n";return null;}
}

三、总结

通过上述方法,可以高效地处理PHP爬虫中的异常情况,确保程序的稳定运行。在开发过程中,务必注意以下几点:

  1. 使用try-catch块捕获并处理异常。

  2. 记录错误信息到日志文件,便于后续分析。

  3. 设置重试机制,避免因网络问题导致请求失败。

  4. 优雅地处理反爬机制,避免被目标网站封禁。

希望本文能为你提供有价值的参考,帮助你更好地利用PHP爬虫技术获取电商平台数据。

相关文章:

如何在PHP爬虫中处理异常情况的详细指南

一、常见的异常类型 在爬虫开发中&#xff0c;可能会遇到以下几种常见的异常情况&#xff1a; 网络请求失败&#xff1a;目标服务器不可用或网络连接问题。 页面结构变化&#xff1a;目标网站更新了HTML结构&#xff0c;导致选择器无法正确匹配。 反爬机制触发&#xff1a;请…...

贪吃蛇身匀速运动模型

通用运动模型 我们已知斜线为移动的距离 d d d&#xff0c; x x x轴总偏移量为 d x dx dx&#xff0c; y y y轴总偏移量为 d y dy dy&#xff0c;在一帧当中&#xff0c;我们也知道能走的距离为 m d md md。那么作为一般的运动模型&#xff0c;该如何确定我们进行移动的方向呢&…...

npm 执行安装报错

Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. 原因​ 主要的原因是 npm7 以上的版本&#xff0c;新增了一个对等依赖的特性&#xff0c;在以…...

SPA单页面应用优化SEO

1.SSR服务端渲染 将组件或页面通过服务器生成html&#xff0c;再返回给浏览器&#xff0c;如nuxt.js或vue-server-renderer const Vue require(vue); const server require(express)(); const renderer require(vue-server-renderer).createRenderer();const vueApp new …...

笔记五:C语言编译链接

Faye&#xff1a;孤独让我们与我们所爱的人相处的每个瞬间都无比珍贵&#xff0c;让我们的回忆价值千金。它还驱使你去寻找那些你在我身边找不到的东西。 ---------《寻找天堂》 目录 一、编译和链接的介绍 1.1 程序的翻译环境和执行环境 1.1.1 翻译环境 1.1.2 运行环境 …...

【c语言概述、数据类型、运算符与表达式精选题】

c语言概述、数据类型、运算符与表达式精选题 一、易错题1.1&#x1f384; c程序的执行1.2&#x1f384; c程序的基本组成单元1.3&#x1f384; c程序的组成1.4&#x1f384; 5种基本类型数据类型长度1.5&#x1f384; C语言关键字1.6&#x1f384; 整型常量1.7&#x1f384; 合…...

200个前卫街头氛围涂鸦艺术水墨颜料手绘笔迹飞溅PNG免扣迭加纹理素材 VANTABLACK TEXTURES

探索 Vantablack 200 纹理包&#xff1a;您获得前卫、高分辨率纹理的首选资源。非常适合旨在为其作品添加原始都市氛围的设计师。这些透明迭加层使用简单&#xff0c;但非常有效&#xff0c;只需单击几下&#xff0c;即可将您的设计从普通变为非凡。准备好用既酷又百搭的质地来…...

机试准备第11天

第一题是浮点数加法&#xff0c;目前写过最长的代码。 #include <stdio.h> #include <string> #include <iostream> #include <vector> using namespace std; int main() {string str1;string str2;while (getline(cin, str1) && getline(cin…...

OpenIndiana Hipster系统安装配置

gcc安装 直接pkt install gcc会报错 需要 先pkt update&#xff0c;然后重启&#xff08;不重启还是报错&#xff09;用pkg search compiler找到可用的gcc包再pkt install xx安装这个包 TCP配置 参考这个网站&#xff1a;https://community.spiceworks.com/t/setting-tcp-p…...

深度学习模型Transformer核心组件—自注意力机制

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…...

Java核心语法:从变量到控制流

一、变量与数据类型&#xff08;对比Python/C特性&#xff09; 1. 变量声明三要素 // Java&#xff08;强类型语言&#xff0c;需显式声明类型&#xff09; int age 25; String name "CSDN"; // Python&#xff08;动态类型&#xff09; age 25 name …...

nature genetics | SCENT:单细胞多模态数据揭示组织特异性增强子基因图谱,并可识别致病等位基因

–https://doi.org/10.1038/s41588-024-01682-1 Tissue-specific enhancer–gene maps from multimodal single-cell data identify causal disease alleles 研究团队和单位 Alkes L. Price–Broad Institute of MIT and Harvard Soumya Raychaudhuri–Harvard Medical S…...

大白话如何使用 CSS 实现响应式布局?请列举一些常见的方法。

大白话如何使用 CSS 实现响应式布局&#xff1f;请列举一些常见的方法。 答题思路 首先要解释什么是响应式布局&#xff0c;让读者明白其概念和重要性。然后依次介绍常见的实现响应式布局的CSS方法&#xff0c;包括媒体查询、弹性布局&#xff08;Flexbox&#xff09;、网格布…...

基于数据挖掘的疾病数据可视化分析与预测系统

【大数据】基于数据挖掘的疾病数据可视化分析与预测系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f4cc; 技术核爆点&#xff1a;✔️ Python全栈开发Flask高能框架 ✔️ 爬虫技术…...

《AI大模型专家之路》No.2:用三个模型洞察大模型NLP的基础能力

用三个模型洞察大模型NLP的基础能力 一、项目概述 在这个基于AI构建AI的思维探索项目中&#xff0c;我们实现了一个基于BERT的中文AI助手系统。该系统集成了文本分类、命名实体识别和知识库管理等功能&#xff0c;深入了解本项目可以让读者充分了解AI大模型训练和推理的基本原…...

Spring Boot集成Minio笔记

一、首先配置MinIO 1、MinIO新建Bucket&#xff0c;访问控制台如图 创建访问密钥(就是账号和密码) 二、集成mino添加Minio客户端依赖 1.maven构建方式在pom.xml引入jar <dependency><groupId>io.minio</groupId><artifactId>minio</artifactI…...

本地运行Manus的替代方案:OpenManus的技术解析与实践指南

无需邀请码&#xff0c;三小时构建的开源智能体革命 一、背景&#xff1a;从Manus到OpenManus的技术突围 近期&#xff0c;AI智能体领域因Manus的发布引发热议。这款号称“全球首个通用型AI智能体”的产品&#xff0c;通过整合浏览器操作&#xff08;Browser Use&#xff09;…...

Spring Boot整合Resilience4j教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是将Spring Boot与Resilience4j整合的详细教程&#xff0c;包含基础配置和核心功能示例&#xff1a; Spring Boot整合Resilience4j教程 Resilience4j提…...

HCIA-路由重分布

一、路由重分布是指在同一个网络中&#xff0c;将一种路由协议所学习到的路由信息导入到另一种路由协议中的技术&#xff0c;实现通信。 二、实验 1、配置 AR1AR2AR3sy sy AR1 int g 0/0/1 ip add 192.168.1.254 24 int g 0/0/0 ip add 10.1.1.1 24 rip version 2 net 192.16…...

低轨卫星引爆高频PCB市场:猎板PCB的技术革新与产业机遇

一、低轨卫星产业的爆发与高频PCB需求 低轨卫星&#xff08;LEO Satellite&#xff09;因其低延迟、广覆盖的特性&#xff0c;成为全球通信网络补盲的关键技术。根据行业预测&#xff0c;到2030年&#xff0c;全球低轨卫星数量将突破5万颗&#xff0c;市场规模超千亿美元12。这…...

事件系统之如何处理用户输入和其他事件

概述 在Qt中&#xff0c;事件系统是核心机制之一&#xff0c;它允许开发者以一种灵活且高效的方式处理各种类型的事件&#xff0c;包括用户输入、窗口系统事件、定时器事件等 基本概念 事件&#xff08;Event&#xff09;&#xff1a;事件是描述应用程序状态变化的对象&…...

【项目】nnUnetv2复现

作者提出一种nnUNet(no-new-Net)框架,基于原始的UNet(很小的修改),不去采用哪些新的结构,如相残差连接、dense连接、注意力机制等花里胡哨的东西。相反的,把重心放在:预处理(resampling和normalization)、训练(loss,optimizer设置、数据增广)、推理(patch-based…...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…...

恭喜!《哪吒2》明天将荣登世界影坛第六!目前仅差1.81亿元

全球总票房为为20.27亿美元&#xff01;3月8日将荣登世界影坛第六宝座&#xff01; 中国票房 内地票房 中国电影票房、灯塔、猫眼三大数据源加权平均得出《哪吒2》中国内地总票房为144.26亿元人民币。 港澳票房 目前港澳地区没有新的数据显示&#xff0c;按3月6日1905电影网…...

e2studio开发RA4M2(15)----配置RTC时钟及显示时间

e2studio开发RA4M2.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…...

Flink深入浅出之04:时间、水印、TableSQL

深入理解Flink的waterMark的机制、Flink Table和SQL开发 3️⃣ 目标 掌握WaterMark的的原理掌握WaterMark的运用掌握Flink Table和SQL开发 4️⃣ 要点 &#x1f4d6; 1. Flink中的Time概念 对于流式数据处理&#xff0c;最大的特点是数据上具有时间的属性特征 Flink根据时…...

MongoDB Compass 使用说明

MongoDB Compass 使用说明 安装工具栏按钮详细介绍Connect(连接)1. New Window&#xff08;新窗口&#xff09;2. Disconnect&#xff08;断开连接&#xff09;3. Import Saved Connections&#xff08;导入保存的连接&#xff09;4. Export Saved Connections&#xff08;导出…...

Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路 把窗口全部关闭读取新的图片图像预处理创建条码模型设置模型参数搜索模型获取条码结果显示条码结果 图像预处理和条码增强 对比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增强图像的对比度图像模糊…...

信号完整性基础:高速信号的扩频时钟SSC测试

扩频时钟 SSC 是 Spread Spectrum Clock 的英文缩写&#xff0c;目前很多数字电路芯片都支持 SSC 功能&#xff0c;如&#xff1a;PCIE、USB3.0、SATA 等等。那么扩频时钟是用来做什么的呢&#xff1f; SSC背景&#xff1a; 扩频时钟是出于解决电磁干扰&#xff08;EMI&#…...