在Python中处理爬虫请求异常通常涉及以下几个步骤:
异常处理机制
使用`try-except`语句来捕获可能发生的异常。
可以捕获特定的异常类型,如`URLError`、`HTTPError`等,或者使用通用的`Exception`类来捕获所有异常。
异常类型捕获
针对可能出现的异常类型,使用不同的`except`子句进行处理。
例如,使用`urllib.error.URLError`捕获网络连接异常。
多异常捕获
如果预期可能出现多种异常,可以使用多个`except`语句分别捕获不同类型的异常。
异常信息打印
使用`traceback`模块打印异常的详细信息,以便于调试和定位问题。
错误重试与延迟机制
对于可恢复的异常,如网络异常,可以设置最大重试次数和重试间隔时间。
使用`time.sleep`函数或`random.uniform`生成随机延迟时间,避免过于频繁的请求。
异常监控与报警
监控爬虫运行状态和异常情况,及时发现问题。
可以使用日志记录库(如`logging`)记录异常信息。
针对特定异常的处理
对于`HTTPError`,可以检查服务器返回的状态码,如`403 Forbidden`表示服务器拒绝了请求。
对于`URLError`,可以检查异常的原因,如网络无连接或连接不到特定的服务器。
示例代码
import requests
from requests.exceptions import RequestException
import time
import random
def get_html(url):
try:
response = requests.get(url, timeout=10)
response.raise_for_status() Raises an HTTPError if the HTTP request returned an unsuccessful status code
return response.text
except RequestException as e:
print(f"请求异常: {e}")
time.sleep(random.uniform(1, 5)) 随机延迟1到5秒
return get_html(url) 递归重试请求
示例使用
url = "https://www.example.com"
html_content = get_html(url)
if html_content:
print(html_content)
else:
print("请求失败,请检查网络连接或服务器状态")
以上代码展示了如何使用`try-except`捕获请求异常,并在异常发生时进行重试。使用`random.uniform`来引入随机延迟,以避免被目标网站识别为爬虫并封禁。
请根据您的具体需求调整异常处理策略,并考虑加入更复杂的错误处理和重试逻辑来提高爬虫的健壮性