Wenn Sie den Inhalt einer Webseite in eine Variable übertragen wollen, brauchen Sie nur read
die Reaktion von 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
Der einfachste Weg, eine Datei herunterzuladen und zu speichern, ist die Verwendung der urllib.request.urlretrieve
Funktion:
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)
Aber bedenken Sie, dass urlretrieve
wird als Erbe und könnte veraltet werden (ich weiß allerdings nicht, warum).
Die meisten richtig Eine Möglichkeit, dies zu tun, wäre die Verwendung der urllib.request.urlopen
Funktion, um ein dateiähnliches Objekt zurückzugeben, das eine HTTP-Antwort darstellt, und es in eine echte Datei zu kopieren, indem man 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)
Wenn Ihnen das zu kompliziert erscheint, können Sie es auch einfacher haben und den gesamten Download in einer bytes
Objekt und schreiben es dann in eine Datei. Dies funktioniert jedoch nur bei kleinen Dateien.
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)
Es ist möglich, Folgendes zu extrahieren .gz
(und vielleicht auch andere Formate) komprimierte Daten im laufenden Betrieb zu speichern, aber ein solcher Vorgang erfordert wahrscheinlich, dass der HTTP-Server den wahlfreien Zugriff auf die Datei unterstützt.
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`.