Ответ 1
Если вы хотите получить содержимое веб-страницы в переменной, просто read
ответ 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
Самый простой способ загрузить и сохранить файл - использовать urllib.request.urlretrieve
:
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)
Но имейте в виду, что urlretrieve
считается legacy и может стать устаревшим (не уверен, почему, хотя).
Таким образом, самый правильный способ сделать это - использовать функцию urllib.request.urlopen
, чтобы вернуть файл -подобный объект, который представляет HTTP-ответ и копирует его в реальный файл, используя 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)
Если это кажется слишком сложным, вам может потребоваться упростить и сохранить всю загрузку в объекте bytes
, а затем записать его в файл. Но это хорошо работает только для небольших файлов.
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)
Можно извлекать .gz
(и, возможно, другие форматы) сжатые данные "на лету", но такая операция, вероятно, требует, чтобы HTTP-сервер поддерживал произвольный доступ к файлу.
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`.