J'utilise urllib.request.urlretrieve pour télécharger un fichier en local.
urllib.request.urlretrieve(url_string,file_name)
Cela génère une erreur:
ssl.CertificateError n'a pas été gérée par le code utilisateur Message: le nom d'hôte 'foo.net' ne correspond ni à 'a248.e.akamai.net', '. akamaihd.net', '. akamaihd- staging.net ',' . akamaized.net ','. akamaized-staging.net '
Si vous copiez l'URL dans Chrome, il vous montrera une notification et vous devrez dire quelque chose comme "continuer à accéder à l'URL".
Utilisation urllib.request.urlopen
avec contexte ssl personnalisé :
import ssl
import urllib.request
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
with urllib.request.urlopen(url_string, context=ctx) as u, \
open(file_name, 'wb') as f:
f.write(u.read())
Alternativement, si vous utilisez requests
bibliothèque , cela pourrait être plus simple:
import requests
with open(file_name, 'wb') as f:
resp = requests.get(url_string, verify=False)
f.write(resp.content)
La fonction urllib.request.urlretrieve
N'accepte aucune option SSL mais urllib.request.urlopen
L'accepte.
Cependant, à la place, en créant un contexte SSL sécurisé avec ssl.create_default_context()
et en le rendant non sécurisé, vous pouvez créer un contexte non sécurisé avec ssl.SSLContext()
:
Ce:
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
est équivalent à:
ctx = ssl.SSLContext()
(Pour Python <3.5.3 utilisez ssl.SSLContext(ssl.PROTOCOL_TLSv1)
)
Ce qui fait un Nice one-liner:
import ssl
import urllib.request
with urllib.request.urlopen("https://wrong.Host.badssl.com/", context=ssl.SSLContext()) as url:
print(url.read())