爬虫:针对http://en.wikipedia.org的SSL证书验证失败错误

284
我正在练习《Python网络数据采集》中的代码,但我一直遇到这个证书问题:

I'm practicing the code from 'Web Scraping with Python', and I keep having this certificate problem:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href'] 
                print(newPage) 
                pages.add(newPage) 
                getLinks(newPage)
getLinks("")

错误信息为:

  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1319, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1049)>

顺便说一下,我也在练习Scrapy,但总是遇到这个问题:找不到命令:scrapy(我尝试了各种在线解决方案,但都没有用……真的很沮丧)


1
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1049)> - Catherine4j
2
还有...请告诉我这个错误的原因,真的很想知道~~谢谢!! - Catherine4j
3
529个现有的SSL: CERTIFICATE_VERIFY_FAILED问题,请找出你的解决方案,然后将其关闭为重复。 - smci
我正要评论显而易见的事情:你是用https而不是http访问它了吗? - smci
1
在我的Mac OS Big Sur上,export SSL_CERT_DIR=/etc/ssl/certs 对我起了作用。 - TrigonaMinima
显示剩余2条评论
27个回答

946

从前我遇到了这个问题。如果你使用的是 macOS,前往 Macintosh HD > Applications > Python3.6 文件夹(或者你使用的任何版本的 Python)> 双击 "Install Certificates.command" 文件。


9
哦,我的Mac上没有这个Install Certificates.command文件...不知道为什么。 - Catherine4j
59
如果你使用Homebrew安装Python,则该文件不存在。解决方案在这里:https://dev59.com/H1cP5IYBdhLWcg3wRYBh#44649450 - Sampo
21
我可以为您翻译成中文:如何在Windows 10上实现?没有这样的文件存在。 - Aakash Basu
9
看看@Rambod的答案,非常快速、迅速地为我解决了问题。import ssl ssl._create_default_https_context = ssl._create_unverified_context 就这样,它起作用得很好。是的,可能存在安全问题,但对于一次性脚本和已知来源...谁会关心呢? - ihightower
3
"窗口10解决方案"是什么? - DIRTY DAVE
显示剩余13条评论

212

要使用未经验证的 SSL,您可以将以下代码添加到您的代码中:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

7
这很好,因为如果我只需要添加两行代码,为什么要进行系统更改呢。 - Nagri
27
这个答案应该强调一下,根据用户在爬取数据后使用数据的方式,这段代码可能会引入巨大的安全隐患。 - Michael Altfield
1
当您使用未经验证的证书时,存在风险。而且,只有在您知道数据源是什么并且不适合将其设置为默认值的生产模式下,这行代码才是有效的。问题是如何抓取一些未经验证的页面,至少在这种情况下,此代码不会造成太大的安全问题。 - Rambod
2
这在我的情况下起到了临时措施的作用。 - thewaywewere
2
import ssl ssl._create_default_https_context = ssl._create_unverified_context 谢谢 @Rambod - undefined

42

@MiguelSilva open 是特定于 MacOS 的。你是否使用 MacOS 运行 Google Colab?我不太清楚关于 Colab。 - Hillsie
在我的情况下,我正在运行Opera浏览器,在win10 intel I7 16Gb MacBook Pro上。 - Miguel Tomás
@MiguelSilva 上述命令位于操作系统级别,与浏览器无关。它与Python有关。此外,在这个行业中有一个恒定不变的事实,那就是变化。因此,过去有效的方法可能在现在已经不再适用。 - Hillsie

35

为了解决这个问题:

你只需要安装Python证书!这是在macOS上常见的问题。

打开这些文件:

Install Certificates.command
Update Shell Profile.command
只需运行这两个脚本,您就不会再遇到此问题了。希望这能帮到您!

13
我在我的应用程序目录中找不到Python文件夹。我正在使用Anaconda并创建了一个新的Python 3.6环境,因为我之前安装了Python 2.7(似乎也没有在我的应用程序目录中创建文件夹!)...在我的Mac上找不到Certificates.command文件。 - Kai
8
这些应该从哪里运行? - baxx
2
@Azim:在Ubuntu上怎么样? - Betty
5
为什么这个答案会被投赞成票呢?它没有明确指出这些命令应该在哪里运行,也缺乏关于那“两个脚本”的信息。 - oeter
我在AWS中使用Python lambda时遇到了这个问题,所以这并没有帮助,因为我无法访问它。 - sovemp
这些文件位于“应用程序> Python 3.x>”位置。只需双击它们即可运行脚本。https://dev59.com/M1UL5IYBdhLWcg3whIS-#57228672 - 提到了这一点。评论者应该提到它。 - Rahul Shenoy

27

对于初学者,您可以进入应用程序文件夹并展开Python 3.7文件夹。现在首先运行(或双击)Install Certificates.command,然后再运行Update Shell Profile.command。

输入图像描述


13
open /Applications/Python\ 3.7/Install\ Certificates.command

在终端中尝试此命令


对我来说,这只会产生以下错误:ERROR: Could not install packages due to an OSError: Cannot move the non-empty directory '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/certifi-2021.10.8.dist-info/': Lacking write permission to '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/certifi-2021.10.8.dist-info/'. - eddyoc
@eddyoc 请手动找到 Certificates.command 文件并运行它。希望这样能够解决问题。 - Muzammil-cyber

13

对于使用Anaconda的用户,您需要安装certifi软件包,详情请参见:

https://anaconda.org/anaconda/certifi

要安装,请在终端中键入以下行:

conda install -c anaconda certifi

我也遇到了这个问题。无法创建环境。我刚刚安装了miniconda3(macOS),并且我看到certifi已经安装了('conda list')。 - Kai
可以工作,但需要在Jupyter笔记本中重新选择内核。 - vielfarbig
在Ubuntu 22中,我在Conda环境下成功运行了这个。 - log0

11
如果你在使用Mac电脑,你可以直接在Spotlight中搜索“Install Certificates.command”,然后按回车键。

8

以下两步对我有用: - 前往 Macintosh HD > 应用程序 > Python3.7 文件夹 - 单击 "Install Certificates.command"


它在 Python 3.10 上仍然完美运行。 - Krishnadas PC

7

我找到了这个解决方案,它正在良好运行:

cd /Applications/Python\ 3.7/
./Install\ Certificates.command

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接