Se si desidera ottenere il contenuto di una pagina web in una variabile, basta read
la risposta del urllib.request.urlopen
:
import urllib.request
...
url = 'http://example.com/'
response = urllib.request.urlopen(url)
data = response.read() # a `bytes` object
text = data.decode('utf-8') # a `str`; this step can't be used if data is binary
Il modo più semplice per scaricare e salvare un file è quello di utilizzare il urllib.request.urlretrieve
funzione:
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
urllib.request.urlretrieve(url, file_name)
import urllib.request
...
# Download the file from `url`, save it in a temporary directory and get the
# path to it (e.g. '/tmp/tmpb48zma.txt') in the `file_name` variable:
file_name, headers = urllib.request.urlretrieve(url)
Ma tieni presente che urlretrieve
è considerato legacy e potrebbe diventare deprecato (non sono sicuro del perché, però).
Quindi la più corretta modo per farlo sarebbe quello di utilizzare la funzione urllib.request.urlopen
per restituire un oggetto simile a file che rappresenta una risposta HTTP e copiarlo su un vero e proprio file usando shutil.copyfileobj
.
import urllib.request
import shutil
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
Se questo vi sembra troppo complicato, si consiglia di andare più semplice e memorizzare l'intero scaricare in un oggetto bytes
e poi scrivere in un file. Ma questo funziona bene solo per i file di piccole dimensioni.
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
data = response.read() # a `bytes` object
out_file.write(data)
E 'possibile estrarre .gz
(e forse altri formati) i dati compressi al volo, ma una simile operazione richiede probabilmente il server HTTP per supportare l'accesso casuale ai file.
import urllib.request
import gzip
...
# Read the first 64 bytes of the file inside the .gz archive located at `url`
url = 'http://example.com/something.gz'
with urllib.request.urlopen(url) as response:
with gzip.GzipFile(fileobj=response) as uncompressed:
file_header = uncompressed.read(64) # a `bytes` object
# Or do anything shown above using `uncompressed` instead of `response`.
@alvas, A taglie per questo? Il rispondente è ancora (e abbastanza) attivo su SO. Perché non aggiungere un commento e chiedere? –
Cos una buona risposta che dura la prova del tempo vale la pena premiare. Inoltre, dovremmo iniziare a farlo per molte altre domande per verificare se le risposte sono rilevanti oggi. Soprattutto quando lo smistamento delle risposte SO è piuttosto folle, a volte la risposta obsoleta o addirittura peggiore va in alto. – alvas