"SSL: certificate_verify_failed" python?

Итак, я начал изучать Python недавно, используя видео "The New Boston's" на YouTube, все отлично, пока я не добрался до его учебника по созданию простого веб-искателя. Хотя я понял это без проблем, когда я запускаю код, я получаю ошибки, все, казалось бы, основанные на "SSL: CERTIFICATE_VERIFY_FAILED". Я искал ответ с прошлой ночи, пытаясь понять, как это исправить. Кажется, никто в комментариях к видео или на своем веб-сайте не имеет такой же проблемы, как я, и даже используя код elses от его Я получаю те же результаты. Я отправлю код из того, что я получил с веб-сайта, так как он дал мне ту же ошибку, и тот, который я закодировал, сейчас путается.

import requests
from bs4 import BeautifulSoup

def trade_spider(max_pages):
    page = 1
    while page <= max_pages:
        url = "https://www.thenewboston.com/forum/category.php?id=15&orderby=recent&page=" + str(page) #this is page of popular posts
        source_code = requests.get(url)
        # just get the code, no headers or anything
        plain_text = source_code.text
        # BeautifulSoup objects can be sorted through easy
        for link in soup.findAll('a', {'class': 'index_singleListingTitles'}): #all links, which contains "" class='index_singleListingTitles' "" in it.
            href = "https://www.thenewboston.com/" + link.get('href')
            title = link.string # just the text, not the HTML
            print(href)
            print(title)
            # get_single_item_data(href)
    page += 1
trade_spider(1)

Полная ошибка: ssl.SSLError: проверка сертификата SSL: CERTIFICATE_VERIFY_FAILED] (_ssl.c: 645)

Я извиняюсь, если это глупый вопрос, я все еще новичок в программировании, но я серьезно не могу понять это, я думал просто пропустить этот урок, но это беспокоит меня, что я не могу это исправить, спасибо!

Ответы

Ответ 1

Проблема заключается не в вашем коде, а на веб-сайте, к которому вы пытаетесь получить доступ. Рассматривая анализ SSLLabs, вы заметите:

Эта цепочка сертификатов сервера является неполной. Ранг закрыт до B.

Это означает, что конфигурация сервера неверна и что не только python, но и несколько других будут иметь проблемы с этим сайтом. Некоторые настольные браузеры работают над этой проблемой конфигурации, пытаясь загрузить отсутствующие сертификаты из Интернета или заполнить кэшированные сертификаты. Но другие браузеры или приложения тоже не сработают, подобно python.

Чтобы обойти разбитую конфигурацию сервера, вы можете явно извлечь отсутствующие сертификаты и добавить их в хранилище доверия. Или вы можете предоставить сертификат как доверие внутри аргумента проверки. Из документация:

Вы можете передать путь к файлу или каталогу CA_BUNDLE с помощью сертификаты доверенных ЦС:

>>> requests.get('https://github.com', verify='/path/to/certfile') 

Этот список доверенных ЦС также может быть указан через REQUESTS_CA_BUNDLE.

Ответ 2

Вероятно, вам не хватает сертификатов акций в вашей системе. Например. если вы работаете на Ubuntu, убедитесь, что пакет ca-certificates установлен.

Ответ 3

Вы можете указать запросы не проверять сертификат SSL:

>>> url = "https://www.thenewboston.com/forum/category.php?id=15&orderby=recent&page=1"
>>> response = requests.get(url, verify=False)
>>> response.status_code
200

Подробнее в requests doc

Ответ 4

Я отправляю это как ответ, потому что до сих пор я пропустил вашу проблему, но в вашем коде все еще есть проблемы (которые при исправлении я могу обновить).

Короче говоря: вы можете использовать старую версию запросов или сертификат ssl должен быть недействительным. Там больше информации в этом вопросе SO: Запросы на Python " проверка сертификата не удалось &

Я обновил код в своем собственном файле bsoup.py:

#!/usr/bin/env python3

import requests
from bs4 import BeautifulSoup

def trade_spider(max_pages):
    page = 1
    while page <= max_pages:
        url = "https://www.thenewboston.com/forum/category.php?id=15&orderby=recent&page=" + str(page) #this is page of popular posts
        source_code = requests.get(url, timeout=5, verify=False)
        # just get the code, no headers or anything
        plain_text = source_code.text
        # BeautifulSoup objects can be sorted through easy
        for link in BeautifulSoup.findAll('a', {'class': 'index_singleListingTitles'}): #all links, which contains "" class='index_singleListingTitles' "" in it.
            href = "https://www.thenewboston.com/" + link.get('href')
            title = link.string # just the text, not the HTML
            print(href)
            print(title)
            # get_single_item_data(href)

        page += 1

if __name__ == "__main__":
    trade_spider(1)

Когда я запускаю script, он дает мне эту ошибку:

https://www.thenewboston.com/forum/category.php?id=15&orderby=recent&page=1
Traceback (most recent call last):
  File "./bsoup.py", line 26, in <module>
    trade_spider(1)
  File "./bsoup.py", line 16, in trade_spider
    for link in BeautifulSoup.findAll('a', {'class': 'index_singleListingTitles'}): #all links, which contains "" class='index_singleListingTitles' "" in it.
  File "/usr/local/lib/python3.4/dist-packages/bs4/element.py", line 1256, in find_all
    generator = self.descendants
AttributeError: 'str' object has no attribute 'descendants'

Там проблема с вашим методом findAll. Я использовал оба python3 и python2, где python2 сообщает об этом:

TypeError: unbound method find_all() must be called with BeautifulSoup instance as first argument (got str instance instead)

Итак, похоже, что вам нужно будет исправить этот метод, прежде чем продолжить.