我正在对网站列表进行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版本。
答案 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
。