Хочете завантажувати файли з 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» у двійковому режимі запису.
І ви повинні побачити завантажене зображення під час друку вмісту каталогу:
Використання 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 для завантаження файлів з Інтернету.
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 — невеликого файлу зображення — у поточний каталог.
Однак ви також можете завантажити набагато більші файли, такі як інсталятори для 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. Приємного завантаження!