抓取:SSL:http://en.wikipedia.org 的 CERTIFICATE_VERIFY_FAILED 错误 [重复]
- 2025-01-15 08:45:00
- admin 原创
- 94
问题描述:
我正在练习“使用 Python 进行 Web 抓取”中的代码,但一直遇到这个证书问题:
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:
有一次我被这个问题困扰。如果你使用的是 macOS,请转到 Macintosh HD > 应用程序 > Python3.6 文件夹(或你使用的任何版本的 Python)> 双击“Install Certifications.command”文件。:D
解决方案 2:
要使用未经验证的 SSL,您可以将其添加到您的代码中:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
解决方案 3:
此终端命令:
open /Applications/Python 3.7/Install Certificates.command
在此处找到:
https: //stackoverflow.com/a/57614113/6207266
帮我解决了。使用我的配置
pip install --upgrade certifi
没有影响。
解决方案 4:
解决此问题:
您需要做的就是安装 Python 证书!这是 macOS 上的常见问题。
打开这些文件:
Install Certificates.command
Update Shell Profile.command
只需运行这两个脚本,您就不会再遇到这个问题。
希望这有帮助!
解决方案 5:
对于新手用户,您可以进入“应用程序”文件夹并展开“Python 3.7”文件夹。现在首先运行(或双击)“安装证书”命令,然后运行“更新 Shell 配置文件”命令
解决方案 6:
这是唯一对我在 Windows PC 上有用的解决方案
pip install pip_system_certs
pip install python-certifi-win32
解决方案 7:
Install Certificates.command
如果您在 Mac 上运行,您只需在聚光灯下搜索并按回车键即可。
解决方案 8:
对于任何使用 anaconda 的人,你可以安装该certifi
软件包,更多信息请参见:
https://anaconda.org/anaconda/certifi
要安装,请在终端中输入以下行:
conda install -c anaconda certifi
解决方案 9:
open /Applications/Python 3.7/Install Certificates.command
在终端中尝试此命令
解决方案 10:
对我来说有两个步骤有用: - 进入 Macintosh HD > 应用程序 > Python3.7 文件夹 - 单击“安装证书.command”
解决方案 11:
我找到了这个解决方案并且运行良好:
cd /Applications/Python 3.7/
./Install Certificates.command
解决方案 12:
我遇到了同样的错误,并通过运行以下程序代码解决了该问题:
# 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()
解决方案 13:
看一下这篇文章,似乎对于更高版本的 Python,证书未预先安装,这似乎会导致此错误。您应该能够运行以下命令来安装 certifi 包:/Applications/Python 3.6/Install Certificates.command
帖子 1:urllib 和“SSL:CERTIFICATE_VERIFY_FAILED”错误
帖子 2:Airbrake 错误:urlopen 错误 [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书
解决方案 14:
遗憾的是,我没能解决问题。但设法让代码运行起来(顺便说一下,几乎我的所有代码都有这个问题)本地发行者证书问题发生在 python3.7 下,所以我改回 python2.7 QAQ,所有需要更改的内容包括“从 urllib2 导入 urlopen”而不是“从 urllib.request 导入 urlopen”,真伤心……
解决方案 15:
我遇到了一个问题,python 不知何故试图使用一个cert.pem
不存在的文件。可以通过运行以下命令来查看:
import ssl
paths = ssl.get_default_verify_paths()
指向openssl_cafile
的/etc/ssl/cert.pem
在该路径下不存在。
设置SSL_CERT_FILE
为确实存在的路径解决了问题:
export SSL_CERT_FILE=/etc/pki/tls/cert.pem
解决方案 16:
使用请求库。尝试此解决方案,或者直接https://
在 URL 前添加:
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("")
检查这是否适合你
解决方案 17:
与 Stack Overflow 上的所有专家相比,我还是个新手。
我正在运行 2 个版本的 jupyter notebook(一个通过全新安装的 Anaconda Navigator,另一个通过 ????)。我认为这是因为 Anaconda 是作为本地安装安装在我的 Mac 上的(根据 Anaconda 说明)。
我已经安装了 python 3.7。之后,我使用终端打开 jupyter notebook,我认为它将另一个版本全局放到了我的 Mac 上。
不过,我不确定,因为我只是通过反复试验来学习!
我执行了终端命令:
conda install -c anaconda certifi
(按照上面的指示,但没有效果。)
我的python 3.7安装在OS Catalina10.15.3上:
/Library/Python/3.7/site-packages 和
〜/库/Python/3.7/lib/python/站点包
证书位于:
〜/库/Python/3.7/lib/python/site-packages/certifi-2019.11.28.dist-info
我试图找到 Install Certification.command ...但通过查看文件结构找不到它...不在应用程序中...也不在上面的链接中。
我最终通过 Spotlight 找到它并安装了它(正如上面有人建议的那样)。它自动双击并在同一个文件夹中安装了另一个证书:
〜/库/Python/3.7/lib/python/站点包/
以上任何方法都没有为我解决任何问题...我仍然遇到相同的错误。
因此,我通过以下方式解决了这个问题:
关闭我的 jupyter 笔记本。
打开 Anaconda Navigator。
通过 Navigator GUI(而不是通过终端)打开 jupyter notebook。
打开我的笔记本并运行代码。
我无法告诉你为什么这个方法有效。但它帮我解决了问题。
我只是想下次省去别人的麻烦。如果有人能告诉我为什么它有效,那就太好了。
我没有尝试其他终端命令,因为我知道 2 个版本的 jupyter notebook 存在问题。我只是不知道如何解决这个问题。
解决方案 18:
这将起作用。将环境变量 PYTHONHTTPSVERIFY 设置为 0。
通过输入 linux 命令:
export PYTHONHTTPSVERIFY = 0
或者
在python代码中使用:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
解决方案 19:
对我来说,问题在于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=""
requests
仅当通过 CLI (命令行界面)执行 python 时才会出现此问题。如果我运行requests.get(URL, CERT)
它,它就会正常解决。
Mac OS Catalina (10.15.6)。Pyenv 3.6.11。我收到的错误消息:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)
我在其他地方的回答:https://stackoverflow.com/a/64151964/4420657
解决方案 20:
我正在使用 Debian 10 buster 并尝试使用 youtube-dl 下载文件并出现此错误:sudo youtube-dl -k https://youtu.be/uscis0CnDjk
[youtube] uscis0CnDjk:下载网页错误:无法下载网页:<urlopen 错误 [SSL:CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)>(由 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
解决方案 21:
我在 Ubuntu 20.04 系统上看到了这个问题,并且没有任何“真正的修复”(比如这个)有帮助。
虽然 Firefox 可以正常打开该网站,但 GNOME Web(即 Epiphany)和 Python3 都不wget
接受该证书。经过一番搜索,我在 ServerFault 上看到了这个答案,其中列出了两个常见原因:
该证书实际上是由未知的 CA(例如内部 CA)签名的。
该证书是使用来自某个知名 CA 的中间 CA 证书签名的,并且远程服务器配置错误,因为它没有将该中间 CA 证书作为 CA 链的响应包含进去。
您可以使用Qualys SSL Labs网站检查网站的证书,如果有问题,请联系网站管理员进行修复。
如果您现在确实需要解决这个问题,我建议使用像Rambod这样的临时解决方案,仅限于您尝试访问的网站。
解决方案 22:
顺便说一句,如果您遇到相同的错误,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()
解决方案 23:
确保您的 websockets >=10.0
附加到:安装证书.command 更新 Shell 配置文件.command
pip3 安装 websockets==10.0
解决方案 24:
''''
导入 pymongo
从 pymongo.mongo_client 导入 MongoClient
CONNECTION_STRING = "mongodb+srv://用户名:密码@clustername.g3gasa2.mongodb.net /?retryWrites=true&w=majority&ssl_cert_reqs=CERT_NONE"
客户端 = pymongo.MongoClient(CONNECTION_STRING)
''''
在 Windows 中,我尝试将 mongodb 与 jupyter notebook 连接起来,最后通过在 CONNECTION_STRING 中添加&ssl_cert_reqs=CERT_NONE帮助了我。
这基本上禁用了 SSL 证书验证(不推荐用于生产)
解决方案 25:
我在 ubuntu 18.04 上的 python 3.7 环境中遇到了这个错误“_ssl.c:1091”。上述任何解决方案都对我不起作用。最后,当我使用 3.11.5 和相关库以及 conda 11.7 创建了一个新环境时,通过反复试验,解决了这个问题。
解决方案 26:
在 Mac-sonoma 操作系统中用 .zprofile 和 .zshenv 设置这些是有效的。
查看以下代码片段的结果后,此方法有效:
import ssl
paths = ssl.get_default_verify_paths()
print(paths)
DefaultVerifyPaths(cafile ='/库/应用程序支持/somefolder/somefolder/download/nscacert.pem',capath ='/库/应用程序支持/somefolder/somefolder/download/',openssl_cafile_env ='SSL_CERT_FILE',openssl_cafile ='/用户/chvr/anaconda3/ssl/cert.pem',openssl_capath_env ='SSL_CERT_DIR',openssl_capath ='/用户/chvr/anaconda3/ssl/certs')
export SSL_CERT_DIR="/Library/Application Support/folder/folder/download/"
export SSL_CERT_FILE="/Library/Application Support/folder/folder/download/nscacert.pem"
在终端中执行这些命令并确保 .zhrc / .zprofile 文件具有这 2 个路径条目。如果没有,请手动添加并重新启动 Python 终端。
解决方案 27:
我在 Windows 上使用 anaconda。一直出现同样的错误,直到我尝试了以下操作;
import urllib.request
link = 'http://docs.python.org'
with urllib.request.urlopen(link) as response:
htmlSource = response.read()
这是我从有关使用 urlopen 的 stackoverflow 线程中获得的:
Python urllib urlopen 不工作