在使用 requests
库发送 HTTP 请求时,如果服务器使用了 SSL/TLS 证书,而这些证书存在问题(例如过期、自签名、域名不匹配等),requests
默认会抛出 requests.exceptions.SSLError
异常。为了捕获和处理这些 SSL 错误,你可以使用 try-except
块来捕获 SSLError
异常,并相应地处理它。
下面是一个示例代码,展示了如何捕获并处理 SSL 错误:
python
import requests
from requests.exceptions import SSLError
url = 'https://example.com' # 替换为实际的 URL
try:
response = requests.get(url)
response.raise_for_status() # 如果响应状态码不是200,抛出HTTPError异常
print(response.text)
except SSLError as e:
print(f"SSL error occurred: {e}")
# 你可以在这里添加更多的错误处理逻辑,例如忽略 SSL 错误(不推荐用于生产环境)
# 如果你确实需要忽略 SSL 错误(例如,在测试环境中),可以使用以下代码:
# import ssl
# requests.get(url, verify=False) # 不验证 SSL 证书
# 注意:不验证 SSL 证书会使你的请求容易受到中间人攻击,因此仅建议在受信任的环境中使用
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
注意事项
-
不验证 SSL 证书:
- 使用
verify=False
参数可以使requests
不验证 SSL 证书,但这会使你的请求容易受到中间人攻击。因此,这种方法仅推荐在受信任的环境中使用,例如本地开发或测试环境。 - 例如:
response = requests.get(url, verify=False)
- 使用
-
自定义 SSL 证书:
- 如果你有特定的 SSL 证书需要验证,可以将证书文件路径传递给
verify
参数。 - 例如:
response = requests.get(url, verify='/path/to/certfile')
- 如果你有特定的 SSL 证书需要验证,可以将证书文件路径传递给
-
捕获其他请求异常:
- 除了
SSLError
,requests
还会抛出其他类型的异常,例如requests.exceptions.HTTPError
(表示 HTTP 错误,如 4xx 或 5xx 响应),requests.exceptions.ConnectionError
(表示网络问题),requests.exceptions.Timeout
(表示请求超时),等等。 - 在上面的示例中,我们使用
requests.exceptions.RequestException
捕获所有requests
库抛出的异常,这包括SSLError
和其他所有异常。
- 除了
通过捕获和处理 SSL 错误,你可以确保你的程序在面对证书问题时能够优雅地处理,而不是直接崩溃。