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)

Catherine4j
quelle
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.

Jey Miranda
quelle
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
Rambod
quelle
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!

Azim
quelle
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
20

Dieser Terminalbefehl:

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

Hier zu finden: https://stackoverflow.com/a/57614113/6207266

Hat es für mich gelöst. Mit meiner Konfiguration

pip install --upgrade certifi

hatte keine Auswirkungen.

Hillsie
quelle
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

Hemant
quelle
5

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

Alexis Berson
quelle
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
Amy Mou
quelle
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

Patrick Suzuki
quelle
3

Ich konnte diese Lösung finden und funktioniert gut:

cd /Applications/Python\ 3.7/
./Install\ Certificates.command
Alexandre Crivellaro
quelle
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 ...

Catherine4j
quelle
2

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

VIC3KING
quelle
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

Nitin
quelle
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.

user3303164
quelle
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

Weston Greene
quelle
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

tedy58
quelle
-1

Installieren Sie den Befehl Certificates.command auf Ihrem Mac.

Kazi Amit Hasan
quelle
-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"
Saurabh
quelle