异常处理

简介: 【8月更文挑战第12天】

在 Python 爬虫中,异常处理是一个重要的环节,它可以帮助我们处理在爬取过程中可能遇到的各种问题,如网络请求错误、数据解析错误、文件写入错误等。通过异常处理,我们可以确保爬虫的稳定性和数据的准确性。

以下是一些常见的异常处理方法和代码示例:

1. 处理请求异常

在使用 requests 发送网络请求时,可能会遇到连接错误、超时等异常。

代码示例

import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout

url = 'http://example.com'
try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()  # 检查请求是否成功
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')  # HTTP 错误处理
except ConnectionError as conn_err:
    print(f'Connection error occurred: {conn_err}')  # 连接错误处理
except Timeout as timeout_err:
    print(f'Timeout error occurred: {timeout_err}')  # 超时错误处理
except Exception as err:
    print(f'An error occurred: {err}')  # 其他错误处理

2. 处理解析异常

在使用 BeautifulSoup 解析 HTML 时,可能会遇到找不到标签或属性的错误。

代码示例

from bs4 import BeautifulSoup, Tag

html = '<html><head></head><body><p>Example</p></body></html>'
try:
    soup = BeautifulSoup(html, 'html.parser')
    tag = soup.find('a')  # 尝试找到一个 <a> 标签
    if not isinstance(tag, Tag):
        raise ValueError("Tag not found")
except ValueError as e:
    print(e)

3. 处理文件操作异常

在读写文件时,可能会遇到文件不存在、权限不足等异常。

代码示例

try:
    with open('file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("File not found")
except IOError as e:
    print(f'File error occurred: {e}')

4. 处理数据存储异常

在将数据存储到数据库或其他存储系统时,可能会遇到连接失败、数据格式错误等异常。

代码示例(以 SQLite 数据库为例):

import sqlite3

try:
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM non_existent_table')  # 尝试查询一个不存在的表
except sqlite3.DatabaseError as e:
    print(f'Database error occurred: {e}')
finally:
    conn.close()

5. 处理自定义异常

有时候,我们可能需要定义自己的异常来处理特定的错误情况。

代码示例

class DataFormatError(Exception):
    """Exception raised for errors in the input data format."""

def process_data(data):
    if not isinstance(data, dict):
        raise DataFormatError("Data should be a dictionary")
    # 处理数据

try:
    process_data(some_data)
except DataFormatError as e:
    print(e)

6. 使用 finally 确保资源释放

finally 块中的代码无论是否发生异常都会执行,这通常用于确保资源(如文件或网络连接)被正确关闭。

代码示例

try:
    resource = acquire_resource()
    # 使用资源进行操作
except Exception as e:
    print(f'An error occurred: {e}')
finally:
    release_resource(resource)

7. 使用 else 仅在没有异常时执行

else 块中的代码仅在没有异常发生时才会执行。

代码示例

try:
    # 尝试执行的操作
    pass
except SomeException as e:
    print(e)
else:
    # 如果没有异常发生,执行这里的代码
    print("Operation successful")
目录
相关文章
|
7月前
|
传感器 算法 物联网
室内定位无线技术的分类和原理全解析(一)
室内定位无线技术通过射频、声波、光信号等解决卫星信号无法覆盖的盲区,实现人员、物资精准定位。主流技术分射频、声波、光学及新兴四大类,涵盖蓝牙、UWB、Wi-Fi、红外、可见光、毫米波等,适用于工业、医疗、园区等多场景,各具精度、成本与部署优势。
|
10月前
|
数据采集 存储 机器学习/深度学习
数据融合是什么?进行数据融合的4大关键环节!
当业务数据分散、格式不一,难以统一分析时,数据融合成为关键。它通过整合多源数据,形成统一、高质量的数据集,为AI模型提供精准输入。本文详解数据融合的定义、类型、挑战及应对方法,助你打破数据壁垒,挖掘深层价值,推动业务创新。
数据融合是什么?进行数据融合的4大关键环节!
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
782 6
|
Java 数据库连接 Maven
手把手整合SSM框架1
手把手整合SSM框架
431 0
|
8月前
|
数据采集 数据可视化 安全
新材料企业CRM软件怎么选?2025年新版选型指南来了!
新材料行业销售周期长、客户多元、数据复杂,亟需高效CRM系统支撑。理想CRM应具备强数据整合、灵活定制、多系统协同及高安全性,助力企业提升销售效率与客户忠诚度,推动数字化转型与可持续发展。
247 1
|
11月前
|
分布式计算 Java 大数据
Java:技术生态中的常青树
Java:技术生态中的常青树
|
机器学习/深度学习 人工智能 自然语言处理
【强化学习】强化学习的概述及应用,附带代码示例
强化学习(Reinforcement Learning, RL)是机器学习中的一种重要范式,它通过让智能体(agent)在环境中采取行动并根据所获得的奖励(reward)来学习最优的策略(policy)。简而言之,强化学习的目标是让智能体学会在特定环境下做出决策,以最大化累积奖励。这种学习方式模拟了生物体如何在环境给予的正反馈(奖励)和负反馈(惩罚)中学习行为的过程。
3702 4
|
弹性计算
阿里云服务器公网IP和内网IP查询方法
阿里云服务器公网IP和内网IP查询方法
2012 0
|
前端开发 JavaScript
element组件的属性、事件和方法怎么使用
我们在使用element组件的时候,经常会使用到组件的属性、事件和方法,但对于第一次接触element组件的小白来说,由于没有代码示例,所以不知道怎么使用组件的属性、事件和方法是很常见的情况,所以本文将教会大家怎么去使用element组件的属性、事件和方法
728 0
element组件的属性、事件和方法怎么使用
|
存储 Linux Android开发