web-dev-qa-db-de.com

"SSL: certificate_verify_failed" Fehler beim Scraping von https://www.thenewboston.com/

Ich lernte vor kurzem Python mit den Videos von "The New Boston" auf youtube. Alles lief großartig, bis ich zu seinem Tutorial eines einfachen Webcrawlers kam. Während ich es ohne Probleme verstanden habe, bekomme ich, wenn ich den Code ausführte, Fehler, die scheinbar auf "SSL: CERTIFICATE_VERIFY_FAILED" basieren. Ich habe seit gestern Abend nach einer Antwort gesucht, um herauszufinden, wie sie behoben werden kann. Es scheint, dass niemand in den Kommentaren des Videos oder auf seiner Website das gleiche Problem wie ich hat und sogar jemanden benutzt, der seinen Code verwendet Website bekomme ich die gleichen Ergebnisse. Ich werde den Code von dem aus posten, den ich von der Website erhalten habe, da er mir den gleichen Fehler gibt und der Code, den ich codiert habe, momentan ein Durcheinander ist.

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)

Der vollständige Fehler lautet: ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

Ich entschuldige mich, wenn dies eine dumme Frage ist. Ich bin noch nicht ganz in der Programmierung, aber ich kann es nicht ernsthaft herausfinden. Ich habe darüber nachgedacht, dieses Tutorial einfach zu überspringen, aber es stört mich, dass ich das nicht reparieren kann.

19
Bill Jenkins

Das Problem liegt nicht in Ihrem Code, sondern in der Website, auf die Sie zugreifen möchten. Beim Betrachten der Analyse durch SSLLabs werden Sie Folgendes beachten:

Die Zertifikatskette dieses Servers ist unvollständig. Note auf B. begrenzt.

Dies bedeutet, dass die Serverkonfiguration falsch ist und nicht nur Python, sondern auch mehrere andere Probleme mit dieser Site haben. Einige Desktop-Browser umgehen dieses Konfigurationsproblem, indem Sie versuchen, die fehlenden Zertifikate aus dem Internet zu laden oder zwischengespeicherte Zertifikate auszufüllen. Andere Browser oder Anwendungen werden jedoch ebenfalls ausfallen, ähnlich wie Python.

Um die defekte Serverkonfiguration zu umgehen, können Sie die fehlenden Zertifikate explizit extrahieren und sie Ihrem Vertrauensspeicher hinzufügen. Oder Sie geben das Zertifikat innerhalb des Verifizierungsarguments als vertrauenswürdig an. Aus der Dokumentation :

Sie können den Pfad an eine CA_BUNDLE-Datei oder ein CA-Verzeichnis mit .__ übergeben. Zertifikate vertrauenswürdiger Zertifizierungsstellen:

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

Diese Liste vertrauenswürdiger Zertifizierungsstellen kann auch über .__ angegeben werden. REQUESTS_CA_BUNDLE Umgebungsvariable.

11
Steffen Ullrich

Sie können Anforderungen anweisen, das SSL-Zertifikat nicht zu überprüfen:

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

Mehr dazu in der requests doc

12
mattexx

Vermutlich fehlen Ihnen die Aktienzertifikate in Ihrem System. Z.B. Wenn Sie unter Ubuntu laufen, prüfen Sie, ob das ca-certificates-Paket installiert ist.

6
markhor

wenn Sie das Python dmg-Installationsprogramm verwenden möchten, müssen Sie auch die Readme-Datei von Python 3 lesen und den Befehl bash ausführen, um neue Zertifikate zu erhalten.

Versuchen Sie zu laufen 

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

Ich poste dies als Antwort, weil ich bisher an Ihrem Problem vorbeigekommen bin, aber es gibt immer noch Probleme in Ihrem Code (die, wenn sie behoben werden, ich aktualisieren kann).

Um es kurz zu machen: Sie könnten eine alte Version von Anfragen verwenden oder das SSL-Zertifikat sollte ungültig sein. Weitere Informationen finden Sie in dieser SO - Frage: Python-Anforderungen "Zertifikatprüfung fehlgeschlagen"

Ich habe den Code in meiner eigenen bsoup.py-Datei aktualisiert:

#!/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)

Wenn ich das Skript starte, wird mir dieser Fehler angezeigt:

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'

Es gibt irgendwo ein Problem mit Ihrer findAll-Methode. Ich habe sowohl Python3 als auch Python2 verwendet, wobei Python2 dies meldet:

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

Es scheint also, dass Sie diese Methode reparieren müssen, bevor Sie fortfahren können

1
NuclearPeon