Вишкрібання: SSL: помилка CERTIFICATE_VERIFY_FAILED для http://en.wikipedia.org


123

Я практикую код із "Веб-скребування за допомогою 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)>

До речі, я також практикував скрапінг, але постійно отримував проблему: команда не знайдена: скрапі (я пробував всілякі рішення в Інтернеті, але жодне не працює ... справді засмучує)


1
urllib.error.URLError: <помилка urlopen [SSL: CERTIFICATE_VERIFY_FAILED] не вдалося перевірити сертифікат: не вдалося отримати сертифікат місцевого емітента (_ssl.c: 1049)>
— Catherine4j,

1
і ... будь ласка, скажіть мені причину цієї помилки, дуже хочу знати ~~ дякую !!
— Catherine4j

1
Існує 529 існуючих запитань щодо SSL: CERTIFICATE_VERIFY_FAILED , будь ласка, з’ясуйте, яке саме ваше рішення, а потім закрийте це як дублікат.
— smci


І я збирався прокоментувати очевидне: ви отримували доступ до нього із https замість http?
— smci

Відповіді:


440

Колись я спотикався з цим питанням. Якщо ви використовуєте macOS, перейдіть до Macintosh HD> Програми> Папка Python3.6 (або будь-яку іншу версію python, яку ви використовуєте)> двічі клацніть на файлі "Встановити сертифікати.command". : D


5
о, у мене немає цього файлу встановлення сертифікатів.command на моєму mac ... не знаю, чому TAT
— Catherine4j

24
Якщо ви встановлюєте Python за допомогою Homebrew, цей файл не існує. Рішення тут: stackoverflow.com/a/44649450/412896
— Сампо

4
Хтось, будь ласка, позначте це як відповідь, яка це вирішила. Ви заощадили мені стільки часу та зусиль, коли я так застряг !!
— Марк Пухала II,

6
Як я можу це зробити для Windows 10? Такий файл не існує.
— Aakash Basu

6
Легендарна відповідь
— Ніко

43

щоб використовувати неперевірений ssl, ви можете додати це до свого коду:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

2
це добре, тому що навіщо мені вносити системні зміни, якщо мені потрібно додати лише два рядки коду.
— Nagri

1
у цій відповіді слід, мабуть, згадати, що цей код може викликати величезні загрози безпеці залежно від того, що користувач робить із даними після їх
— вишкрібання

напевно, коли ви використовуєте неперевірений сертифікат, ви ризикуєте. і цей рядок коду корисний лише в тому випадку, якщо ви знаєте, що таке джерело даних, і це не підходить для виробничого режиму, щоб встановити його за замовчуванням. питання полягає в тому, як скрепити якусь неперевірену сторінку, цей код, як мінімум, не викликає великих проблем з безпекою.
— Рамбод,

1
Це легко виправити. Дякую.
— Рой

30

Щоб вирішити це:

Все, що вам потрібно зробити, це встановити сертифікати Python! Поширена проблема у macOS.

Відкрийте ці файли:

Install Certificates.command
Update Shell Profile.command

Просто запустіть ці два сценарії, і у вас більше не буде цієї проблеми.

Сподіваюся, це допомагає!


8
Я не бачу каталогу Python в моєму застосунку Dir. Я використовую Anaconda і створив нову env для python 3.6, оскільки раніше у мене був встановлений python 2.7 (який, мабуть, також не створив папку в моєму Dir Dir!). .. Не можу знайти команду Certificates.com на моєму mac
— Кай

3
звідки їх слід втікати?
— baxx

1
@Azim: як щодо Ubuntu?
— Бетті

21

Ця команда терміналу:

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

Знайдено тут: https://stackoverflow.com/a/57614113/6207266

Вирішив це для мене. За допомогою мого конфігурації

pip install --upgrade certifi

не мав впливу.


17

Для початківців користувачів ви можете перейти в папку Applications та розгорнути папку Python 3.7. Тепер спочатку запустіть (або двічі клацніть) команду Встановити сертифікати.com, а потім Оновіть Shell Profile.command

введіть тут опис зображення


5

У мене працювали два кроки: - перехід на Macintosh HD> Програми> Папка Python3.7 - натисніть "Встановити сертифікати.command"


5

Для всіх, хто використовує анаконду, ви повинні встановити certifiпакет, дивіться більше на:

https://anaconda.org/anaconda/certifi

Щоб встановити, введіть цей рядок у своєму терміналі:

conda install -c anaconda certifi

Я теж маю цю проблему. Не вдається створити середовище. Я щойно встановив miniconda3 (macOS) і бачу, що сертифікат встановлений ('conda list') ..
— Кай,

4

Погляньте на цю публікацію, схоже, що для пізніших версій Python сертифікати не встановлюються попередньо, що, здається, спричиняє цю помилку. Ви повинні мати можливість виконати таку команду для встановлення пакета certifi:/Applications/Python\ 3.6/Install\ Certificates.command

Повідомлення 1: Помилка urllib та "SSL: CERTIFICATE_VERIFY_FAILED"

Повідомлення 2: Помилка повітряного гальма: помилка urlopen [SSL: CERTIFICATE_VERIFY_FAILED] не вдалося перевірити сертифікат: не вдалося отримати сертифікат місцевого емітента



2

Я не вирішив проблему, на жаль. але мені вдалося змусити коди працювати (майже всі мої коди мають цю проблему до речі) проблема місцевого сертифіката видавця трапляється під python3.7, тому я повернувся до python2.7 QAQ і все, що потрібно було змінити, включаючи "з urllib2 import urlopen" замість "з urllib.request імпортувати urlopen" так сумно ...


2

Якщо ви працюєте на Mac, ви можете просто шукати Install Certificates.commandв центрі уваги та натискати Enter.


0

Використовувати бібліотеку запитів. Спробуйте це рішення або просто додайте 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("")

Перевірте, чи це працює для вас


0

Я відносний новачок у порівнянні з усіма експертами з Stack Overflow.

У мене запущено 2 версії ноутбука jupyter (одна через свіжу інсталяцію Anaconda Navigator і одна через ????). Я думаю, це тому, що Anaconda була встановлена ​​як локальна установка на моєму Mac (відповідно до інструкцій Anaconda).

У мене вже був встановлений python 3.7. Після цього я використовував свій термінал для відкриття ноутбука jupyter, і я думаю, що він поставив іншу версію глобально на мій Mac.

Однак я не впевнений, бо я просто вчусь шляхом спроб і помилок!

Я зробив команду терміналу:

conda install -c anaconda certifi 

(як зазначено вище, але це не спрацювало.)

Мій python 3.7 встановлений в ОС Catalina10.15.3 у:

  • /Library/Python/3.7/site-packages І
  • ~ / Library / Python / 3.7 / lib / python / site-пакети

Сертифікат знаходиться за адресою:

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

Я намагався знайти команду Install Certificate.com ... але не зміг знайти її, переглядаючи файлові структури ... не в Програмах ... не в посиланнях вище.

Нарешті я встановив його, знайшовши через Spotlight (як хтось запропонував вище). І це двічі клацнуло автоматично і встановило ІНШИЙ сертифікат в ту ж папку, що і:

  • ~ / Бібліотека / Python / 3.7 / lib / python / site-пакети /

Ніхто з перерахованого не вирішив для мене нічого ... Я все одно отримав ту саму помилку.

Отже, я вирішив проблему за допомогою:

  1. закриваючи мій блокнот.
  2. відкриття навігатора Anaconda.
  3. відкриття блокнота jupyter через графічний інтерфейс Navigator (замість терміналу).
  4. відкривши свій блокнот і запустивши код.

Не можу сказати, чому це спрацювало. Але це вирішило проблему для мене.

Я просто хочу врятувати когось клопоту наступного разу. Якщо хтось може сказати мені, чому це спрацювало, це було б приголомшливо.

Я не пробував інші команди терміналу через 2 версії ноутбука jupyter, які, як я знав, були проблемою. Я просто не знаю, як це виправити.


0

Для мене проблема полягала в тому, що я встановлював 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=""

Проблема виявляється лише під час виконання python requestsчерез CLI (інтерфейс командного рядка). Якби я запустив requests.get(URL, CERT)це вирішено просто чудово.

Mac OS Catalina (10.15.6). Пиєнв від 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


0

Я використовую Debian 10 buster і спробуйте завантажити файл за допомогою youtube-dl і отримати цю помилку: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk: Завантаження веб-сторінки ПОМИЛКА: Не вдається завантажити веб-сторінку: <помилка urlopen [SSL: CERTIFICATE_VERIFY_FAILED] не вдалося перевірити сертифікат: не вдалося отримати сертифікат місцевого емітента (_ssl.c: 1056)> (спричинено помилкою URLEr (SSLCertVerificationError (1, ', 1' [SSL: CERTIFICATE_VERIFY_FAILED] не вдалося перевірити сертифікат: не вдалося отримати сертифікат місцевого емітента (_ssl.c: 1056) ')))

Сертифікати з python2 та python3.8 встановлені правильно, але я постійно отримую ту саму помилку. нарешті (що не є найкращим рішенням, але для мене працює, щоб усунути перевірку сертифіката, оскільки це надано як опцію в youtube-dl) за допомогою цієї команди sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk



-1

Це спрацює. Встановіть змінну середовища PYTHONHTTPSVERIFY на 0.

  • Набравши команду linux:
export PYTHONHTTPSVERIFY = 0

АБО

  • Використання в коді python:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.