Scikit-learn: fetch_california_housing() URLErreur :<urlopen error="" certificate_verify_failed="" certificate="" verify="" failed=""/>

Créé le 25 nov. 2017  ·  12Commentaires  ·  Source: scikit-learn/scikit-learn

La description

Je ne parviens pas à utiliser fetch_california_housing() pour télécharger un exemple d'ensemble de données. Il semble que le certificat ait expiré ?

Étapes/Code à reproduire

print('La version de scikit-learn est {}.'.format(sklearn.__version__))
à partir de sklearn.datasets importer fetch_california_housing
logement = fetch_california_housing()

Résultats actuels

Downloading Cal. housing from https://ndownloader.figshare.com/files/5976036 to /Users/test/scikit_learn_data
The scikit-learn version is 0.19.1.
---------------------------------------------------------------------------
SSLError                                  Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1317                 h.request(req.get_method(), req.selector, req.data, headers,
-> 1318                           encode_chunked=req.has_header('Transfer-encoding'))
   1319             except OSError as err: # timeout error

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in request(self, method, url, body, headers, encode_chunked)
   1238         """Send a complete request to the server."""
-> 1239         self._send_request(method, url, body, headers, encode_chunked)
   1240 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in _send_request(self, method, url, body, headers, encode_chunked)
   1284             body = _encode(body, 'body')
-> 1285         self.endheaders(body, encode_chunked=encode_chunked)
   1286 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in endheaders(self, message_body, encode_chunked)
   1233             raise CannotSendHeader()
-> 1234         self._send_output(message_body, encode_chunked=encode_chunked)
   1235 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in _send_output(self, message_body, encode_chunked)
   1025         del self._buffer[:]
-> 1026         self.send(msg)
   1027 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in send(self, data)
    963             if self.auto_open:
--> 964                 self.connect()
    965             else:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py in connect(self)
   1399             self.sock = self._context.wrap_socket(self.sock,
-> 1400                                                   server_hostname=server_hostname)
   1401             if not self._context.check_hostname and self._check_hostname:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)
    400                          server_hostname=server_hostname,
--> 401                          _context=self, _session=session)
    402 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py in __init__(self, sock, keyfile, certfile, server_side, cert_reqs, ssl_version, ca_certs, do_handshake_on_connect, family, type, proto, fileno, suppress_ragged_eofs, npn_protocols, ciphers, server_hostname, _context, _session)
    807                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
--> 808                     self.do_handshake()
    809 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py in do_handshake(self, block)
   1060                 self.settimeout(None)
-> 1061             self._sslobj.do_handshake()
   1062         finally:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py in do_handshake(self)
    682         """Start the SSL/TLS handshake."""
--> 683         self._sslobj.do_handshake()
    684         if self.context.check_hostname:

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)

During handling of the above exception, another exception occurred:

URLError                                  Traceback (most recent call last)
<ipython-input-18-dc07bc139b51> in <module>()
      1 print('The scikit-learn version is {}.'.format(sklearn.__version__))
      2 from sklearn.datasets import fetch_california_housing
----> 3 housing = fetch_california_housing()

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/datasets/california_housing.py in fetch_california_housing(data_home, download_if_missing)
     99             ARCHIVE.url, data_home))
    100 
--> 101         archive_path = _fetch_remote(ARCHIVE, dirname=data_home)
    102 
    103         with tarfile.open(mode="r:gz", name=archive_path) as f:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/datasets/base.py in _fetch_remote(remote, dirname)
    872     file_path = (remote.filename if dirname is None
    873                  else join(dirname, remote.filename))
--> 874     urlretrieve(remote.url, file_path)
    875     checksum = _sha256(file_path)
    876     if remote.checksum != checksum:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in urlretrieve(url, filename, reporthook, data)
    246     url_type, path = splittype(url)
    247 
--> 248     with contextlib.closing(urlopen(url, data)) as fp:
    249         headers = fp.info()
    250 

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    221     else:
    222         opener = _opener
--> 223     return opener.open(url, data, timeout)
    224 
    225 def install_opener(opener):

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in open(self, fullurl, data, timeout)
    524             req = meth(req)
    525 
--> 526         response = self._open(req, data)
    527 
    528         # post-process response

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in _open(self, req, data)
    542         protocol = req.type
    543         result = self._call_chain(self.handle_open, protocol, protocol +
--> 544                                   '_open', req)
    545         if result:
    546             return result

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    502         for handler in handlers:
    503             func = getattr(handler, meth_name)
--> 504             result = func(*args)
    505             if result is not None:
    506                 return result

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in https_open(self, req)
   1359         def https_open(self, req):
   1360             return self.do_open(http.client.HTTPSConnection, req,
-> 1361                 context=self._context, check_hostname=self._check_hostname)
   1362 
   1363         https_request = AbstractHTTPHandler.do_request_

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1318                           encode_chunked=req.has_header('Transfer-encoding'))
   1319             except OSError as err: # timeout error
-> 1320                 raise URLError(err)
   1321             r = h.getresponse()
   1322         except:

URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>

Commentaire le plus utile

POUAH!

J'ai trouvé le problème. python 3.6 sur mac nécessite une étape post-installation

$ less /Applications/Python\ 3.6/ReadMe.rtf

" Contrairement aux versions précédentes, les bibliothèques OpenSSL obsolètes fournies par Apple ne sont plus utilisées. Cela signifie également que les certificats de confiance dans les trousseaux système et utilisateur gérés par l'application Keychain Access et l'utilitaire de ligne de commande de sécurité ne sont plus utilisés par défaut "

La solution est

$ sudo /Applications/Python\ 3.6/Install\ Certificates.command

Tous les 12 commentaires

Eh bien, j'espère que c'est très temporaire... Est-ce toujours un problème ?

Salut Jnothman

J'ai remarqué ce problème pour la première fois vendredi. Je reçois toujours la même erreur

Erreur d'URL :

Sincères amitiés

Andy

Je n'ai pas ce problème. Êtes-vous sûr que votre horloge n'est pas réglée
incorrectement ou quelque chose?

Salut Jnothman

J'utilise un mac book pro. Il semble que l'heure affichée sur mon ordinateur puisse être correcte. Je viens de relancer le code et j'obtiens la même erreur

Avez-vous une idée de la façon dont je vérifie si mon horloge est correctement réglée ?

Andy

J'ai oublié de mentionner. Je n'ai pas regardé le code mais je parie que si vous avez déjà téléchargé l'ensemble de données sur votre disque local, il ne récupère jamais réellement, alors c'est peut-être pourquoi cela fonctionne pour vous

Bizarre, je ne peux certainement pas reproduire, et je me suis assuré d'avoir supprimé les données cal_housing de ~/scikit_learn_data donc cela ne semble pas être un problème dans scikit-learn. Je vais fermer celui-ci, @AEDWIP veuillez fournir plus d'informations au cas où vous parviendriez à résoudre votre problème.

Je rencontre un problème similaire - Mac Book Pro, High Sierra.

Je ne suis pas un expert dans ce domaine des certificats SSL, mais je ne pense pas que cela soit lié à scikit-learn comme je l'ai mentionné ci-dessus.

Obtenez-vous la même erreur avec cet extrait ?

from six.moves.urllib.request import urlretrieve
urlretrieve('https://ndownloader.figshare.com/files/5976036')

POUAH!

J'ai trouvé le problème. python 3.6 sur mac nécessite une étape post-installation

$ less /Applications/Python\ 3.6/ReadMe.rtf

" Contrairement aux versions précédentes, les bibliothèques OpenSSL obsolètes fournies par Apple ne sont plus utilisées. Cela signifie également que les certificats de confiance dans les trousseaux système et utilisateur gérés par l'application Keychain Access et l'utilitaire de ligne de commande de sécurité ne sont plus utilisés par défaut "

La solution est

$ sudo /Applications/Python\ 3.6/Install\ Certificates.command

J'ai le même problème avec python 3.6 sur Ubuntu 16.04

Solution trouvée ici : http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/

import os, ssl
if (not os.environ.get('PYTHONHTTPSVERIFY', '') and
    getattr(ssl, '_create_unverified_context', None)): 
    ssl._create_default_https_context = ssl._create_unverified_context

Merci, le code de nfrik a fonctionné

Cette page vous a été utile?
0 / 5 - 0 notes