解决MacOS: certificate verify failed: unable to get local issuer certificate的问题


最近将工作的操作系统从Ubuntu切换到了MacOS。在运行爬虫脚本时,如果抓取HTTP的页面,则没有报错,但是当遇到HTTPS页面时,就出现了这么一个报错:

certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

出现这个问题的原因是给这个网站的签发证书的CA证书没有在操作系统的root证书列表里。这里有2个可能:

  1. 证书是自签名证书(类似于之前的12306)
  2. CA是一个新的CA,操作系统里没有更新对应的CA证书

对于这个问题可以有2个解决办法:

  1. 在脚本中不校验服务端证书有效性;
  2. 更新操作系统的CA证书列表;

对应的操作如下:

添加不校验证书代码

在脚本的最开头位置增加如下代码:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

这样就可以不校验https证书的有效性了。适合抓取那些自签名HTTPS证书的网站。

更新操作系统的CA证书列表

在MacOS中,有一个很简单的办法来更新证书,步骤如下:

  1. 切换到Python目录,例如:

    cd /Applications/Python 3.8

  2. 执行 Install Certificates.command

  3. 待程序执行完毕,重启爬虫,问题解决。