Искате ли да изтеглите файлове от URL с помощта на Python? Нека научим различните начини за това.
Когато работите върху проект на Python, може да се наложи да изтеглите файлове от мрежата – от конкретен URL адрес.
Можете да ги изтеглите ръчно във вашата работна среда. Въпреки това е по-удобно да изтегляте файлове от техните URL адреси програмно в рамките на скрипт на Python.
В този урок ще разгледаме различните начини за изтегляне на файлове от мрежата с Python – като използвате както вградени пакети на Python, така и пакети на трети страни.
Съдържание
Как да използвате Python за изтегляне на файлове от URL
Ако сте запознати с Python, щяхте да попаднете на този популярен XKCD Python комикс:
Python комикс | източник: XKCD
Като пример, ще се опитаме да изтеглим това изображение на комикс XKCD (разширение .png) 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 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
Забележка: Преди да инсталирате обвързването на 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, буфер):
# 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 Object
Накрая затваряме curl обекта с помощта на c.close(), за да изчистим ресурсите:
# Close the Curl object c.close()
Как да изтегляте големи файлове на по-малки парчета
Досега сме виждали различни начини за изтегляне на XKCD Python комикса – малък файл с изображение – в текущата директория.
Въпреки това може да искате да изтеглите много по-големи файлове, като инсталационни програми за IDE и др. Когато изтегляте такива големи файлове, е полезно да ги изтегляте на по-малки парчета и също така да проследявате напредъка, докато изтеглянето продължава. Можем да използваме функционалността на библиотеката на заявките за това.
Нека използваме заявки за изтегляне на VS код инсталатор на парчета с размер 1 MB:
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 MB в този пример).
- След това използваме requests.get с stream=True, за да предаваме поточно съдържанието на отговора, без да зареждаме целия файл в паметта наведнъж.
- Ние запазваме всяка част във файла последователно, докато се изтегля.
Докато изтеглянето продължава, ще видите броя на текущо изтеглените байтове/общия брой байтове:
След като изтеглянето приключи, трябва да видите съобщението „Изтеглянето е завършено“:
И трябва да видите инсталатора на VS Code във вашата директория:
Обобщавайки
Надявам се, че сте научили няколко различни начина за изтегляне на файлове от URL адреси с помощта на Python. В допълнение към вградения urllib.request, ние покрихме популярни пакети на Python на трети страни като заявки, urllib3, wget и PuCURL.
Като разработчик използвах библиотеката с заявки повече от други в моите проекти за изтегляне на файлове и работа с уеб API като цяло. Но другите методи също могат да бъдат полезни в зависимост от сложността на задачата за изтегляне и нивото на детайлност, от което се нуждаете на HTTP заявките. Приятно изтегляне!