如果HTTPS失败,如何申请HTTP版本?

时间:2016-12-05 09:44:11

标签: python python-2.7 exception-handling python-requests

我正在对网站列表进行HEAD请求。其中一些使用HTTPS而其他只使用HTTP。

因此,我使用以下代码,期望在引发SSLError时,应该对HTTP版本发出请求。但是,看起来错误没有被发现。

for site in top:
    try:
        headers.append(requests.head('https://www.' + site.strip('\n')).headers)
    except ssl.SSLError:
        headers.append(requests.head('http://www.' + site.strip('\n')).headers)

例如,如果我使用Alexa Top 10,当脚本到达qq.com(前9位)时,HTTPS版本会引发requests.exceptions.SSLError: hostname 'www.qq.com' doesn't match either of 'a248.e.akamai.net', '*.akamaized.net', '*.akamaihd-staging.net', '*.akamaihd.net', '*.akamaized-staging.net'

我的预期用例是,如果出现此类错误,则应该请求http://www.qq.com

PS:我不想使用verify=False,如果HTTPS引发错误,我想要请求HTTP版本。

2 个答案:

答案 0 :(得分:2)

您正在捕捉错误的异常。从代码中不清楚ssl.SSLError是什么,但它几乎肯定与requests.exceptions.SSLError不一样。

尝试:

import requests

for site in top:
try:
    headers.append(requests.head('https://www.' + site.strip('\n')).headers)
except requests.exceptions.SSLError:
    headers.append(requests.head('http://www.' + site.strip('\n')).headers)

答案 1 :(得分:2)

  

然而,看起来错误并未被发现。

这是对的。这是因为你的代码没有抓住它!

except ssl.SSLError:

无法捕捉requests投掷的内容 - 很可能是requests.exceptions.SSLError