5 способів завантажити файли з URL за допомогою Python

Хочете завантажувати файли з URL-адреси за допомогою Python? Давайте дізнаємося, як це зробити.

Коли ви працюєте над проектом Python, вам може знадобитися завантажити файли з Інтернету — за певною URL-адресою.

Ви можете завантажити їх у своє робоче середовище вручну. Однак зручніше завантажувати файли з їхніх URL-адрес програмним шляхом у сценарії Python.

У цьому посібнику ми розглянемо різні способи завантаження файлів з Інтернету за допомогою Python — за допомогою як вбудованих, так і сторонніх пакетів Python.

Як використовувати Python для завантаження файлів із URL

Якщо ви знайомі з Python, ви б натрапили на цей популярний комікс XKCD Python:

Комікси Python | Джерело: XKCD

Як приклад, ми спробуємо завантажити зображення PNG коміксів XKCD (розширення .png) у наш робочий каталог різними методами.

У цьому посібнику ми працюватимемо з кількома сторонніми пакетами Python. Встановіть їх усі у спеціальному віртуальному середовищі для вашого проекту.

Використання urllib.request

Ви можете використовувати вбудований Python urllib.request модуль для завантаження файлів з URL. Цей вбудований модуль містить функції для створення HTTP-запитів і обробки URL-адрес. Він забезпечує простий спосіб взаємодії з веб-ресурсами, підтримуючи такі завдання, як отримання даних із веб-сайтів.

Давайте завантажимо комікс XKCD Python за його URL-адресою за допомогою urllib.request:

import urllib.request

url="https://imgs.xkcd.com/comics/python.png"
urllib.request.urlretrieve(url, 'xkcd_comic.png')

Тут ми робимо наступне:

  • Імпортуйте модуль urllib.request.
  • Встановіть URL-адресу зображення коміксів XKCD Python.
  • Використовуйте urllib.request.urlretrieve, щоб завантажити зображення та зберегти його як «xkcd_comic.png» у поточному каталозі.

Якщо ви зараз запустите команду ls на терміналі, щоб переглянути вміст поточного каталогу, ви побачите файл xkcd_comic.png:

Використання бібліотеки запитів

The Бібліотека запитів є популярним і одним із найбільш завантажуваних пакетів Python. Ви можете надсилати HTTP-запити через Інтернет і отримувати вміст.

Спочатку встановіть бібліотеку запитів:

pip install requests

Якщо ви створили новий сценарій Python у тому ж каталозі, видаліть «xkcd_comic.png» перед запуском поточного сценарію.

import requests

url="https://imgs.xkcd.com/comics/python.png"
response = requests.get(url)

with open('xkcd_comic.png', 'wb') as file:
	file.write(response.content)

Давайте розберемо, що ми зробили за допомогою цього підходу:

  • Імпортуйте бібліотеку запитів.
  • Встановіть URL-адресу зображення коміксів XKCD Python.
  • Надішліть запит GET на URL-адресу за допомогою requests.get.
  • Збережіть вміст відповіді (дані зображення) як «xkcd_comic.png» у двійковому режимі запису.

І ви повинні побачити завантажене зображення під час друку вмісту каталогу:

  9 найкращих програм для навчання піаніно, які допоможуть вам грати на піаніно вдома

Використання urllib3

Ми бачили, як використовувати вбудований urllib.request. Але ви також можете використовувати сторонній пакет Python urllib3.

Urllib3 це бібліотека Python для створення HTTP-запитів і керування з’єднаннями надійнішим і ефективнішим способом, ніж вбудований модуль urllib. Він надає такі функції, як об’єднання з’єднань, повторні спроби запитів і безпека потоків, що робить його надійним вибором для обробки HTTP-зв’язку в програмах Python.

Встановіть urllib3 за допомогою pip:

pip install urllib3

Тепер давайте завантажимо комікс XKCD Python за допомогою бібліотеки urllib:

import urllib3

# URL of the XKCD comic image
url="https://imgs.xkcd.com/comics/python.png"

# Create a PoolManager instance
http = urllib3.PoolManager()

# Send an HTTP GET request to the URL
response = http.request('GET', url)

# Retrieve the content (image data)
image_data = response.data

# Specify the file name to save the comic as
file_name="xkcd_comic.png"

# Save the image data
with open(file_name, 'wb') as file:
	file.write(image_data)

Здається, що цей підхід більш складний, ніж попередні підходи з використанням urllib.requests і бібліотеки запитів. Отже, давайте розберемо різні кроки:

  • Ми починаємо з імпорту модуля urllib3, який надає функціональність для виконання HTTP-запитів.
  • Потім ми вказуємо URL-адресу зображення коміксів XKCD.
  • Далі ми створюємо екземпляр urllib3.PoolManager(). Цей об’єкт керує пулом з’єднань і дозволяє нам робити HTTP-запити.
  • Потім ми використовуємо метод http.request(‘GET’, url), щоб надіслати запит HTTP GET на вказану URL-адресу. Цей запит отримує вміст коміксів XKCD.
  • Після успішного виконання запиту ми отримуємо вміст (дані зображення) із відповіді HTTP за допомогою response.data.
  • Нарешті, ми записуємо дані зображення (отримані з відповіді) у файл.

Коли ви запускаєте свій сценарій Python, ви маєте отримати такий результат:

Використання wget

The бібліотека Python wget спрощує завантаження файлів з URL-адрес. Ви можете використовувати його для отримання веб-ресурсів і особливо зручний для автоматизації завдань завантаження.

Ви можете встановити бібліотеку wget за допомогою pip, а потім використовувати її функції для завантаження файлів із URL-адрес:

pip install wget

Цей фрагмент використовує модуль wget, щоб завантажити комікс XKCD Python і зберегти його як «xkcd_comic.png» у робочому каталозі:

import wget

url="https://imgs.xkcd.com/comics/python.png"
wget.download(url, 'xkcd_comic.png')

Тут:

  • Ми імпортуємо модуль wget.
  • Встановіть URL-адресу зображення коміксів XKCD Python.
  • Використовуйте wget.download, щоб завантажити зображення та зберегти його як «xkcd_comic.png» у поточному каталозі.

Коли ви завантажуєте комікс XKCD за допомогою wget, ви маєте побачити подібний результат:

Використання PyCURL

Якщо ви користуєтеся машиною Linux або Mac, можливо, ви знайомі з інструментом командного рядка cURL для завантаження файлів з Інтернету.

  12 прихованих хаків Google Photos, які полегшать ваше життя

PyCURL, інтерфейс Python для libcurl, є потужним інструментом для створення запитів HTTP. Він забезпечує детальний контроль над запитами, і ви можете використовувати його для розширених випадків використання під час обробки веб-ресурсів.

Встановлення pycurl у вашому робочому середовищі може бути складним. Спробуйте встановити за допомогою pip:

pip install pycurl

⚠️ Якщо під час процесу виникають помилки, ви можете перевірити Посібник зі встановлення PyCURL для порад щодо усунення несправностей.

Крім того, якщо у вас встановлено cURL, ви можете встановити прив’язки Python до libcurl так:

sudo apt install python3-pycurl

Примітка. Перш ніж інсталювати прив’язку Python, потрібно встановити cURL. Якщо на вашій машині не встановлено cURL, ви можете зробити це так: apt install curl.

Завантаження файлів за допомогою PyCURL

Ось код для завантаження XKCD Comic за допомогою PyCURL:

import pycurl
from io import BytesIO

# URL of the XKCD Python comic
url="https://imgs.xkcd.com/comics/python.png"

# Create a Curl object
c = pycurl.Curl()

# Set the URL
c.setopt(pycurl.URL, url)

# Create a BytesIO object to store the downloaded data
buffer = BytesIO()
c.setopt(pycurl.WRITEDATA, buffer)

# Perform the request
c.perform()

# Check if the request was successful (HTTP status code 200)
http_code = c.getinfo(pycurl.HTTP_CODE)
if http_code == 200:
    # Save the downloaded data to a file
    with open('xkcd_comic.png', 'wb') as f:
        f.write(buffer.getvalue())

# Close the Curl object
c.close()

Давайте розберемо більший фрагмент на менші фрагменти коду для кожного кроку:

Крок 1. Імпортуйте необхідні модулі

По-перше, ми імпортуємо pycurl, щоб використовувати його для створення HTTP-запитів. Потім ми імпортуємо BytesIO з io модуль щоб створити буфер для зберігання завантажених даних:

import pycurl
from io import BytesIO

Крок 2: Створіть об’єкт Curl і встановіть URL-адресу

Ми вказуємо URL-адресу коміксів XKCD Python, які хочемо завантажити. І створіть об’єкт curl, який представлятиме запит HTTP. Потім ми встановлюємо URL-адресу для об’єкта Curl за допомогою c.setopt(pycurl.URL, url):

# URL of the XKCD Python comic
url="https://imgs.xkcd.com/comics/python.png"

# Create a Curl object
c = pycurl.Curl()

# Set the URL
c.setopt(pycurl.URL, url)

Крок 3. Створіть об’єкт BytesIO та встановіть параметр WRITEDATA

Ми створюємо об’єкт BytesIO для зберігання завантажених даних і налаштовуємо об’єкт Curl для запису даних відповіді в наш буфер за допомогою c.setopt(pycurl.WRITEDATA, buffer):

# Create a BytesIO object to store the downloaded data
buffer = BytesIO()
c.setopt(pycurl.WRITEDATA, buffer)

Крок 4: Виконайте запит

Виконайте HTTP-запит за допомогою c.perform() і отримайте дані комічного зображення:

# Perform the request
c.perform()

Крок 5. Перевірте код статусу HTTP та збережіть завантажені дані

Ми отримуємо код статусу HTTP за допомогою c.getinfo(pycurl.HTTP_CODE), щоб переконатися, що запит був успішним (код HTTP 200). Якщо код статусу HTTP дорівнює 200, ми записуємо дані з буфера у файл зображення:

# Check if the request was successful (HTTP status code 200)
http_code = c.getinfo(pycurl.HTTP_CODE)
if http_code == 200:
    # Save the downloaded data to a file
    with open('xkcd_comic.png', 'wb') as f:
        f.write(buffer.getvalue())

Крок 6: Закрийте об’єкт Curl

Нарешті, ми закриваємо об’єкт curl за допомогою c.close(), щоб очистити ресурси:

# Close the Curl object
c.close()

Як завантажити великі файли меншими фрагментами

Наразі ми бачили різні способи завантаження коміксів XKCD Python — невеликого файлу зображення — у поточний каталог.

  Як встановити та налаштувати плагін Plex на OpenMediaVault

Однак ви також можете завантажити набагато більші файли, такі як інсталятори для IDE тощо. Завантажуючи такі великі файли, корисно завантажувати їх меншими частинами, а також відстежувати прогрес під час завантаження. Для цього ми можемо використовувати функціональність бібліотеки запитів.

Давайте використовувати запити для завантаження Код VS інсталятор частинами розміром 1 Мб:

import requests

# URL of the Visual Studio Code installer EXE file
url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user"

# Chunk size for downloading 
chunk_size = 1024 * 1024  # 1 MB chunks

response = requests.get(url, stream=True)

# Determine the total file size from the Content-Length header
total_size = int(response.headers.get('content-length', 0))

with open('vs_code_installer.exe', 'wb') as file:
    for chunk in response.iter_content(chunk_size):
        if chunk:
            file.write(chunk)
            file_size = file.tell()  # Get the current file size
            print(f'Downloading... {file_size}/{total_size} bytes', end='\r')

print('Download complete.')

Тут:

  • Ми встановлюємо `chunk_size`, щоб визначити розмір кожного фрагмента (1 МБ у цьому прикладі).
  • Потім ми використовуємо requests.get із stream=True для потокової передачі вмісту відповіді без завантаження всього файлу в пам’ять одночасно.
  • Ми зберігаємо кожен шматок у файлі послідовно під час його завантаження.

Під час завантаження ви побачите кількість завантажених байтів/загальну кількість байтів:

Після завершення завантаження ви повинні побачити повідомлення “Завантаження завершено”:

І ви повинні побачити програму встановлення VS Code у своєму каталозі:

Підведенню

Сподіваюся, ви навчилися кількох способів завантажувати файли з URL-адрес за допомогою Python. Окрім вбудованого urllib.request, ми розглянули популярні сторонні пакети Python, такі як requests, urllib3, wget і PuCURL.

Як розробник, я частіше, ніж інші, використовував бібліотеку запитів у своїх проектах для завантаження файлів і роботи з веб-інтерфейсами API загалом. Але інші методи також можуть стати в нагоді залежно від складності завдання завантаження та рівня деталізації, який вам потрібен для запитів HTTP. Приємного завантаження!