Python网页爬取遇SSLError:证书验证失败如何解决?
问题现象
执行requests.get(url)爬取网页时触发以下SSLError:
SSLError: HTTPSConnectionPool(host='subslikescript.com', port=443): Max retries exceeded with url: /movie/Titanic-120338 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)')))
添加verify=False关闭证书验证后,请求能正常完成,但会弹出安全警告:
from bs4 import BeautifulSoup import requests url='https://subslikescript.com/movie/Titanic-120338' result = requests.get(url, verify=False) # 关闭证书验证
警告内容:
InsecureRequestWarning: Unverified HTTPS request is being made to host 'subslikescript.com'. Adding certificate verification is strongly advised
已尝试执行python -m pip install certifi更新证书,但问题未解决。
原因解释
- HTTPS网站靠证书证明身份,你的电脑得有对应的「根证书」来确认网站证书合法。
- 这个错误要么是目标网站的证书不被主流根证书机构信任,要么是你的Python环境没正确加载系统或certifi提供的根证书,导致没法验证网站证书的合法性。
- 更新certifi没用,大概率是因为目标网站的证书不在certifi的信任列表里,或者Python没正确指向certifi的证书文件。
解决方法
方法1:手动指定信任证书(最安全)
如果能获取到目标网站的合法证书,下载后在请求里指定证书路径:
result = requests.get(url, verify="/path/to/your/certificate.pem")
提示:可以通过浏览器访问该网站,导出证书并保存为.pem格式文件
方法2:禁用安全警告(练习场景适用)
如果只是练习爬取,不想看到警告提示,可以在代码里关闭该警告:
from bs4 import BeautifulSoup import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning # 禁用不安全请求警告 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) url='https://subslikescript.com/movie/Titanic-120338' result = requests.get(url, verify=False)
方法3:检查Python证书配置
如果是Python环境未正确加载certifi证书,可手动指定certifi的证书路径:
import certifi import requests url='https://subslikescript.com/movie/Titanic-120338' result = requests.get(url, verify=certifi.where())
如果此方法仍无效,说明目标网站证书本身不被信任,只能选用方法2。
内容的提问来源于stack exchange,提问作者zachi

