由于Python中的请求带来不安全的URL而导致SSLError?

时间:2018-02-22 03:17:22

标签: python ssl error-handling python-requests

我有一个包含几千个网址的列表,并注意到其中一个网址在传递到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并继续下一个。

1 个答案:

答案 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