web-dev-qa-db-fra.com

Erreur "SSL: certificate_verify_failed" lors de l'extraction de https://www.thenewboston.com/

J'ai donc commencé récemment à apprendre Python en utilisant les vidéos de "The New Boston" sur youtube. Tout allait bien jusqu'à ce que je parvienne à son tutoriel sur la création d'un robot d'exploration de Web. Bien que je l’aie compris sans problème, lorsque je lance le code, j’obtiens des erreurs apparemment toutes basées sur "SSL: CERTIFICATE_VERIFY_FAILED". Depuis la nuit dernière, je cherche une réponse pour essayer de trouver une solution. Il semble que personne dans les commentaires sur la vidéo ou sur son site Web ne rencontre le même problème que moi et utilise même le code de quelqu'un d'autre de son site web, je reçois les mêmes résultats. Je posterai le code de celui que j'ai reçu sur le site Web, car il me donne la même erreur et celui que j'ai codé est en désordre en ce moment.

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)

L'erreur complète est: ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

Je m'excuse si c'est une question idiote, je suis encore novice en programmation mais je ne peux sérieusement pas comprendre cela. Je pensais simplement sauter ce tutoriel, mais ça me gêne de ne pas pouvoir résoudre ce problème, merci!

19
Bill Jenkins

Le problème ne réside pas dans votre code, mais dans le site Web auquel vous essayez d'accéder. En regardant l'analyse de SSLLabs vous remarquerez:

La chaîne de certificats de ce serveur est incomplète. Grade plafonné à B.

Cela signifie que la configuration du serveur est incorrecte et que non seulement python, mais plusieurs autres auront des problèmes avec ce site. Certains navigateurs de bureau contournent ce problème de configuration en essayant de charger les certificats manquants sur Internet ou de les remplir avec des certificats en cache. Mais d'autres navigateurs ou applications échoueront aussi, comme Python.

Pour contourner la configuration de serveur endommagée, vous pouvez extraire explicitement les certificats manquants et les ajouter à votre magasin de données de confiance. Ou vous pouvez donner le certificat en tant que confiance dans l'argument de vérification. De la documentation :

Vous pouvez passer vérifier le chemin d'accès à un fichier ou un répertoire CA_BUNDLE avec certificats des autorités de certification de confiance:

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

Cette liste d'autorités de certification approuvées peut également être spécifiée via le fichier REQUESTS_CA_BUNDLE variable d’environnement.

11
Steffen Ullrich

Vous pouvez indiquer aux demandes de ne pas vérifier le certificat 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

Voir plus dans le requests doc

12
mattexx

Vous manquez probablement les certificats d'actions dans votre système. Par exemple. si vous utilisez Ubuntu, vérifiez que le paquet ca-certificates est installé.

6
markhor

si vous souhaitez utiliser le programme d'installation de Python dmg, vous devez également lire le fichier Lisez-moi de Python 3 et exécuter la commande bash pour obtenir de nouveaux certificats.

Essayez de courir 

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

Je publie cela comme une réponse parce que j'ai résolu votre problème jusqu'à présent, mais il reste des problèmes dans votre code (qui, une fois corrigé, peut être mis à jour).

En résumé: vous pouvez utiliser une ancienne version de requêtes ou le certificat SSL doit être invalide. Il y a plus d'informations dans cette question SO: Python demande "la vérification du certificat a échoué"

J'ai mis à jour le code dans mon propre fichier 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)

Quand je lance le script, cela me donne cette erreur:

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'

Il y a un problème quelque part avec votre méthode findAll. J'ai utilisé à la fois python3 et python2, dans lequel python2 rapporte ceci:

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

Il semble donc que vous ayez besoin de corriger cette méthode avant de pouvoir continuer.

1
NuclearPeon