由于Python中的请求不安全URL而捕获SSLError?

dmi*_*iys 1 python error-handling ssl python-requests

我有一个包含几千个 URL 的列表,并注意到其中一个在传递SSLErrorrequests.get(). 下面是我尝试使用此类似问题中建议的解决方案以及使用“try & except”块捕获错误的失败尝试来解决此问题ssl.SSLError

url = 'https://archyworldys.com/lidl-recalls-puff-pastry/'

session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.get(url,allow_redirects=False,verify=True)
except ssl.SSLError:
    pass
Run Code Online (Sandbox Code Playgroud)

最后返回的错误是:

SSLError: HTTPSConnectionPool(host='archyworldys.com', port=443): Max retries exceeded with url: /lidl-recalls-puff-pastry/ (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),))
Run Code Online (Sandbox Code Playgroud)

当我在 Chrome 中打开该 URL 时,收到阻止该网页的“不安全”/“隐私错误”。但是,如果我尝试使用 HTTP 而不是 HTTPS 的 URL(例如“ http://archyworldys.com/lidl-recalls-puff-pastry/ ”),它在我的浏览器中工作得很好。根据这个问题,设置verify可以False解决问题,但我更喜欢找到更安全的解决方法。

虽然我知道一个简单的解决方案是从我的数据中删除该 URL,但我正在尝试找到一种解决方案,让我可以for loop通过简单地跳过这个错误的 URL 并继续下一个来继续(例如,如果在 a 中)。

Ste*_*ich 5

运行您的代码时出现的错误是:

requests.exceptions.SSLError:
[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:645)

基于此,需要 catchrequests.exceptions.SSLError而不是ssl.SSLError,即:

try:
    response = session.get(url,allow_redirects=False,verify=True)
except requests.exceptions.SSLError:
    pass
Run Code Online (Sandbox Code Playgroud)

虽然您收到的错误看起来有所不同,但这可能是由于您显示的代码与您正在运行的代码不完全一致。无论如何,请查看您收到的确切错误消息,并从中找出要捕获的异常。您还可以尝试捕获像这样的更一般的异常,并通过这样做获得您需要捕获的确切异常类:

try:
    response = session.get(url,allow_redirects=False,verify=True)
except Exception as x:
    print(type(x),x)
    pass
Run Code Online (Sandbox Code Playgroud)