我有一个包含几千个网址的列表,并注意到其中一个网址在传递到SSLError
时投放为requests.get()
。以下是我尝试使用solution suggested in this similar question以及尝试使用"尝试&除外"阻止使用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
最后返回的错误是:
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')],)",),))
当我在Chrome中打开网址时,我得到了一个“不安全”#34; /"隐私错误"阻止网页。但是,如果我使用HTTP而不是HTTPS(例如' http://archyworldys.com/lidl-recalls-puff-pastry/')尝试使用此网址,则可以在我的浏览器中正常运行。根据{{3}},将verify
设置为False
可以解决问题,但我更愿意找到更安全的解决方法。
虽然我理解一个简单的解决方案是从我的数据中删除网址,但我试图找到让我继续进行的解决方案(例如,如果在for loop
中)只需跳过这个错误的URL并继续下一个。
答案 0 :(得分:3)
运行代码时出现的错误是:
requests.exceptions.SSLError:
[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败 (_ssl.c:645)
基于此,需要捕捉requests.exceptions.SSLError
而不是ssl.SSLError
,即:
try:
response = session.get(url,allow_redirects=False,verify=True)
except requests.exceptions.SSLError:
pass
虽然看起来你得到的错误是不同的,但这可能是因为你展示的代码并不完全是你正在运行的代码。无论如何,请查看您获得的确切错误消息,并从中找出准确捕获的异常。您也可以尝试捕获这样的更一般的异常,并通过执行此操作获取您需要捕获的确切Exception类:
try:
response = session.get(url,allow_redirects=False,verify=True)
except Exception as x:
print(type(x),x)
pass