刮刮:SSL:http://en.wikipedia.org的CERTIFICATE_VERIFY_FAILED错误

时间:2018-05-08 14:32:10

标签: python web-scraping beautifulsoup scrapy ssl-certificate

我正在练习使用Python'进行Web Scraping的代码,并且我一直有这个证书问题:

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(我在网上尝试了各种解决方案,但都没有用......真的很令人沮丧)

21 个答案:

答案 0 :(得分:49)

从前,我偶然发现了这个问题。如果您使用的是macOS,请转至Macintosh HD>应用程序> Python3.6文件夹(或您使用的任何版本的python)>双击“ Install Certificates.command”文件。 :D

答案 1 :(得分:38)

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

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

答案 2 :(得分:7)

要解决此问题:

您需要做的就是安装Python证书! macOS上的常见问题。

打开这些文件:

Install Certificates.command
Update Shell Profile.command

只需运行这两个脚本,您将不再有此问题。

希望这会有所帮助!

答案 3 :(得分:6)

此终端命令:

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

在这里找到: https://stackoverflow.com/a/57614113/6207266

为我解决了。 使用我的配置

pip install --upgrade certifi

没有影响。

答案 4 :(得分:5)

对于新手用户,您可以进入Applications文件夹并展开Python 3.7文件夹。现在,首先运行(或双击)Install Certificates.command,然后运行Update Shell Profile.command

enter image description here

答案 5 :(得分:3)

我可以找到此解决方案,并且运行良好:

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

答案 6 :(得分:2)

看一下这篇文章,似乎对于更高版本的Python,未预安装证书,这似乎会导致此错误。您应该能够运行以下命令来安装certifi软件包:/Applications/Python\ 3.6/Install\ Certificates.command

帖子1:urllib and "SSL: CERTIFICATE_VERIFY_FAILED" Error

帖子2:Airbrake error: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

答案 7 :(得分:2)

如果您在Mac上运行,则只需在聚光灯下搜索Install Certificates.command并按Enter键即可。

答案 8 :(得分:1)

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

在终端试试这个命令

答案 9 :(得分:1)

将您的网址从"http://en.wikipedia.org"更改为"https://en.wikipedia.org"

答案 10 :(得分:1)

我遇到了同样的错误并通过运行下面的程序代码解决了问题:

# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module.  Uses the certificates provided by the certifi package:
#       https://pypi.python.org/pypi/certifi

import os
import os.path
import ssl
import stat
import subprocess
import sys

STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
             | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
             | stat.S_IROTH |                stat.S_IXOTH )


def main():
    openssl_dir, openssl_cafile = os.path.split(
        ssl.get_default_verify_paths().openssl_cafile)

    print(" -- pip install --upgrade certifi")
    subprocess.check_call([sys.executable,
        "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])

    import certifi

    # change working directory to the default SSL directory
    os.chdir(openssl_dir)
    relpath_to_certifi_cafile = os.path.relpath(certifi.where())
    print(" -- removing any existing file or link")
    try:
        os.remove(openssl_cafile)
    except FileNotFoundError:
        pass
    print(" -- creating symlink to certifi certificate bundle")
    os.symlink(relpath_to_certifi_cafile, openssl_cafile)
    print(" -- setting permissions")
    os.chmod(openssl_cafile, STAT_0o775)
    print(" -- update complete")

if __name__ == '__main__':
    main()

答案 11 :(得分:1)

对于使用anaconda的任何人,您都需要安装certifi软件包,请参见:

https://anaconda.org/anaconda/certifi

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

conda install -c anaconda certifi

答案 12 :(得分:1)

两个步骤对我有用: -进入Macintosh HD>应用程序> Python3.7文件夹 -点击“安装Certificates.command”

答案 13 :(得分:1)

可悲的是,我没有解决这个问题。 但设法使代码工作(几乎所有的代码都有这个问题btw) 本地颁发者证书问题发生在python3.7下 所以我改回了python2.7 QAQ 以及需要改变的所有内容,包括&#34;来自urllib2 import urlopen&#34;而不是&#34;来自urllib.request import urlopen&#34; 好难过......

答案 14 :(得分:0)

使用请求库。 尝试此解决方案,或仅在URL之前添加https://

import requests
from bs4 import BeautifulSoup
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = requests.get("http://en.wikipedia.org"+pageUrl, verify=False).text
    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("")

检查是否适合您

答案 15 :(得分:0)

与Stack Overflow的所有专家相比,我是一个相对新手。

我有2个版本的jupyter笔记本正在运行(一个通过全新的Anaconda Navigator安装,一个通过????)。我认为这是因为Anaconda是作为Mac上的本地安装安装的(按照Anaconda的说明)。

我已经安装了python 3.7。之后,我使用终端打开jupyter笔记本,我认为这会在Mac上全局发布另一个版本。

但是,我不确定,因为我只是通过反复试验来学习!

我执行了终端命令:

conda install -c anaconda certifi 

(如上所述),但没有用。

我的python 3.7安装在操作系统Catalina10.15.3中:

  • /Library/Python/3.7/site-packages AND
  • 〜/ Library / Python / 3.7 / lib / python / site-packages

证书位于:

  • 〜/ Library / Python / 3.7 / lib / python / site-packages / certifi-2019.11.28.dist-info

我试图找到Install Certificate.command ...,但是通过查看文件结构却找不到它...不在Applications中...不在上面的链接中。

我最终通过在Spotlight中找到它进行了安装(如上文所述)。它自动双击并在与以下文件夹相同的文件夹中安装了另一个证书:

  • 〜/ Library / Python / 3.7 / lib / python / site-packages /

以上都不为我解决任何问题...我仍然遇到相同的错误。

所以,我通过以下方法解决了这个问题:

  1. 关闭我的jupyter笔记本。
  2. 打开Anaconda Navigator。
  3. 通过Navigator GUI打开jupyter笔记本(而不是 通过终端)。
  4. 打开笔记本并运行代码。

我不能告诉你为什么这样做。但这为我解决了这个问题。

下一次我只想节省某人的麻烦。如果有人能告诉我它为什么起作用,那将是非常棒的。

我没有尝试其他终端命令,因为我知道有两个版本的jupyter notebook。我只是不知道该如何解决。

答案 16 :(得分:0)

对我来说,问题是我在REQUESTS_CA_BUNDLE中设置了.bash_profile

/Users/westonagreene/.bash_profile:
...
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem
...

一旦我将REQUESTS_CA_BUNDLE设置为空白(即从.bash_profile中删除),requests就会再次起作用。

export REQUESTS_CA_BUNDLE=""

该问题仅在通过CLI(命令行界面)执行python requests时出现。如果我运行requests.get(URL, CERT),就可以解决。

Mac OS Catalina(10.15.6)。 3.6.11的Pyenv。 我收到的错误消息:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

我在其他地方的答案:https://stackoverflow.com/a/64151964/4420657

答案 17 :(得分:0)

我正在使用Debian 10 buster,并尝试使用youtube-dl下载文件并出现以下错误: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk:正在下载网页 错误:无法下载网页:(由URLError(SSLCertVerificationError(1,'[[SSL:CERTIFICATE_VERIFY_FAILED]失败:无法获取本地发行者证书(_ssl.c:1056)')))

带有python2和python3.8的证书已正确安装,但我永久收到相同的错误。 最终(这不是最好的解决方案,但是对我有用的是取消证书检查,因为它是youtube-dl中的一个选项) sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk

答案 18 :(得分:0)

我在 Ubuntu 20.04 系统上看到了这个问题,但“真正的修复”(如 this one)都没有帮助。

虽然 Firefox 愿意打开该站点,但 GNOME Web(即 Epiphany)、Python3 或 wget 都不接受该证书。经过一番搜索,我发现 this answer on ServerFault 列出了两个常见的原因:

<块引用>
  • 该证书确实由未知 CA(例如内部 CA)签名。
  • 该证书使用来自知名 CA 之一的中间 CA 证书签名,并且远程服务器配置错误,因为它没有将该中间 CA 证书作为响应的 CA 链包含在内。

您可以使用 Qualys SSL Labs 网站检查网站的证书,如果有问题,请联系网站管理员进行修复。

如果您确实需要立即解决此问题,我建议您使用一个临时解决方案,例如 Rambod's,仅限于您尝试访问的网站。< /p>

答案 19 :(得分:-1)

在Mac上安装Certificates.command。

答案 20 :(得分:-1)

这将起作用。将环境变量PYTHONHTTPSVERIFY设置为0。

  • 通过键入linux命令:
export PYTHONHTTPSVERIFY = 0

OR

  • 使用python代码:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"