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

发布于:2025-05-07 ⋅ 阅读:(10) ⋅ 点赞:(0)

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

一、捕获异常

在 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 [];
    }
}

五、总结

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


网站公告

今日签到

点亮在社区的每一天
去签到