Scraping: SSL: CERTIFICATE_VERIFY_FAILED-Fehler für http://en.wikipedia.org


120

Ich übe den Code aus 'Web Scraping with Python' und habe weiterhin das folgende Zertifikatsproblem:

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

Der Fehler ist:

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

Übrigens übte ich auch Scrapy, bekam aber immer wieder das Problem: Befehl nicht gefunden: Scrapy (Ich habe alle möglichen Lösungen online ausprobiert, aber keine funktioniert ... wirklich frustrierend)


1
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikatüberprüfung fehlgeschlagen: lokales Ausstellerzertifikat kann nicht abgerufen werden (_ssl.c: 1049)>
Catherine4j

1
und ... bitte sag mir den Grund für diesen Fehler, will es wirklich wissen ~~ danke !!
Catherine4j

1
Es gibt 529 Fragen zu SSL: CERTIFICATE_VERIFY_FAILED . Bitte finden Sie heraus, welche Lösung Ihre Lösung ist, und schließen Sie diese als Duplikat.
smci


Und ich wollte gerade das Offensichtliche kommentieren: Haben Sie mit https anstelle von http darauf zugegriffen?
smci

Antworten:


417

Es war einmal, als ich über dieses Problem stolperte. Wenn Sie macOS verwenden, gehen Sie zu Macintosh HD> Anwendungen> Python3.6-Ordner (oder zu einer beliebigen Python-Version) und doppelklicken Sie auf die Datei "Install Certificates.command". : D.


5
Oh, ich habe diese Install Certificates.command-Datei nicht auf meinem Mac ... weiß nicht warum TAT
Catherine4j

24
Wenn Sie Python mit Homebrew installieren, ist diese Datei nicht vorhanden. Die Lösung ist hier: stackoverflow.com/a/44649450/412896
Sampo

4
Bitte markieren Sie dies als die Antwort, die es gelöst hat. Du hast mir so viel Zeit und Mühe gespart, als ich so feststeckte !!
Mark Puchala II

5
Wie kann ich das für Windows 10 machen? Eine solche Datei existiert nicht.
Aakash Basu

6
Legendäre Antwort
Nico

38

Um nicht verifizierte SSL zu verwenden, können Sie dies Ihrem Code hinzufügen:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

1
Das ist gut so, denn warum muss ich Systemänderungen vornehmen, wenn ich nur zwei Codezeilen hinzufügen muss.
Nagri

1
In dieser Antwort sollte wahrscheinlich erwähnt werden, dass dieser Code große Sicherheitsbedenken mit sich bringen kann, je nachdem, was der Benutzer mit den Daten nach dem
Scraping macht

Wenn Sie ein nicht verifiziertes Zertifikat verwenden, sind Sie sicher gefährdet. und diese Codezeile ist nur dann gut, wenn Sie wissen, was eine Datenquelle ist, und es ist nicht gut für den Produktionsmodus, sie als Standard einzurichten. Bei der Frage geht es darum, wie eine nicht verifizierte Seite gelöscht werden kann. Dieser Code macht zumindest in dieser Situation keine großen Sicherheitsbedenken.
Rambod

30

Um dies zu lösen:

Sie müssen lediglich Python-Zertifikate installieren! Ein häufiges Problem unter macOS.

Öffnen Sie diese Dateien:

Install Certificates.command
Update Shell Profile.command

Führen Sie einfach diese beiden Skripte aus und Sie werden dieses Problem nicht mehr haben.

Hoffe das hilft!


8
Ich sehe kein Python-Verzeichnis in meinem Anwendungsverzeichnis. Ich verwende Anaconda und habe eine neue Umgebung für Python 3.6 erstellt, da ich zuvor Python 2.7 installiert hatte (das anscheinend auch keinen Ordner in meinem Anwendungsverzeichnis erstellt hat!). .. Kann den Certificates.command auf meinem Mac nicht finden
Kai

2
Wo sollen diese herlaufen?
Baxx

1
@ Azim: Wie wäre es mit Ubuntu?
Betty


16

Für Anfänger können Sie im Ordner "Programme" den Ordner "Python 3.7" erweitern. Führen Sie nun zuerst den Befehl Install Certificates.command aus (oder doppelklicken Sie darauf) und aktualisieren Sie dann Shell Profile.command

Geben Sie hier die Bildbeschreibung ein


5

Für mich haben zwei Schritte funktioniert: - Gehen Sie zu Macintosh HD> Anwendungen> Python3.7-Ordner - klicken Sie auf "Certificates.command installieren".


5

Für alle, die Anaconda verwenden, würden Sie die installieren certifi Paket Weitere unter:

https://anaconda.org/anaconda/certifi

Geben Sie zur Installation diese Zeile in Ihr Terminal ein:

conda install -c anaconda certifi

Ich habe auch dieses Problem. Es kann keine Umgebung erstellt werden. Ich habe gerade miniconda3 (macOS) installiert und ich sehe certifi installiert ('conda list') ..
Kai

4

Schauen Sie sich diesen Beitrag an. Es scheint, dass für spätere Versionen von Python keine Zertifikate vorinstalliert sind, was diesen Fehler zu verursachen scheint. Sie sollten in der Lage sein, den folgenden Befehl auszuführen, um das certifi-Paket zu installieren:/Applications/Python\ 3.6/Install\ Certificates.command

Beitrag 1: urllib und "SSL: CERTIFICATE_VERIFY_FAILED" Fehler

Beitrag 2: Airbrake-Fehler: URL-Öffnungsfehler [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikatüberprüfung fehlgeschlagen: Lokales Ausstellerzertifikat kann nicht abgerufen werden


3

Ich konnte diese Lösung finden und funktioniert gut:

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

2

Ich habe das Problem leider nicht gelöst. Aber es ist mir gelungen, Codes zum Laufen zu bringen (fast alle meine Codes haben dieses Problem übrigens). Das Problem mit dem lokalen Ausstellerzertifikat tritt unter python3.7 auf. Daher habe ich wieder auf python2.7 QAQ umgestellt und alles, was geändert werden musste, einschließlich "from urllib2 import urlopen". statt "von urllib.request import urlopen" so traurig ...


2

Wenn Sie auf einem Mac arbeiten, können Sie einfach Install Certificates.commandim Scheinwerferlicht suchen und die Eingabetaste drücken.


0

Verwenden Sie die Anforderungsbibliothek. Probieren Sie diese Lösung aus oder fügen Sie sie einfach https://vor der URL hinzu:

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

Überprüfen Sie, ob dies für Sie funktioniert


0

Ich bin ein relativer Neuling im Vergleich zu allen Experten für Stapelüberlauf.

Ich habe 2 Versionen von Jupyter Notebook ausgeführt (eine durch eine neue Anaconda Navigator-Installation und eine durch ????). Ich denke, das liegt daran, dass Anaconda als lokale Installation auf meinem Mac installiert wurde (gemäß den Anweisungen von Anaconda).

Ich hatte bereits Python 3.7 installiert. Danach habe ich mein Terminal verwendet, um das Jupyter-Notebook zu öffnen, und ich denke, dass es eine andere Version global auf meinen Mac gebracht hat.

Ich bin mir jedoch nicht sicher, weil ich nur durch Ausprobieren lerne!

Ich habe den Terminalbefehl ausgeführt:

conda install -c anaconda certifi 

(wie oben angegeben, aber es hat nicht funktioniert.)

Mein Python 3.7 ist unter OS Catalina10.15.3 installiert in:

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

Das Zertifikat befindet sich bei:

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

Ich habe versucht, den Befehl "Install Certificate.command" zu finden, konnte ihn jedoch nicht durch Durchsuchen der Dateistrukturen finden ... nicht in Anwendungen ... nicht in den obigen Links.

Ich habe es schließlich installiert, indem ich es über Spotlight gefunden habe (wie oben vorgeschlagen). Und es doppelklickte automatisch und installierte ein anderes Zertifikat in demselben Ordner wie:

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

Keiner der oben genannten Punkte hat etwas für mich gelöst ... Ich habe immer noch den gleichen Fehler.

Also löste ich das Problem durch:

  1. mein jupyter notebook schließen.
  2. Anaconda Navigator öffnen.
  3. Öffnen des Jupyter-Notebooks über die Navigator-Benutzeroberfläche (anstelle des Terminals).
  4. Öffne mein Notizbuch und führe den Code aus.

Ich kann dir nicht sagen, warum das funktioniert hat. Aber es hat das Problem für mich gelöst.

Ich möchte nur jemandem den Ärger beim nächsten Mal ersparen. Wenn mir jemand sagen kann, warum es funktioniert hat, wäre das großartig.

Ich habe die anderen Terminalbefehle wegen der 2 Versionen des Jupyter-Notebooks, von denen ich wusste, dass sie ein Problem darstellen, nicht ausprobiert. Ich weiß nur nicht, wie ich das beheben soll.


0

Für mich war das Problem, dass ich mich REQUESTS_CA_BUNDLEin meinem einstellte.bash_profile

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

Sobald ich REQUESTS_CA_BUNDLEauf leer gesetzt (dh entfernt von .bash_profile), requestsarbeitete wieder.

export REQUESTS_CA_BUNDLE=""

Das Problem trat nur auf, wenn Python requestsüber eine CLI (Command Line Interface) ausgeführt wurde. Wenn ich rennerequests.get(URL, CERT) , löste es sich gut.

Mac OS Catalina (10.15.6). Pyenv vom 3.6.11. Fehlermeldung, die ich erhielt:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

Meine Antwort an anderer Stelle: https://stackoverflow.com/a/64151964/4420657


0

Ich benutze Debian 10 Buster und versuche eine Datei mit youtube-dl herunterzuladen und erhalte folgende Fehlermeldung: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk: Herunterladen der Webseite FEHLER: Webseite kann nicht heruntergeladen werden: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikatüberprüfung fehlgeschlagen: Lokales Ausstellerzertifikat kann nicht abgerufen werden (_ssl.c: 1056)> (verursacht durch URLError (SSLCertVerificationError (1, ') [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikatüberprüfung fehlgeschlagen: Lokales Ausstellerzertifikat kann nicht abgerufen werden (_ssl.c: 1056) ')))

Zertifikate mit python2 und python3.8 sind korrekt installiert, aber ich erhalte dauerhaft den gleichen Fehler. Schließlich (was nicht die beste Lösung ist, aber für mich funktioniert, war es, die Zertifikatprüfung zu eliminieren, wie sie in youtube-dl als Option angegeben ist) mit diesem Befehl sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk



-1

Das wird funktionieren. Setzen Sie die Umgebungsvariable PYTHONHTTPSVERIFY auf 0.

  • Durch Eingabe des Linux-Befehls:
export PYTHONHTTPSVERIFY = 0

ODER

  • Verwendung in Python-Code:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.