Вишкрібання: 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.