如何获取链接重定向后的目标URL?解决requests库SSL证书验证失败报错问题
解决Requests库获取重定向URL时的SSL证书验证失败问题
嘿,我来帮你搞定这个SSL证书验证失败的问题!从你贴的报错信息来看,核心问题是certificate verify failed,也就是你的Python环境不信任目标网站的SSL证书,导致TLS握手失败。下面给你分析可能的原因和对应的解决办法:
可能的原因
- 目标网站的SSL证书是自签名的,或者证书链不完整,不在本地CA证书库的信任列表里
- 你本地环境的CA证书库过时了,无法识别目标网站的新证书
- 网络环境(比如代理、防火墙)拦截了SSL证书验证流程
解决办法
1. 临时快速解决(不推荐用于生产环境)
如果只是测试需求,可以直接关闭SSL证书验证,在requests.get里添加verify=False参数。不过这样会跳过证书检查,有安全风险,requests也会弹出警告,你可以同时禁用这个警告:
import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning # 禁用不安全请求的警告 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) url = "https://stlouisfed.org/fomcspeak/thomas-barkin/2019/04/apr-speech-a-practitioners-perspective-on-the-productivity-slowdown" def get_redirected_url(url: str) -> str: # 关闭SSL验证,同时允许自动跟随重定向(默认就是True,这里可以显式写出来) r = requests.get(url, verify=False, allow_redirects=True) return r.url print(get_redirected_url(url))
2. 生产环境推荐方案
方案A:更新本地CA证书库
因为你用的是Anaconda环境,直接更新负责管理CA证书的certifi包即可:
conda install certifi --update-deps
更新后,requests会使用最新的CA证书库,大概率能解决证书信任问题。
方案B:手动指定信任的CA证书
如果你知道目标网站的CA证书文件,可以下载后在请求时指定证书路径:
def get_redirected_url(url: str) -> str: # 替换成你的CA证书文件路径 r = requests.get(url, verify="/path/to/your/ca_certificate.pem") return r.url
额外优化:用HEAD请求更高效
其实获取重定向地址不需要下载整个页面内容,用requests.head方法就足够了——它只会获取响应头信息,不会下载响应体,节省带宽和时间:
def get_redirected_url(url: str) -> str: # 这里根据实际情况设置verify参数 r = requests.head(url, verify=False, allow_redirects=True) return r.url
内容的提问来源于stack exchange,提问作者Christian Adib
相关产品推荐
相关产品推荐

