Как загружать файлы с 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 мы установили виртуальную машину.

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий