2015-12-29 14 views
17

Così ho iniziato ad imparare Python di recente usando i video di "The New Boston's" su youtube, tutto stava andando alla grande fino a quando non sono arrivato al suo tutorial su come creare un semplice web crawler. Mentre l'ho capito senza problemi, quando eseguo il codice ottengo errori tutti apparentemente basati su "SSL: CERTIFICATE_VERIFY_FAILED." Ho cercato una risposta dalla scorsa notte cercando di capire come risolverlo, sembra che nessun altro nei commenti sul video o sul suo sito web stia avendo lo stesso problema di me e anche usando un codice di qualcuno Elses dal suo sito web ottengo gli stessi risultati. Pubblicherò il codice da quello che ho ricevuto dal sito web poiché mi dà lo stesso errore e quello che ho codificato è un casino in questo momento."SSL: certificate_verify_failed" python?

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'errore completo è: ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificato di verifica fallita (_ssl.c: 645)

Mi scuso se questa è una domanda stupida, io sono ancora nuovo per programmazione, ma seriamente non riesco a capirlo, stavo pensando di saltare questo tutorial ma mi dà fastidio non essere in grado di risolvere questo problema, grazie!

+0

Sto ricevendo "File non trovato". messaggi quando si tenta di navigare in 'https: //www.thenewboston.com/tops.php? type = text & period = this-month & page = 1'. Puoi verificare che la pagina esista? – NuclearPeon

+0

@NuclearPeon Huh, avrei potuto giurare che funzionava ieri, nonostante abbia provato a usare 'https: //www.thenewboston.com/forum/category.php? Id = 15 & orderby = recent & page =' invece che dovrebbe portarti al Python sezione del sito web e sto ottenendo lo stesso errore con esso. –

+0

Ho passato un paio d'ore a cercare di risolvere questo problema, solo per scoprire che avevo il violinista in esecuzione. – JBourne

risposta

10

il problema non è nel codice, ma nel sito web che si sta tentando di accedere. Se si guarda alla analysis by SSLLabs si nota:

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

Ciò significa che la configurazione del server è sbagliato e che non solo python, ma molti altri avranno problemi con questo sito. Alcuni browser desktop aggirano questo problema di configurazione tentando di caricare i certificati mancanti da Internet o di compilare con i certificati memorizzati nella cache. Ma anche altri browser o applicazioni falliranno, come Python.

Per aggirare la configurazione del server danneggiato, è possibile estrarre esplicitamente i certificati mancanti e aggiungerli al trust store. Oppure potresti dare il certificato come fiducia all'interno dell'argomento di verifica.Da 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

Grazie per la risposta! Questo è quello che per lo più non riuscivo a capire, se fosse colpa mia o meno. Grazie ancora per il vostro aiuto! –

+1

@BillJenkins: il solito modo non è quello di aggiungere un commento con un ringraziamento, ma di accettare la risposta se è quella corretta. –

+0

Ottengo lo stesso errore con yelp, che ha A + rating – derp92

1

Sto postando questo come una risposta perché ho superato il problema finora, ma ci sono ancora problemi nel codice (che, una volta risolto, posso aggiornare).

Per farla breve: si potrebbe utilizzare una versione precedente di richieste o il certificato ssl non dovrebbe essere valido. Ci sono ulteriori informazioni in questo SO domanda: Python requests "certificate verify failed"

Ho aggiornato il codice nel mio bsoup.py di file:

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

Quando eseguo la sceneggiatura, mi dà questo errore:

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' 

C'è un problema da qualche parte con il tuo metodo findAll. Ho usato sia python3 e python2, in cui i rapporti python2 questo:

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

così sembra che sarà necessario sistemare quel metodo prima di poter continuare

+0

Hm, grazie per la risposta! Sono ancora un po 'confuso con il problema ssl perché sono riuscito a farlo funzionare su un altro forum quindi non penso che sia un problema con le richieste. Suppongo che questo significhi che il certificato SSL non è valido? Ma non so cosa significhi in realtà. Sono andato alla discussione che hai linkato e ho cambiato 'requests.get (url)' in 'requests.get (url, verify = False)' e ora ricevo solo un errore sul fatto che nessun parser sia stato specificato in BeautifulSoup. Non capisco davvero niente di tutto ciò, il 'verify = False' che lo fa funzionare, o il parser non viene specificato. –

+0

@BillJenkins Anche io non lo capisco molto. Ho sentito di Microsoft invalidare un gruppo di vecchi certificati ultimamente, ea volte i diversi browser gestiscono anche i certificati in modo diverso (Firefox vs Chrome). Vorrei poter aiutare di più, mi dispiace. In bocca al lupo! – NuclearPeon

+0

Ah okay, bene grazie per tutto il tuo aiuto amico! Lo apprezzo davvero! –

7

Si può dire richieste non per verificare la certificato 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 

Visualizza maggiori nel requests doc

+4

La disattivazione della convalida è in genere un cattivo consiglio poiché aggira il problema rendendo l'applicazione non sicura. C'è un motivo per cui i certificati vengono convalidati (protezione contro gli attacchi degli uomini nel mezzo). Quindi, mentre questo potrebbe essere un problema intorno a ** solo per i test ** non dovresti mai farlo nel codice di produzione. La cosa migliore è imparare come risolvere il problema correttamente e non come risolverlo in un modo non sicuro. –

4

Probabilmente mancano i certificati azionari nel sistema. Per esempio. se in esecuzione su Ubuntu, verificare che il pacchetto ca-certificates sia installato.

+0

Mi mancava il pacchetto su Linux, aggiungendo che risolveva il problema. Il problema è che non sono sicuro su come risolvere questo problema su Windows. –

Problemi correlati