it-swarm.com.ru

Ошибка "SSL: certificate_verify_failed" при очистке https://www.thenewboston.com/

Так что я недавно начал изучать Python, используя видеоролики «The New Boston» на youtube, все шло отлично, пока я не попал в его урок по созданию простого веб-сканера. Хотя я понял это без проблем, когда я запускаю код, я получаю ошибки, которые кажутся основанными на «SSL: CERTIFICATE_VERIFY_FAILED». Я искал ответ с прошлой ночи, пытаясь выяснить, как это исправить. Похоже, что в комментариях к видео или на его веб-сайте больше ни у кого не было такой же проблемы, как у меня, и даже кто-то использовал код из его эльса. На сайте я получаю такие же результаты. Я выложу код с того, который я получил с сайта, так как он дает мне ту же ошибку, а тот, который я кодировал, сейчас беспорядок.

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] certificate verify failed (_ssl.c:645)

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

19
Bill Jenkins

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

Цепочка сертификатов этого сервера неполная. Оценка ограничена до B.

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

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

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

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

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

11
Steffen Ullrich

Вы можете указать запросы не проверять сертификат 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 документе

12
mattexx

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

6
markhor

если вы хотите использовать установщик Python dmg, вам также нужно прочитать ReadMe в Python 3 и запустить команду bash, чтобы получить новые сертификаты.

Попробуйте запустить 

/Applications/Python\ 3.6/Install\ Certificates.command
1
amitnair92

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

Короче говоря, вы можете использовать старую версию запросов или сертификат 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 __== "__main__":
    trade_spider(1)

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

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)

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

1
NuclearPeon