Как загружать файлы с URL-адреса в Python
Загрузка файлов из сети является одной из наиболее распространенных ежедневных задач, выполняемых в Интернете. Это важно в связи с тем, что многие успешные программы позволяют своим пользователям загружать файлы из Интернета.
В сегодняшней статье мы рассмотрим, как использовать библиотеки requests и tqdm для создания загрузчика файлов с индикатором выполнения с использованием Python.
Начнем с создания изолированной среды, куда установим все необходимое через командную строку:
# windows
# для python 3 и выше
>>>python -m venv my_folder
# активируем ее
>>>cd my_folder/Scripts
>>>activate
# вывод
>>> (my_folder) C:\Users\УЗИ\Desktop\my_folder\Scripts>
# среда активирована, теперь установим библиотеки requests и tqdm
>>>pip3 install requests tqdm
Модуль tqdm здесь используется просто для создания красивого индикатора в консоли.
Откройте новый файл Python и импортируйте:
from tqdm import tqdm
import requests
import cgi
import sys
# URL адрес будет передаваться через командную строку
url = sys.argv[1]
Далее, для загрузки контента с интернета мы используем метод requests.get(). Но есть одна проблема, так как данный метод загружает информацию целиком, что может перегрузить память. К счастью для нас, у метода get есть параметр stream, которому можно присвоить True. Что позволит загружать информацию частями.
# установим значение в 1024 байт за один раз
buffer_size = 1024
# загрузка тела ответа по кускам
response = requests.get(url, stream=True)
Теперь не только заголовок ответа загружен и соединение осталось открытым, также есть возможность управлять рабочим процессом с помощью метода iter_content(). Но перед тем как продемонстрировать указанное в действии, мы должны извлечь название файла и его общий размер.
# получим размер файла
file_size = int(response.headers.get("Content-Length", 0))
# получим имя файла
default_filename = url.split("/")[-1]
# получим заголовок content disposition, обозначающий что файл #предназначен для скачивания
content_disposition = response.headers.get("Content-Disposition")
# если данный элемент существует
if content_disposition:
# разбираем заголовок с помощью cgi
value, params = cgi.parse_header(content_disposition)
# извлекаем имя файла из content disposition
filename = params.get("filename", default_filename)
else:
# если же content dispotion не доступен то используем имя из url
filename = default_filename
Мы получаем размер файла в байтах из заголовка ответа Content-Length, мы также получаем имя файла в заголовке Content-Disposition, но нам нужно проанализировать его с помощью функции cgi.parse_header().
Давайте скачаем файл прямо сейчас:
# индикатор выполнения отражает количество загруженных байт
progress = tqdm(response.iter_content(buffer_size), f"Загрузка {filename}", total=file_size, unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "wb") as f:
for data in progress.iterable:
# запись данных прочитанных из файла
f.write(data)
# update the progress bar manually
progress.update(len(data))
Запуск скрипта:
>>>python download_indicator.py https://download.virtualbox.org/virtualbox/6.1.18/VirtualBox-6.1.18-142142-Win.exe
# Расширения файлов должны оканчиваться на .exe, .pdf, etc.
Результат:
В результате в каталоге с запущенным скриптом будет установлен VirtualBox. Таким образом, с помощью Python и библиотек requests и tqdm мы установили виртуальную машину.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.