使用urllib请求网站时遭遇SSL: CERTIFICATE_VERIFY_FAILED错误求助
解决urllib访问HTTPS网站的证书验证问题
嘿,我来帮你搞定这个证书验证的麻烦!你的代码逻辑本身没问题,问题出在urllib默认会严格验证SSL证书——当你的环境里缺少对应的根证书,或者网络环境(比如代理)干扰了证书验证流程时,就会触发这个错误。下面给你几个可行的解决方案:
方案1:临时跳过证书验证(仅调试用)
如果你只是临时调试,不想纠结证书细节,可以创建一个不验证证书的SSL上下文。注意:这个方法绝对不要用在生产环境,会让你的请求暴露在中间人攻击的风险下。
修改后的代码如下:
import bs4 as bs import urllib.request import ssl # 创建跳过证书验证的上下文 ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE sauce = urllib.request.urlopen('https://stackoverflow.com/', context=ctx).read() soup = bs.BeautifulSoup(sauce, 'lxml') for s in soup.find_all('a'): print(s.string)
方案2:修复系统根证书(推荐生产环境)
如果是因为系统缺少必要的根证书导致验证失败,你可以安装系统的根证书包:
- 在Ubuntu/Debian系统:
sudo apt-get update && sudo apt-get install ca-certificates - 在Windows/macOS:直接更新系统到最新版本,系统会自动同步根证书;或者手动导入缺失的目标网站根证书。
修复后,你的原始代码就能正常运行了。
方案3:改用requests库(更简洁省心)
urllib属于底层库,处理证书问题不够友好。推荐你使用requests库,它默认会自动处理证书验证,代码更简洁易读:
首先安装requests(如果没装的话):
pip install requests
然后修改代码:
import bs4 as bs import requests response = requests.get('https://stackoverflow.com/') soup = bs.BeautifulSoup(response.text, 'lxml') for s in soup.find_all('a'): print(s.string)
这个方法几乎不会遇到证书问题,除非你访问的是使用自签名证书的私有网站,那时只需要额外加verify=False参数(同样注意生产环境风险)。
内容的提问来源于stack exchange,提问作者Jana Ruhrländer
相关产品推荐
相关产品推荐

