Бажаєте отримати файли з інтернет-адреси, використовуючи Python? Розглянемо, як це здійснити.
У процесі розробки проектів на Python може виникнути потреба завантажувати файли з інтернету за вказаною URL-адресою.
Звичайно, можна завантажити файли вручну у вашу робочу область. Однак, значно зручніше автоматизувати цей процес, використовуючи Python-скрипт.
У цьому матеріалі ми детально проаналізуємо різні підходи до завантаження файлів з інтернету за допомогою Python, використовуючи як вбудовані, так і сторонні бібліотеки.
Як Python допомагає завантажувати файли з URL
Якщо ви вже знайомі з Python, то, ймовірно, бачили відомий комікс XKCD про Python:
Комікси Python | Джерело: XKCD
Для прикладу, спробуємо завантажити зображення у форматі PNG (з розширенням .png) з коміксу XKCD у наш робочий каталог, використовуючи різні методи.
В процесі роботи нам знадобиться кілька сторонніх пакетів 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:
Використання бібліотеки requests
Бібліотека requests є досить популярною і часто використовується в Python. Вона дозволяє відправляти HTTP-запити до інтернету та отримувати відповідний вміст.
Для початку, потрібно встановити бібліотеку requests:
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)
Давайте розглянемо, що саме ми робимо в цьому коді:
- Імпортуємо бібліотеку requests.
- Встановлюємо URL-адресу зображення коміксу XKCD про Python.
- Відправляємо GET-запит за вказаною URL-адресою, використовуючи requests.get.
- Зберігаємо вміст відповіді (дані зображення) як “xkcd_comic.png” у двійковому режимі запису.
У результаті, ви повинні побачити завантажене зображення під час перегляду вмісту каталогу:
Застосування urllib3
Ми вже розглянули, як використовувати вбудований модуль urllib.request. Проте, ви також можете застосувати сторонній пакет 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
Бібліотека wget в Python спрощує завантаження файлів з 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, який дозволяє завантажувати файли з інтернету через командний рядок.
PyCURL, Python-інтерфейс для libcurl, є потужним інструментом для створення HTTP-запитів. Він надає детальний контроль над запитами, і ви можете використовувати його для розширених випадків використання при роботі з веб-ресурсами.
Встановлення pycurl у робочому середовищі може бути дещо складним. Спробуйте встановити за допомогою pip:
pip install pycurl
⚠️ Якщо під час процесу виникають помилки, зверніться до Посібника зі встановлення PyCURL для вирішення проблем.
Також, якщо у вас встановлено cURL, ви можете встановити прив’язки Python до libcurl так:
sudo apt install python3-pycurl
Примітка: Спочатку необхідно встановити cURL, а вже потім прив’язку Python. Якщо cURL не встановлено, це можна зробити так: apt install curl.
Завантаження файлів за допомогою PyCURL
Ось код для завантаження коміксу XKCD за допомогою 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), щоб впевнитись, що запит був успішним (код 200). Якщо код статусу 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, який є невеликим файлом із зображенням, у поточний каталог.
Проте, іноді виникає потреба завантажувати значно більші файли, такі як інсталятори для IDE. Завантаження таких файлів фрагментами є корисним підходом, а також відстежувати прогрес завантаження. Для цього ми можемо використати функціональність бібліотеки requests.
Спробуємо завантажити інсталятор VS Code частинами по 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.
Як розробник, я найчастіше використовую бібліотеку requests для завантаження файлів і роботи з веб-інтерфейсами API. Проте, інші методи також можуть стати у нагоді, залежно від складності задачі завантаження та необхідного рівня деталізації для HTTP-запитів. Приємного завантаження!