5 начина за преузимање датотека са УРЛ-а користећи Питхон

Želite da preuzmete fajlove sa URL-a koristeći Python? Hajde da istražimo različite pristupe za to.

Tokom rada na Python projektu, često se javlja potreba za preuzimanjem fajlova sa interneta – sa određenog URL-a.

Iako ih možete ručno preuzeti na svoj računar, mnogo je praktičnije preuzimati fajlove sa njihovih URL adresa programski, unutar Python skripte.

U ovom uputstvu, razmotrićemo različite metode za preuzimanje fajlova sa weba uz pomoć Pythona – koristeći ugrađene Python pakete i one treće strane.

Kako koristiti Python za preuzimanje fajlova sa URL-a

Ako ste se susretali sa Python programiranjem, sigurno vam je poznat ovaj popularni XKCD Python strip:

Python strip | Izvor: XKCD

Kao primer, pokušaćemo da preuzmemo ovu XKCD strip sliku (sa ekstenzijom .png) u naš radni direktorijum koristeći različite metode.

Tokom celog ovog tutorijala, koristićemo nekoliko Python paketa nezavisnih proizvođača. Instalirajte ih u zasebnom virtuelnom okruženju vašeg projekta.

Korišćenje urllib.request

Možete koristiti ugrađeni Python urllib.request modul za preuzimanje fajlova sa URL adrese. Ovaj modul dolazi sa funkcionalnošću za pravljenje HTTP zahteva i manipulaciju URL adresama. Pruža jednostavan način za interakciju sa web resursima, podržavajući zadatke poput preuzimanja podataka sa web stranica.

Hajde da preuzmemo XKCD Python strip koristeći urllib.request:

import urllib.request

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

Evo šta radimo ovde:

  • Uvozimo modul urllib.request.
  • Definišemo URL slike XKCD Python stripa.
  • Koristimo urllib.request.urlretrieve da preuzmemo sliku i sačuvamo je kao ‘xkcd_comic.png’ u trenutnom direktorijumu.

Ako pokrenete komandu ls na terminalu da biste videli sadržaj trenutnog direktorijuma, videćete fajl ‘xkcd_comic.png’:

Korišćenje biblioteke requests

Biblioteka Requests je izuzetno popularna i jedan od najčešće preuzimanih Python paketa. Omogućava vam da šaljete HTTP zahteve preko weba i preuzimate sadržaj.

Prvo instalirajte biblioteku requests:

pip install requests

Ako ste kreirali novu Python skriptu u istom direktorijumu, obrišite ‘xkcd_comic.png’ pre pokretanja ove skripte.

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)

Pogledajmo detaljnije šta smo uradili u ovom pristupu:

  • Uvozimo biblioteku requests.
  • Postavljamo URL slike XKCD Python stripa.
  • Šaljemo GET zahtev na URL koristeći requests.get.
  • Sačuvamo sadržaj odgovora (podatke o slici) kao ‘xkcd_comic.png’ u binarnom režimu pisanja.

Sada biste trebali da vidite preuzetu sliku kada pogledate sadržaj direktorijuma:

Korišćenje urllib3

Videli smo kako se koristi ugrađeni urllib.request. Međutim, možete koristiti i Python paket urllib3 treće strane.

Urllib3 je Python biblioteka za kreiranje HTTP zahteva i upravljanje vezama na pouzdaniji i efikasniji način od ugrađenog urllib modula. Pruža funkcije kao što su ponovno korišćenje konekcija, ponovni pokušaji zahteva i bezbednost u više niti, što ga čini jakim izborom za upravljanje HTTP komunikacijom u Python aplikacijama.

Instalirajte urllib3 koristeći pip:

pip install urllib3

Hajde sada da preuzmemo XKCD Python strip koristeći urllib biblioteku:

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)

Ovaj pristup izgleda malo komplikovanije od prethodnih koji koriste urllib.requests i biblioteku requests. Zato ćemo razložiti korake:

  • Počinjemo uvozom urllib3 modula koji omogućava funkcionalnost za pravljenje HTTP zahteva.
  • Zatim navodimo URL slike XKCD stripa.
  • Kreiramo instancu urllib3.PoolManager(). Ovaj objekat upravlja grupom veza i omogućava nam da šaljemo HTTP zahteve.
  • Zatim koristimo metodu http.request(‘GET’, url) da pošaljemo HTTP GET zahtev na dati URL. Ovaj zahtev preuzima sadržaj XKCD stripa.
  • Kada je zahtev uspešan, preuzimamo sadržaj (podatke slike) iz HTTP odgovora koristeći response.data.
  • Na kraju, zapisujemo podatke slike (preuzete iz odgovora) u fajl.

Kada pokrenete svoju Python skriptu, trebali biste da dobijete sledeći rezultat:

Korišćenje wget-a

Wget Python biblioteka pojednostavljuje preuzimanje fajlova sa URL adresa. Možete je koristiti za preuzimanje web resursa i posebno je korisna za automatizaciju zadataka preuzimanja.

Možete instalirati wget biblioteku koristeći pip, a zatim koristiti njene funkcije za preuzimanje fajlova sa URL adresa:

pip install wget

Ovaj isečak koristi wget modul za preuzimanje XKCD Python stripa i njegovo čuvanje kao ‘xkcd_comic.png’ u radnom direktorijumu:

import wget

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

Ovde:

  • Uvozimo wget modul.
  • Definišemo URL slike XKCD Python stripa.
  • Koristimo wget.download da preuzmemo sliku i sačuvamo je kao ‘xkcd_comic.png’ u trenutnom direktorijumu.

Kada preuzmete XKCD strip koristeći wget, trebalo bi da vidite sličan rezultat:

Korišćenje PyCURL

Ako ste koristili Linux ili Mac računar, verovatno ste se susreli sa cURL alatom komandne linije za preuzimanje fajlova sa weba.

PyCURL, Python interfejs za libcurl, je moćan alat za kreiranje HTTP zahteva. Pruža preciznu kontrolu nad zahtevima i možete ga koristiti za napredne slučajeve pri radu sa web resursima.

Instaliranje pycurl-a u vašem radnom okruženju može biti složen proces. Pokušajte da instalirate koristeći pip:

pip install pycurl

⚠ Ako naiđete na greške tokom ovog procesa, možete proveriti PyCURL vodič za instalaciju za savete za rešavanje problema.

Alternativno, ako imate cURL instaliran, možete instalirati Python veze za libcurl na sledeći način:

sudo apt install python3-pycurl

Napomena: Pre nego što instalirate Python vezu, morate imati instaliran cURL. Ako nemate cURL na vašem računaru, možete ga instalirati sa: apt install curl.

Preuzimanje fajlova pomoću PyCURL

Evo koda za preuzimanje XKCD stripa koristeći 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()

Hajde da razložimo veći isečak koda na manje delove za svaki korak:

Korak 1: Uvoz potrebnih modula

Prvo, uvozimo pycurl da bismo ga mogli koristiti za kreiranje HTTP zahteva. Zatim uvozimo BytesIO iz io modula da kreiramo buffer za čuvanje preuzetih podataka:

import pycurl
from io import BytesIO

Korak 2: Kreiranje Curl objekta i postavljanje URL-a

Navodimo URL XKCD Python stripa koji želimo da preuzmemo. Kreiramo Curl objekat, koji predstavlja HTTP zahtev. Zatim postavljamo URL za Curl objekat koristeći 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)

Korak 3: Kreiranje BytesIO objekta i postavljanje opcije WRITEDATA

Kreiramo BytesIO objekat za skladištenje preuzetih podataka i konfigurišemo Curl objekat da upiše podatke odgovora u naš buffer koristeći c.setopt(pycurl.WRITEDATA, buffer):

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

Korak 4: Izvršavanje zahteva

Izvršavamo HTTP zahtev koristeći c.perform() i preuzimamo podatke stripa:

# Perform the request
c.perform()

Korak 5: Provera HTTP status koda i čuvanje preuzetih podataka

Dobijamo HTTP status kod koristeći c.getinfo(pycurl.HTTP_CODE) da bismo bili sigurni da je zahtev bio uspešan (HTTP kod 200). Ako je HTTP status kod 200, zapisujemo podatke iz buffera u fajl slike:

# 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())

Korak 6: Zatvaranje Curl objekta

Na kraju, zatvaramo Curl objekat koristeći c.close() da oslobodimo resurse:

# Close the Curl object
c.close()

Kako preuzeti velike fajlove u manjim delovima

Do sada smo razmatrali različite načine za preuzimanje XKCD Python stripa – malog fajla sa slikom – u trenutni direktorijum.

Međutim, možda ćete želeti da preuzmete mnogo veće fajlove kao što su instalacioni programi za IDE i drugo. Prilikom preuzimanja tako velikih fajlova, korisno je preuzimati ih u manjim delovima i pratiti napredak preuzimanja. Za ovo možemo koristiti funkcionalnost biblioteke requests.

Hajde da koristimo requests za preuzimanje VS Code instalacionog programa u komadima veličine 1MB:

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.')

Ovde:

  • Postavljamo `chunk_size` da definišemo veličinu svakog komada (1MB u ovom primeru).
  • Zatim koristimo requests.get sa stream=True da preuzmemo sadržaj odgovora bez učitavanja celog fajla u memoriju odjednom.
  • Svaki deo sukcesivno čuvamo u fajl kako se preuzima.

Dok se preuzimanje odvija, videćete broj trenutno preuzetih bajtova/ukupan broj bajtova:

Nakon što se preuzimanje završi, treba da vidite poruku „Preuzimanje je završeno“:

A u direktorijumu biste trebali videti instalacioni program VS Code:

Zaključak

Nadam se da ste naučili nekoliko različitih načina za preuzimanje fajlova sa URL adresa koristeći Python. Pored ugrađenog urllib.request, razmotrili smo popularne Python pakete treće strane kao što su requests, urllib3, wget i PyCURL.

Kao programer, u svojim projektima sam najčešće koristio biblioteku requests za preuzimanje fajlova i rad sa web API-jevima uopšte. Međutim, i druge metode mogu biti korisne u zavisnosti od složenosti zadatka preuzimanja i nivoa detalja koji vam je potreban za HTTP zahteve. Srećno sa preuzimanjem!