在 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")