Pobieranie: SSL: błąd CERTIFICATE_VERIFY_FAILED dla http://en.wikipedia.org


123

Ćwiczę kod z „Web Scraping with Python” i ciągle mam ten problem z certyfikatem:

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

Błąd:

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

Przy okazji, ćwiczyłem również scrapy, ale wciąż pojawiał się problem: polecenie nie zostało znalezione: scrapy (próbowałem różnych rozwiązań online, ale żadne nie działa ... naprawdę frustrujące)


1
urllib.error.URLError: <urlopen błąd [SSL: CERTIFICATE_VERIFY_FAILED] weryfikacja certyfikatu nie powiodła się: nie można uzyskać certyfikatu lokalnego wystawcy (_ssl.c: 1049)>
Catherine4j

1
i ... proszę, powiedz mi przyczynę tego błędu, naprawdę chcę wiedzieć ~~ dzięki !!
Catherine4j

1
Istnieje 529 istniejących pytań dotyczących SSL: CERTIFICATE_VERIFY_FAILED , sprawdź, jakie jest Twoje rozwiązanie, a następnie zamknij je jako duplikat.
smci


Już miałem skomentować coś oczywistego: czy uzyskałeś do niego dostęp za pomocą https zamiast http?
smci

Odpowiedzi:


439

Kiedyś natknąłem się na ten problem. Jeśli używasz macOS, przejdź do folderu Macintosh HD> Aplikacje> Python3.6 (lub dowolnej wersji Pythona, której używasz)> kliknij dwukrotnie plik „Install Certificates.command”. :RE


5
och, nie mam tego pliku Install Certificates.command na moim komputerze Mac ... nie wiem, dlaczego TAT
Catherine4j

24
Jeśli zainstalujesz Pythona za pomocą Homebrew, ten plik nie istnieje. Rozwiązanie jest tutaj: stackoverflow.com/a/44649450/412896
Sampo

4
Niech ktoś oznaczy to jako odpowiedź, która go rozwiązała. Zaoszczędziłeś mi tyle czasu i wysiłku, kiedy tak utknąłem !!
Mark Puchala II

6
Jak mogę to zrobić na Windows 10? Nie ma takiego pliku.
Aakash Basu

6
Legendarna odpowiedź
Nico

43

aby użyć niezweryfikowanego ssl, możesz dodać to do swojego kodu:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

2
to jest dobre, ponieważ po co mam wprowadzać zmiany w systemie, skoro wszystko, co muszę dodać, to dwie linie kodu.
Nagri

1
Ta odpowiedź powinna chyba wspomnieć, że ten kod może wprowadzić ogromne obawy dotyczące bezpieczeństwa w zależności od tego, co użytkownik robi z danymi po to ociera ..
Michael Altfield

na pewno, gdy używasz niezweryfikowanego certyfikatu, jesteś zagrożony. a ta linia kodu jest dobra tylko wtedy, gdy wiesz, jakie jest źródło danych i nie jest dobre dla trybu produkcyjnego, aby ustawić je jako domyślne. Pytanie dotyczy tego, jak zeskrobać niezweryfikowaną stronę, przy czym ten kod nie spowoduje dużego zagrożenia bezpieczeństwa przynajmniej w tej sytuacji.
Rambod

1
To łatwa naprawa. Dzięki.
Roy

30

Aby rozwiązać ten problem:

Wszystko, co musisz zrobić, to zainstalować certyfikaty Pythona! Częsty problem w systemie macOS.

Otwórz te pliki:

Install Certificates.command
Update Shell Profile.command

Po prostu uruchom te dwa skrypty i nie będziesz już mieć tego problemu.

Mam nadzieję że to pomoże!


8
Nie widzę katalogu Python w moim katalogu aplikacji. Używam Anacondy i utworzyłem nowy plik env dla Pythona 3.6, ponieważ poprzednio miałem zainstalowany Python 2.7 (który najwyraźniej nie utworzył również folderu w moim katalogu aplikacji!). .. Nie mogę znaleźć pliku Certificates.command na moim komputerze Mac
Kai

3
skąd te mają być uruchamiane?
baxx,

1
@Azim: a co z Ubuntu?
Betty,


17

Dla początkujących użytkowników możesz przejść do folderu Aplikacje i rozwinąć folder Python 3.7. Teraz najpierw uruchom (lub kliknij dwukrotnie) Install Certificates.command, a następnie Update Shell Profile.command

wprowadź opis obrazu tutaj


5

Pomogły mi dwa kroki: - przechodzę na Macintosh HD> Aplikacje> folder Python3.7 - kliknij „Install Certificates.command”


5

Dla każdego, kto używa anacondy, zainstalowałbyś certifipakiet, zobacz więcej na:

https://anaconda.org/anaconda/certifi

Aby zainstalować, wpisz ten wiersz w swoim terminalu:

conda install -c anaconda certifi

Ja też mam ten problem. Nie mogę stworzyć środowiska. Właśnie zainstalowałem miniconda3 (macOS) i widzę, że zainstalowano certifi („lista conda”) ..
Kai

4

Spójrz na ten post, wygląda na to, że w późniejszych wersjach Pythona certyfikaty nie są wstępnie zainstalowane, co wydaje się powodować ten błąd. Powinieneś móc uruchomić następujące polecenie, aby zainstalować pakiet certifi:/Applications/Python\ 3.6/Install\ Certificates.command

Post 1: urllib i błąd „SSL: CERTIFICATE_VERIFY_FAILED”

Post 2: błąd hamulca pneumatycznego: błąd urlopen [SSL: CERTIFICATE_VERIFY_FAILED] weryfikacja certyfikatu nie powiodła się: nie można uzyskać certyfikatu lokalnego wydawcy



2

Niestety nie rozwiązałem problemu. ale udało mi się sprawić, że kody działają (prawie wszystkie moje kody mają ten problem btw) problem z certyfikatem lokalnego wydawcy występuje w python3.7, więc zmieniłem z powrotem na python2.7 QAQ i wszystko, co musiałem zmienić, w tym "from urllib2 import urlopen" zamiast "from urllib.request import urlopen" tak smutno ...


2

Jeśli korzystasz z komputera Mac, możesz po prostu wyszukać Install Certificates.commandw centrum uwagi i nacisnąć Enter.


0

Użyj biblioteki żądań. Wypróbuj to rozwiązanie lub po prostu dodaj https://przed adresem 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("")

Sprawdź, czy to działa dla Ciebie


0

Jestem względnie nowicjuszem w porównaniu ze wszystkimi ekspertami od Stack Overflow.

Mam uruchomione 2 wersje notebooka jupyter (jedną przez świeżą instalację Anaconda Navigatora i jedną przez ????). Myślę, że dzieje się tak, ponieważ Anaconda została zainstalowana jako instalacja lokalna na moim Macu (zgodnie z instrukcjami Anacondy).

Miałem już zainstalowany Python 3.7. Potem użyłem terminala do otwarcia notatnika jupyter i myślę, że umieściłem inną wersję na całym świecie na moim Macu.

Jednak nie jestem pewien, ponieważ uczę się tylko metodą prób i błędów!

Wykonałem polecenie terminala:

conda install -c anaconda certifi 

(jak wskazano powyżej, ale to nie zadziałało).

Mój Python 3.7 jest zainstalowany na systemie operacyjnym Catalina 10.15.3 w:

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

Certyfikat znajduje się pod adresem:

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

Próbowałem znaleźć Install Certificate.command ... ale nie mogłem go znaleźć, przeglądając struktury plików ... nie w Aplikacjach ... nie w linkach powyżej.

W końcu zainstalowałem go, znajdując go przez Spotlight (jak ktoś zasugerował powyżej). Dwukrotnie kliknął automatycznie i zainstalował INNY certyfikat w tym samym folderze co:

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

ŻADNE z powyższych nie rozwiązało niczego dla mnie ... nadal mam ten sam błąd.

Więc rozwiązałem problem poprzez:

  1. zamykam mój notatnik jupyter.
  2. otwieram Anaconda Navigator.
  3. otwieranie notatnika jupyter przez GUI Navigatora (zamiast przez Terminal).
  4. otwieram notes i uruchamiam kod.

Nie mogę ci powiedzieć, dlaczego to zadziałało. Ale to rozwiązało problem za mnie.

Chcę tylko zaoszczędzić komuś kłopotów następnym razem. Gdyby ktoś mógł mi powiedzieć, dlaczego to zadziałało, byłoby wspaniale.

Nie próbowałem innych poleceń terminala z powodu dwóch wersji notebooka jupyter, o których wiedziałem, że są problemem. Po prostu nie wiem, jak to naprawić.


0

Dla mnie problem polegał na tym, że ustawiałem REQUESTS_CA_BUNDLEw moim.bash_profile

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

Po ustawieniu REQUESTS_CA_BUNDLEna puste (tj. Usunięciu z .bash_profile), requestsdziałało ponownie.

export REQUESTS_CA_BUNDLE=""

Problem występował tylko podczas wykonywania języka Python requestsza pośrednictwem interfejsu wiersza poleceń (CLI). Jeśli uruchomiłem requests.get(URL, CERT), rozwiązało się dobrze.

Mac OS Catalina (10.15.6). Pyenv z 3.6.11. Komunikat o błędzie, który otrzymałem:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

Moja odpowiedź gdzie indziej: https://stackoverflow.com/a/64151964/4420657


0

Używam buster Debiana 10 i próbuję pobrać plik za pomocą youtube-dl i otrzymuję ten błąd: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk: Pobieranie strony internetowej BŁĄD: Nie można pobrać strony internetowej: <błąd urlopen [SSL: CERTIFICATE_VERIFY_FAILED] weryfikacja certyfikatu nie powiodła się: nie można pobrać certyfikatu lokalnego wydawcy (_ssl.c: 1056)> (spowodowane przez URLError (SSLCertVerificationError (1, ') [SSL: CERTIFICATE_VERIFY_FAILED] weryfikacja certyfikatu nie powiodła się: nie można uzyskać certyfikatu lokalnego wydawcy (_ssl.c: 1056) ')))

Certyfikaty z python2 i python3.8 są poprawnie zainstalowane, ale trwały otrzymuję ten sam błąd. na koniec (co nie jest najlepszym rozwiązaniem, ale działa jak dla mnie, było wyeliminowanie sprawdzania certyfikatu jak to jest podane jako opcja w youtube-dl) tym poleceniem sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk



-1

To zadziała. Ustaw zmienną środowiskową PYTHONHTTPSVERIFY na 0.

  • Wpisując polecenie linux:
export PYTHONHTTPSVERIFY = 0

LUB

  • Używanie w kodzie Pythona:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.