VSCode运行Python爬虫SSL错误本质是Python解释器证书验证失败,主因是解释器路径错误、macOS证书过期、代理注入自签名CA或环境变量未继承;临时方案为代码中显式设verify=False并禁警告,长期应更新certifi、导出内网证书或校准系统时间。

VSCode 运行 Python 爬虫时出现 SSL 证书错误,本质不是 VSCode 的错,而是你当前 Python 解释器环境在发起 HTTPS 请求(比如 requests.get())时,底层 ssl 模块验证服务器证书失败了。常见报错是 SSLCertVerificationError 或 HTTPSConnectionPool 带 CERTIFICATE_VERIFY_FAILED。它和你在终端里直接运行脚本报的错完全一致——VSCode 只是把那个环境“搬进来”调试而已。
为什么 VSCode 里跑就报错,终端里不报?
根本原因是解释器路径没选对,或环境依赖不一致:
- 你在终端激活的是
.venv/bin/python,但 VSCode 里选的是系统 Python(如/usr/bin/python3),后者没装证书包或根证书路径不对 - macOS 上 Python 安装包自带的证书库可能过期,而通过
brew install python装的版本默认用系统钥匙串,行为不一致 - 某些代理工具(如 Clash、Charles)注入了自签名 CA,但 VSCode 启动时没继承终端的环境变量(如
SSL_CERT_FILE) - VSCode 以非交互方式启动 Python 进程,跳过了 shell profile 里设置的证书信任逻辑
launch.json 里加 "env": {"PYTHONHTTPSVERIFY": "0"} 有用吗?
基本没用。这个环境变量只影响 Python 2.7.9+ 的 urllib 默认行为,对 requests、httpx 或底层 ssl 模块无效。真正起作用的是 requests 库自己的 verify 参数,或系统级证书配置。别在 launch.json 里堆这种“看起来像解决”的字段,徒增干扰。
最稳妥的临时绕过方案:代码里显式关验证
仅限开发调试,且必须加注释说明用途。不要全局禁用,只针对明确知道风险可控的请求:
立即学习“Python免费学习笔记(深入)”;
- requests 场景:
requests.get(url, verify=False),同时加两行抑制警告:import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - httpx 场景:
httpx.Client(verify=False)或单次请求传verify=False - urlopen 场景:构造
ssl.SSLContext()并设check_hostname = False、verify_mode = ssl.CERT_NONE,再传给urlopen - 绝对不要在
requests.adapters.HTTPAdapter里全局 mount 一个 verify=False 的 session —— 容易漏掉其他正常请求
长期方案:让证书验证真正“成功”,而不是绕过
真正省心的做法是补全信任链,而不是关验证:
- 如果是内网自签名服务(如
https://192.168.1.100:8443),用浏览器导出其证书为my-ca.pem,然后代码里写requests.get(url, verify="/path/to/my-ca.pem") - 如果报错提示
unable to get local issuer certificate,大概率是系统根证书缺失,macOS 可运行pip install --upgrade certifi,Linux 可更新ca-certificates包 - 检查本地时间是否准确——证书有效期校验失败,90% 是因为系统时间快了或慢了超过 5 分钟
- VSCode 启动时若走桌面快捷方式,可能没加载 shell 配置;改用终端执行
code .启动,能继承当前 shell 的CERT_PATH或SSL_CERT_FILE
最容易被忽略的一点:VSCode 的 Python 解释器选择界面里显示的路径,未必是你 debug 时实际用的那个。务必在断点停住后,进调试控制台输 import ssl; print(ssl.get_default_verify_paths()),看输出的 cafile 路径是否存在、是否可读——这才是证书验证真正的依据。


















