5 начина за изтегляне на файлове от URL с помощта на Python

Искате ли да изтеглите файлове от 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’ в двоичен режим на запис.
  11 най-добри софтуера за търсене на продажби за увеличаване на потенциала за продажби

И трябва да видите изтегленото изображение, когато разпечатвате съдържанието на директорията:

Използвайки 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’ в текущата директория.
  Как да инсталирате Google Chrome на Ubuntu

Когато изтеглите 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 комикса – малък файл с изображение – в текущата директория.

  11 най-добри софтуера за търсене на продажби за увеличаване на потенциала за продажби

Въпреки това може да искате да изтеглите много по-големи файлове, като инсталационни програми за 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 заявките. Приятно изтегляне!