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

爬虫代码中如何添加异常处理?

在编写爬虫代码时,添加异常处理是非常重要的一步,因为它可以帮助我们处理网络请求中可能出现的各种问题,比如网络连接错误、超时、解析错误等。以下是如何在Python爬虫代码中添加异常处理的示例:

import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

def get_product_details(url):
    try:
        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'
        }
        response = requests.get(url, headers=headers, timeout=10)  # 设置超时时间为10秒
        response.raise_for_status()  # 如果响应状态码不是200,将引发HTTPError

        soup = BeautifulSoup(response.text, 'lxml')
        title = soup.find('div', class_='title').get_text(strip=True)
        price = soup.find('span', class_='price').get_text(strip=True)
        image = soup.find('img', class_='main-image')['src']
        
        return {
            'title': title,
            'price': price,
            'image': image
        }
    except RequestException as e:
        print(f"请求异常: {e}")
    except Exception as e:
        print(f"其他异常: {e}")
    except:
        print("未知错误")
    return None

# 示例URL
url = 'https://detail.1688.com/offer/123456789.html'
product_details = get_product_details(url)
if product_details:
    print(product_details)
else:
    print("商品详情获取失败")

在这个示例中,我们使用了try-except语句来捕获异常:

  1. RequestException:这是requests库中定义的一个基类,用于捕获所有请求相关的异常,比如连接错误、超时等。
  2. HTTPError:当响应的状态码不是200时,response.raise_for_status()会抛出这个异常。
  3. Exception:这是一个通用异常,用于捕获除了RequestException之外的其他所有异常。
  4. except::这是一个通配符,用于捕获所有未被前面except语句捕获的异常。

在实际应用中,我们可以根据需要捕获更具体的异常,并根据异常类型进行不同的错误处理。例如,如果是网络连接问题,我们可能需要重试请求;如果是解析错误,我们可能需要检查HTML结构是否发生了变化。

请注意,异常处理应该尽可能具体,避免使用过于宽泛的except语句,这样可以更准确地定位问题。同时,对于生产环境中的爬虫,我们还需要考虑日志记录、错误重试、异常上报等功能,以确保爬虫的稳定性和可维护性。


http://www.kler.cn/a/460366.html

相关文章:

  • java Redisson 实现限流每秒/分钟/小时限制N个
  • OpenLinkSaas使用手册-待办事项和通知中心
  • MySQL初始安装登录:ERROR 2003 (HY000): Can‘t connect to MySQL server on
  • 刷入super镜像报错 FAILED (remote: ‘Error: Last flash failed : Volume Full‘)
  • 机器学习经典算法——线性回归
  • 彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程
  • torch.nn.Linear(p_input, p_output,bias)
  • 2024Jinger的前端学习内容总结——前端学习路线(超全)
  • 使用 Python 和 LabelMe 实现图片验证码的自动标注
  • 【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观
  • Spring Boot 3 文件上传、多文件上传、大文件分片上传、文件流处理以及批量操作
  • WPF系列五:图形控件Ellipse
  • log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
  • 自己编写甘特图的绘制程序
  • golang 熔断限流降级
  • 商汤C++开发面试题及参考答案
  • 【postgresql 物化视图】自动刷新物化视图2种方法
  • order by语句执行顺序
  • Vue2/Vue3使用DataV
  • .net core 的数据库编程
  • swiftui开发页面加载发送请求初始化@State变量
  • flash-attention保姆级安装教程
  • 脚本方式 迁移 老GITLAB项目到新GITLAB
  • 前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)
  • 服务器系统维护与安全配置
  • 黑马商城:MybatisPlus