5 moduri de a descărca fișiere de la o adresă URL folosind Python

Vrei să descarci fișiere dintr-o adresă web folosind Python? Să explorăm diferitele metode prin care poți face acest lucru.

În timpul dezvoltării unui proiect Python, adesea apare necesitatea de a descărca fișiere de pe internet, de la o anumită adresă URL.

Poți alege să le descarci manual în directorul tău de lucru. Însă, este mult mai eficient să automatizezi acest proces printr-un script Python care să descarce fișierele direct de la adresele URL.

În acest ghid, vom analiza diversele modalități de a descărca fișiere de pe internet cu Python, utilizând atât modulele Python încorporate, cât și biblioteci externe.

Cum să folosești Python pentru a descărca fișiere de pe URL

Dacă ești familiarizat cu Python, probabil ai întâlnit celebra banda desenată XKCD despre Python:

Bandă desenată Python | Sursa: XKCD

Vom folosi ca exemplu această imagine de bandă desenată XKCD (format .png), pe care o vom descărca în directorul nostru de lucru prin diverse metode.

Pe parcursul acestui tutorial, vom lucra cu mai multe biblioteci externe Python. Pentru o bună organizare, este recomandat să le instalezi într-un mediu virtual dedicat proiectului tău.

Folosind urllib.request

Poți folosi modulul încorporat Python urllib.request pentru a descărca fișiere de la o adresă web. Acest modul oferă funcționalități pentru a efectua solicitări HTTP și a gestiona adrese URL. Este o modalitate simplă de a interacționa cu resursele web, facilitând sarcini precum obținerea datelor de pe site-uri.

Să descărcăm banda desenată XKCD despre Python folosind `urllib.request`:

import urllib.request

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

În acest exemplu, facem următoarele:

  • Importăm modulul `urllib.request`.
  • Definim adresa URL a imaginii cu banda desenată XKCD despre Python.
  • Utilizăm funcția `urllib.request.urlretrieve` pentru a descărca imaginea și a o salva cu numele „xkcd_comic.png” în directorul curent.

Dacă execuți comanda `ls` în terminal pentru a vedea conținutul directorului curent, vei observa fișierul „xkcd_comic.png”:

Utilizarea bibliotecii Requests

Biblioteca Requests este un pachet popular, fiind una dintre cele mai descărcate biblioteci Python. Acesta te ajută să trimiți solicitări HTTP către servere web și să obții conținutul dorit.

Mai întâi, trebuie să instalezi biblioteca Requests:

pip install requests

Dacă ai creat un nou script Python în același director, șterge fișierul „xkcd_comic.png” înainte de a executa scriptul curent.

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)

Să analizăm pașii din această abordare:

  • Importăm biblioteca Requests.
  • Definim adresa URL a imaginii cu banda desenată XKCD despre Python.
  • Trimitem o solicitare GET la adresa URL folosind `requests.get`.
  • Salvam conținutul răspunsului (datele imaginii) ca „xkcd_comic.png” în modul de scriere binar.

După ce rulezi scriptul, ar trebui să vezi imaginea descărcată în directorul de lucru:

Folosind urllib3

Am văzut cum să folosim modulul încorporat `urllib.request`. Însă, poți utiliza și biblioteca externă Python `urllib3`.

Urllib3 este o bibliotecă Python care permite efectuarea de solicitări HTTP și gestionarea conexiunilor într-un mod mai robust și eficient decât modulul `urllib` încorporat. Oferă funcții precum pooling de conexiuni, reîncercări de solicitare și siguranță fir, făcând-o o alegere potrivită pentru gestionarea comunicației HTTP în aplicațiile Python.

Instalează `urllib3` folosind pip:

pip install urllib3

Acum, să descărcăm banda desenată XKCD despre Python folosind `urllib3`:

import urllib3

# URL-ul imaginii cu banda desenată XKCD
url="https://imgs.xkcd.com/comics/python.png"

# Creăm o instanță PoolManager
http = urllib3.PoolManager()

# Trimitem o solicitare HTTP GET la adresa URL
response = http.request('GET', url)

# Obținem conținutul (datele imaginii)
image_data = response.data

# Specificăm numele fișierului în care vom salva imaginea
file_name="xkcd_comic.png"

# Salvăm datele imaginii în fișier
with open(file_name, 'wb') as file:
	file.write(image_data)

Această abordare pare mai complexă decât cele anterioare, care foloseau `urllib.requests` și biblioteca Requests. Să analizăm fiecare pas:

  • Începem prin a importa modulul `urllib3`, care ne oferă funcționalități pentru efectuarea de solicitări HTTP.
  • Specificăm adresa URL a imaginii cu banda desenată XKCD.
  • Creăm o instanță a clasei `urllib3.PoolManager()`. Acest obiect gestionează pool-ul de conexiuni și ne permite să facem solicitări HTTP.
  • Folosim metoda `http.request(‘GET’, url)` pentru a trimite o solicitare HTTP GET la adresa URL specificată. Această solicitare preia conținutul benzii desenate XKCD.
  • Odată ce solicitarea a reușit, obținem conținutul (datele imaginii) din răspunsul HTTP folosind `response.data`.
  • În cele din urmă, scriem datele imaginii (obținute din răspuns) în fișier.

Când rulezi scriptul Python, ar trebui să obții următorul rezultat:

Folosind wget

Biblioteca Python wget simplifică procesul de descărcare a fișierelor de la adrese URL. O poți folosi pentru a prelua resurse web, fiind extrem de utilă pentru automatizarea sarcinilor de descărcare.

Poți instala biblioteca `wget` folosind pip, apoi utilizezi funcțiile sale pentru a descărca fișiere de la adrese URL:

pip install wget

Acest fragment utilizează modulul `wget` pentru a descărca banda desenată XKCD despre Python și a o salva ca „xkcd_comic.png” în directorul de lucru:

import wget

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

În acest exemplu:

  • Importăm modulul `wget`.
  • Setăm adresa URL a imaginii cu banda desenată XKCD despre Python.
  • Utilizăm `wget.download` pentru a descărca imaginea și a o salva cu numele „xkcd_comic.png” în directorul curent.

Când descarci banda desenată XKCD folosind `wget`, ar trebui să vezi un rezultat similar:

Folosind PyCURL

Dacă ai utilizat un sistem Linux sau Mac, probabil ești familiarizat cu instrumentul de linie de comandă `cURL` pentru descărcarea fișierelor de pe web.

PyCURL, o interfață Python pentru libcurl, este un instrument puternic pentru a efectua solicitări HTTP. Oferă un control detaliat asupra solicitărilor și poate fi folosit pentru cazuri avansate de utilizare în gestionarea resurselor web.

Instalarea `pycurl` în mediul tău de lucru poate fi mai complexă. Poți încerca să o instalezi folosind pip:

pip install pycurl

⚠️ Dacă primești erori în timpul procesului, poți consulta Ghidul de instalare PyCURL pentru sfaturi de depanare.

Alternativ, dacă ai instalat `cURL`, poți instala legăturile Python la libcurl astfel:

sudo apt install python3-pycurl

Notă: Înainte de a instala legăturile Python, trebuie să ai instalat `cURL`. Dacă nu ai `cURL` instalat pe sistem, poți face acest lucru: `apt install curl`.

Descărcarea fișierelor cu PyCURL

Iată codul pentru a descărca banda desenată XKCD folosind PyCURL:

import pycurl
from io import BytesIO

# URL-ul imaginii cu banda desenată XKCD despre Python
url="https://imgs.xkcd.com/comics/python.png"

# Creăm un obiect Curl
c = pycurl.Curl()

# Setăm URL-ul
c.setopt(pycurl.URL, url)

# Creăm un obiect BytesIO pentru a stoca datele descărcate
buffer = BytesIO()
c.setopt(pycurl.WRITEDATA, buffer)

# Efectuăm solicitarea
c.perform()

# Verificăm dacă solicitarea a avut succes (codul de stare HTTP 200)
http_code = c.getinfo(pycurl.HTTP_CODE)
if http_code == 200:
    # Salvăm datele descărcate într-un fișier
    with open('xkcd_comic.png', 'wb') as f:
        f.write(buffer.getvalue())

# Închidem obiectul Curl
c.close()

Să împărțim fragmentul în părți mai mici pentru a analiza fiecare pas:

Pasul 1: Importăm modulele necesare

În primul rând, importăm `pycurl`, pentru a putea efectua solicitări HTTP. Apoi importăm `BytesIO` din modulul io pentru a crea un buffer pentru stocarea datelor descărcate:

import pycurl
from io import BytesIO

Pasul 2: Creăm un obiect Curl și setăm adresa URL

Specificăm adresa URL a benzii desenate XKCD despre Python pe care vrem să o descărcăm. Apoi creăm un obiect `curl`, care reprezintă cererea HTTP. După care, setăm adresa URL pentru obiectul `Curl` folosind `c.setopt(pycurl.URL, url)`:

# URL-ul imaginii cu banda desenată XKCD despre Python
url="https://imgs.xkcd.com/comics/python.png"

# Creăm un obiect Curl
c = pycurl.Curl()

# Setăm URL-ul
c.setopt(pycurl.URL, url)

Pasul 3: Creăm un obiect BytesIO și setăm opțiunea WRITEDATA

Creăm un obiect `BytesIO` pentru a stoca datele descărcate și configurăm obiectul `Curl` pentru a scrie datele răspunsului în buffer folosind `c.setopt(pycurl.WRITEDATA, buffer)`:

# Creăm un obiect BytesIO pentru a stoca datele descărcate
buffer = BytesIO()
c.setopt(pycurl.WRITEDATA, buffer)

Pasul 4: Efectuăm Solicitarea

Executăm solicitarea HTTP folosind `c.perform()` și obținem datele imaginii:

# Efectuăm solicitarea
c.perform()

Pasul 5: Verificăm codul de stare HTTP și salvăm datele descărcate

Obținem codul de stare HTTP folosind `c.getinfo(pycurl.HTTP_CODE)` pentru a ne asigura că solicitarea a avut succes (codul HTTP 200). Dacă codul de stare este 200, scriem datele din buffer în fișierul imagine:

# Verificăm dacă solicitarea a avut succes (codul de stare HTTP 200)
http_code = c.getinfo(pycurl.HTTP_CODE)
if http_code == 200:
    # Salvăm datele descărcate într-un fișier
    with open('xkcd_comic.png', 'wb') as f:
        f.write(buffer.getvalue())

Pasul 6: Închidem obiectul Curl

În cele din urmă, închidem obiectul `curl` folosind `c.close()` pentru a elibera resursele:

# Închidem obiectul Curl
c.close()

Cum să descarci fișiere mari în bucăți mai mici

Până acum, am văzut diverse metode pentru a descărca banda desenată XKCD despre Python, un fișier imagine de dimensiuni mici, în directorul curent.

Însă, este posibil să trebuiască să descarci și fișiere mult mai mari, cum ar fi instalatoare pentru IDE-uri și altele. În cazul acestor fișiere mari, este util să le descarci în bucăți mai mici și să monitorizezi progresul descărcării. Pentru aceasta, vom folosi funcționalitățile bibliotecii Requests.

Să folosim Requests pentru a descărca programul de instalare al VS Code în bucăți de 1 MB:

import requests

# URL-ul fișierului EXE de instalare al Visual Studio Code
url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user"

# Dimensiunea unei bucăți pentru descărcare
chunk_size = 1024 * 1024  # Bucăți de 1 MB

response = requests.get(url, stream=True)

# Determinăm dimensiunea totală a fișierului din header-ul Content-Length
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()  # Obținem dimensiunea curentă a fișierului
            print(f'Descărcare... {file_size}/{total_size} bytes', end='\r')

print('Descărcare finalizată.')

În acest exemplu:

  • Setăm `chunk_size` pentru a specifica dimensiunea fiecărei bucăți (1 MB în acest caz).
  • Utilizăm `requests.get` cu `stream=True` pentru a transmite conținutul răspunsului fără a încărca întregul fișier în memorie.
  • Salvam fiecare bucată în fișier în mod secvențial pe măsură ce este descărcată.

Pe măsură ce descărcarea progresează, vei vedea numărul de octeți descărcați în prezent și dimensiunea totală a fișierului:

După ce descărcarea este completă, ar trebui să vezi mesajul „Descărcare finalizată”:

Și ar trebui să vezi programul de instalare VS Code în directorul tău:

Încheierea

Sper că ai învățat câteva metode diferite de a descărca fișiere de la adrese URL folosind Python. Pe lângă modulul încorporat `urllib.request`, am analizat biblioteci externe populare, precum `requests`, `urllib3`, `wget` și `PuCURL`.

Ca dezvoltator, am folosit biblioteca Requests mai des decât celelalte în proiectele mele pentru descărcarea de fișiere și lucrul cu API-uri web în general. Însă, și celelalte metode ar putea fi utile în funcție de complexitatea sarcinii de descărcare și de nivelul de granularitate necesar pentru solicitările HTTP. Spor la descărcări!