2015-12-29 13 views
17

Więc zacząłem uczyć się Pythona ostatnio przy użyciu filmów "The New Boston's" na youtube, wszystko szło świetnie, aż dotarłem do jego samouczka tworzenia prostego robota sieciowego. Chociaż zrozumiałem to bez problemu, po uruchomieniu kodu otrzymuję błędy, które wydają się być oparte na "SSL: CERTIFICATE_VERIFY_FAILED". Szukałem odpowiedzi od zeszłej nocy, próbując dowiedzieć się, jak to naprawić, wydaje się, że nikt inny w komentarzach do filmu lub na jego stronie internetowej nie ma takiego samego problemu jak ja, a nawet używając kogoś kodu elses z jego Strona internetowa Mam takie same wyniki. Wyślę kod z tego, który dostałem ze strony internetowej, ponieważ daje mi ten sam błąd, a ten, który zakodowałem, jest teraz bałaganem.Pytanie "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) 

Pełne błędu: ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] Świadectwo sprawdzenia nie powiodło się (_ssl.c: 645)

Przepraszam jeśli to głupie pytanie, jestem wciąż nowe do programowanie, ale naprawdę nie mogę tego zrozumieć, myślałem o pominięciu tego samouczka, ale przeszkadza mi to, że nie mogę tego naprawić, dzięki!

+0

Otrzymuję komunikat "Nie znaleziono pliku". wiadomości podczas próby przejścia do 'https: //www.thenewboston.com/tops.php? type = text & period = this-month & page = 1'. Czy możesz zweryfikować, że strona istnieje? – NuclearPeon

+0

@NuclearPeon Huh, mógłbym przysiąc, że działało wczoraj, niezależnie od tego, czy próbowałem użyć 'https: //www.thenewboston.com/forum/category.php? Id = 15 & orderby = recent & page =' zamiast tego, które powinno doprowadzić cię do Pythona sekcji strony i otrzymuję dokładnie ten sam błąd. –

+0

Spędziłem kilka godzin próbując rozwiązać ten problem, tylko po to, aby dowiedzieć się, że miałem skrzypka. – JBourne

Odpowiedz

10

problem nie jest w kodzie, ale na stronie internetowej, którą próbujesz uzyskać dostęp. Patrząc na analysis by SSLLabs można zauważyć:

This server's certificate chain is incomplete. Grade capped to B.

Oznacza to, że konfiguracja serwera jest nie tak i że nie tylko python ale kilka innych będzie miał problemów z tej strony. Niektóre przeglądarki komputerów stacjonarnych rozwiązują ten problem, próbując wczytać brakujące certyfikaty z Internetu lub wypełnić buforowane certyfikaty. Ale inne przeglądarki lub aplikacje również zawiedzie, podobnie jak python.

Aby obejść awarię konfiguracji serwera, można jawnie wyodrębnić brakujące certyfikaty i dodać je do magazynu zaufanych certyfikatów. Lub możesz nadać certyfikatowi zaufanie w argumencie weryfikacji.Od the documentation:

You can pass verify the path to a CA_BUNDLE file or directory with certificates of trusted CAs:

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

This list of trusted CAs can also be specified through the REQUESTS_CA_BUNDLE environment variable.

+0

Dziękuję za odpowiedź! Tego właśnie w zasadzie nie mogłem zrozumieć, gdyby to była moja wina, czy nie. Jeszcze raz dziękuję za pomoc! –

+1

@BillJenkins: zwykłym sposobem nie jest dodawanie komentarza z podziękowaniem, ale zaakceptowanie odpowiedzi, jeśli jest poprawna. –

+0

Otrzymuję ten sam błąd z wykrzyknikiem, który ma ocenę A + – derp92

1

Zamieszczam to jako odpowiedź, ponieważ do tej pory udało mi się rozwiązać problem, ale nadal występują problemy w kodzie (które po naprawieniu mogę zaktualizować).

Krótko mówiąc: możesz używać starej wersji żądań lub certyfikat ssl powinien być nieprawidłowy. Nie ma więcej informacji w tym SO pytanie: Python requests "certificate verify failed"

I został uaktualniony kod do własnego bsoup.py pliku:

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

Kiedy uruchomić skrypt, to daje mi ten błąd:

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' 

Jest jakiś problem z metodą findAll. Używałem zarówno python3 i python2, w którym raporty to python2:

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

więc wygląda na to trzeba naprawić tę metodę, zanim będzie można kontynuować

+0

Hm, dzięki za odpowiedź! Wciąż jestem trochę zdezorientowany z powodu problemu ssl, ponieważ udało mi się go uruchomić na innym forum, więc nie sądzę, że jest to problem z prośbami. Zakładam, że oznacza to, że certyfikat ssl jest nieprawidłowy? Ale nie wiem, co to właściwie znaczy. Poszedłem do wątku, który łączyłeś i zmieniłeś 'requests.get (url)' na 'requests.get (url, verify = False)' i teraz dostaję tylko błąd o tym, że nie zdefiniowano żadnego parsera w BeautifulSoup. Naprawdę nie rozumiem żadnego z nich, 'verify = False' sprawiający, że działa lub parser nie jest określony. –

+0

@BillJenkins Nie bardzo to rozumiem. Słyszałem o tym, że Microsoft unieważnia ostatnio kilka starszych certyfikatów, a czasami różne przeglądarki obsługują też inne certyfikaty (Firefox i Chrome). Chciałbym móc więcej pomóc, przepraszam. Powodzenia! – NuclearPeon

+0

Ah w porządku, dziękuję za pomoc! Naprawdę to doceniam! –

7

Można powiedzieć żądania nie do zweryfikowania certyfikat 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 

Zobacz więcej w requests doc

+4

Wyłączenie sprawdzania poprawności jest zwykle złą radą, ponieważ rozwiązuje problem, sprawiając, że aplikacja jest niestabilna. Istnieje powód, dla którego certyfikaty są zatwierdzane (ochrona przed człowiekiem w środkowych atakach). Tak więc, chociaż może to być praca około ** tylko do testowania ** nie powinieneś nigdy tego robić w kodzie produkcyjnym. Najlepiej jest nauczyć się, jak rozwiązać problem prawidłowo, a nie jak obejść go w niepewny sposób. –

4

Prawdopodobnie brakuje certyfikatów giełdowych w systemie. Na przykład. jeśli działasz na Ubuntu, sprawdź, czy jest zainstalowany pakiet ca-certificates.

+0

Brakowało mi pakietu w systemie Linux, dodając go rozwiązany problem. Problem polega na tym, że nie jestem pewien, jak to naprawić w systemie Windows. –