抓取:SSL: CERTIFICATE_VERIFY_FAILED错误http://en.wikipedia.org

我正在练习“使用Python进行网络抓取”的代码,我一直有这个证书问题:

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(我尝试了各种在线解决方案,但没有一个工作…真的令人沮丧)

324226 次浏览
很遗憾,我没能解决这个问题。 但设法使代码工作(顺便说一句,几乎所有我的代码都有这个问题) 本地颁发者证书问题发生在python3.7下 所以我改回python2.7 QAQ 所有这些都需要改变,包括“from urllib2 import urlopen”而不是“from urllib”。请求导入urlopen" 如此悲伤…< / p >

看看这篇文章,似乎对于Python的后期版本,证书没有预安装,这似乎导致了这个错误。您应该能够运行以下命令来安装证书包

帖子1:SSL: CERTIFICATE_VERIFY_FAILED"错误

帖子2:Airbrake error: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:无法获取本地颁发者证书

有一次,我被这个问题绊倒了。如果你使用macOS,进入Macintosh HD > Applications > Python3.6文件夹(或任何你使用的python版本)>双击“Install Certificates.command”文件。: D

要解决这个问题:

你所需要做的就是安装Python证书!macOS的一个常见问题。

打开以下文件:

Install Certificates.command
Update Shell Profile.command

简单地运行这两个脚本,你就不会再有这个问题了。

希望这能有所帮助!

有两步对我有效: 导入Macintosh HD > Applications > Python3.7文件夹 -点击“Install Certificates.command”

对于任何使用anaconda的人来说,你都可以安装certifi包,详见:

https://anaconda.org/anaconda/certifi

要安装,请在终端中键入这一行:

conda install -c anaconda certifi

使用请求库。 尝试这个解决方案,或者只是在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("")

检查一下这对你是否有效

对于新手用户,您可以进入Applications文件夹并展开Python 3.7文件夹。现在首先运行(或双击)安装证书。命令,然后更新Shell配置文件。命令

enter image description here

终端命令:

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

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

为我解决了。 用我的配置

pip install --upgrade certifi

没有影响。

如果你在Mac上运行,你可以在聚光灯下搜索Install Certificates.command并按enter。

我可以找到这个解决方案,工作得很好:

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

要使用未经验证的SSL,可以在代码中添加:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

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

我有两个版本的jupyter笔记本正在运行(一个是通过新的Anaconda Navigator安装,另一个是通过????)。我想这是因为Anaconda是在我的Mac上作为本地安装安装的(根据Anaconda的说明)。

我已经安装了python 3.7。在那之后,我用我的终端打开了jupyter笔记本电脑,我认为它在我的Mac上安装了另一个全球版本。

然而,我不确定,因为我只是在不断地尝试和错误中学习!

我执行了终端命令:

conda install -c anaconda certifi

(如上所述,但它没有工作。)

我的python 3.7安装在OS Catalina10.15.3:

  • /图书馆/ Python / 3.7 /网站
  • ~ /图书馆/ Python / 3.7 / lib / Python /网站

证书地址:

  • ~ /图书馆/ Python / 3.7 / lib / Python /网站/ certifi-2019.11.28.dist-info

我试图找到安装证书命令…但通过查看文件结构无法找到它…不在应用程序中…不在上面的链接中。

我最终通过Spotlight找到了它(就像上面有人建议的那样)。它会自动双击并在相同的文件夹中安装另一个证书:

  • ~ /图书馆/ Python / 3.7 / lib / Python /网站/

以上都没有解决我的任何问题……我还是得到了同样的错误。

所以,我解决了这个问题:

  1. 合上我的jupyter笔记本。
  2. 打开水蟒航海家。
  3. 打开jupyter笔记本通过导航GUI(而不是 通过终端)。李< / >
  4. 打开我的笔记本,运行代码。

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

我只是想下次给别人省点麻烦。如果有人能告诉我为什么它有效,那就太好了。

我没有尝试其他终端命令,因为我知道两个版本的jupyter笔记本是一个问题。我只是不知道该怎么弥补。

这是可行的。将环境变量pythonhttpverify设置为0。

  • 输入linux命令:
export PYTHONHTTPSVERIFY = 0

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

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

/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

我正在使用Debian 10 buster,并尝试用youtube-dl下载一个文件,并得到这个错误: sudo youtube-dl -k https://youtu.be/uscis0CnDjk < / p >

[youtube] uscis0CnDjk:下载网页 ERROR: Unable to download page: <urlopen ERROR [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Unable to get local issuer certificate (_ssl.c:1056)>(由URLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable get local issuer certificate (_ssl.c:1056)')))

. ssl_verificationerror (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable get local issuer certificate (_ssl.c:1056)')引起

正确安装了python2和python3.8的证书,但我仍然收到相同的错误。 最后(这不是最好的解决方案,但对我来说是消除证书检查,因为它是youtube-dl中的一个选项)使用这个命令 sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk < / p >

我也有同样的错误,并通过运行下面的程序代码解决了这个问题:

# 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()

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

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

  • 该证书实际上是由一个未知CA(例如内部CA)签署的。
  • 证书是用来自一个知名CA的中间CA证书签名的,远程服务器配置错误,因为它没有将该中间CA证书作为其响应的CA链。

你可以使用Qualys SSL实验室网站来检查该网站的证书,如果有问题,请联系该网站的管理员进行修复。

如果你真的需要解决现在这个问题,我推荐一个临时的解决方案,比如Rambod的,限制在你试图访问的站点上。

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

在终端试试这个命令

我在窗户上使用anaconda。得到相同的错误,直到我尝试以下;

import urllib.request
link = 'http://docs.python.org'
with urllib.request.urlopen(link) as response:
htmlSource = response.read()

这是我从stackoverflow线程中使用urlopen得到的:

Python urllib urlopen not working

顺便说一下,如果你使用aiohttp得到同样的错误,只需将verify_ssl=False参数放入你的TCPConnector:

import aiohttp
...


async with aiohttp.ClientSession(
connector=aiohttp.TCPConnector(verify_ssl=False)
) as session:
async with session.get(url) as response:
body = await response.text()

确保你的websockets是>=10.0

< p >附加: 安装Certificates.command Update Shell Profile.command

. exe

Pip3安装websockets==10.0