Как загружать файлы с URL-адреса в Python

Как загружать файлы с URL-адреса в Python

Как загружать файлы с URL-адреса в Python

Загрузка файлов из сети является одной из наиболее распространенных ежедневных задач, выполняемых в Интернете. Это важно в связи с тем, что многие успешные программы позволяют своим пользователям загружать файлы из Интернета.

В сегодняшней статье мы рассмотрим, как использовать библиотеки requests и tqdm для создания загрузчика файлов с индикатором выполнения с использованием Python.

Начнем с создания изолированной среды, куда установим все необходимое через командную строку:


# windows
# для python 3 и выше
>>>python -m venv my_folder

# активируем ее
>>>cd my_folder/Scripts
>>>activate

# вывод
>>> (my_folder) C:UsersУЗИDesktopmy_folderScripts>

# среда активирована, теперь установим библиотеки 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.

Результат:

Как загружать файлы с URL-адреса в Python

В результате в каталоге с запущенным скриптом будет установлен VirtualBox.
Таким образом, с помощью Python и библиотек requests и tqdm мы установили виртуальную машину.

Источник