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

Doriți să descărcați fișiere de la o adresă URL folosind Python? Să învățăm diferitele moduri de a face acest lucru.

Când lucrați la un proiect Python, poate fi necesar să descărcați fișiere de pe web, de la o anumită adresă URL.

Le puteți descărca manual în mediul dvs. de lucru. Cu toate acestea, este mai convenabil să descărcați fișiere de la adresele URL în mod programatic într-un script Python.

În acest tutorial, vom acoperi diferitele modalități de a descărca fișiere de pe web cu Python, folosind ambele pachete Python încorporate și terțe.

Cum să utilizați Python pentru a descărca fișiere de pe URL

Dacă sunteți familiarizat cu Python, ați fi întâlnit această benzi desenate populare XKCD Python:

benzi desenate Python | Sursă: XKCD

De exemplu, vom încerca să descarcăm această imagine de benzi desenate XKCD (extensie .png) imagine PNG în directorul nostru de lucru folosind diferite metode.

Pe parcursul tutorialului, vom lucra cu mai multe pachete Python terțe. Instalați-le pe toate într-un mediu virtual dedicat pentru proiectul dvs.

Folosind urllib.request

Puteți utiliza sistemul încorporat de Python urllib.cerere modul pentru a descărca fișiere de la o adresă URL. Acest modul încorporat vine cu funcționalități pentru efectuarea de solicitări HTTP și gestionarea adreselor URL. Oferă o modalitate simplă de a interacționa cu resursele web, susținând sarcini precum preluarea datelor de pe site-uri web.

Să descarcăm benzile desenate XKCD Python de la adresa sa URL folosind urllib.request:

import urllib.request

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

Aici facem următoarele:

  • Importați modulul urllib.request.
  • Setați adresa URL a imaginii de benzi desenate XKCD Python.
  • Utilizați urllib.request.urlretrieve pentru a descărca imaginea și salvați-o ca „xkcd_comic.png” în directorul curent.

Dacă rulați acum comanda ls la terminal pentru a vizualiza conținutul directorului curent, veți vedea fișierul „xkcd_comic.png”:

Utilizarea bibliotecii de solicitări

The Cere biblioteca este un pachet popular și unul dintre cele mai descărcate pachete Python. Puteți trimite solicitări HTTP pe web și puteți prelua conținut.

  Cum să deschideți direct o etichetă în Gmail Web

Mai întâi, instalați biblioteca de solicitări:

pip install requests

Dacă ați creat un nou script Python în același director, ștergeți „xkcd_comic.png” înainte de a rula 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ă detaliem ceea ce am făcut în această abordare:

  • Importați biblioteca de solicitări.
  • Setați adresa URL a imaginii de benzi desenate XKCD Python.
  • Trimiteți o solicitare GET la adresa URL folosind requests.get.
  • Salvați conținutul răspunsului (datele imaginii) ca „xkcd_comic.png” în modul de scriere binar.

Și ar trebui să vedeți imaginea descărcată când imprimați conținutul directorului:

Folosind urllib3

Am văzut cum să folosim urllib.request încorporat. Dar puteți folosi și pachetul Python terț urllib3.

Urllib3 este o bibliotecă Python pentru a face solicitări HTTP și a gestiona conexiunile într-un mod mai fiabil și mai eficient decât modulul urllib încorporat. Oferă funcții precum pooling de conexiuni, reîncercări de solicitare și siguranță fir, ceea ce îl face o alegere robustă pentru gestionarea comunicării HTTP în aplicațiile Python.

Instalați urllib3 folosind pip:

pip install urllib3

Acum să descarcăm benzile desenate XKCD Python folosind biblioteca 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)

Această abordare pare să fie mai implicată decât abordările anterioare folosind urllib.requests și biblioteca de solicitări. Deci, să dezvăluim diferiții pași:

  • Începem prin a importa modulul urllib3, care oferă funcționalitate pentru efectuarea de solicitări HTTP.
  • Apoi specificăm adresa URL a imaginii de benzi desenate XKCD.
  • Apoi, creăm o instanță a urllib3.PoolManager(). Acest obiect gestionează pool-ul de conexiuni și ne permite să facem solicitări HTTP.
  • Apoi 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 are succes, recuperăm conținutul (date de imagine) din răspunsul HTTP folosind response.data.
  • În cele din urmă, scriem datele imaginii (recuperate din răspuns) în fișier.

Când rulați scriptul Python, ar trebui să obțineți următorul rezultat:

Folosind wget

The wget biblioteca Python simplifică descărcările de fișiere de la URL-uri. Îl puteți folosi pentru a prelua resurse web și este deosebit de util pentru automatizarea sarcinilor de descărcare.

Puteți instala biblioteca wget folosind pip și apoi utilizați funcțiile acesteia pentru a descărca fișiere de la URL-uri:

pip install wget

Acest fragment folosește modulul wget pentru a descărca benzile desenate XKCD Python și pentru 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')

Aici:

  • Importăm modulul wget.
  • Setați adresa URL a imaginii de benzi desenate XKCD Python.
  • Utilizați wget.download pentru a descărca imaginea și salvați-o ca „xkcd_comic.png” în directorul curent.
  Cum să activați sunetul spațial pentru AirPods pe iPhone sau iPad

Când descărcați benzile desenate XKCD folosind wget, ar trebui să vedeți o ieșire similară:

Folosind PyCURL

Dacă ați folosit o mașină Linux sau un Mac, este posibil să fiți familiarizat cu instrumentul de linie de comandă cURL pentru a descărca fișiere de pe web.

PyCURL, o interfață Python pentru libcurl, este un instrument puternic pentru a face cereri HTTP. Oferă un control fin asupra solicitărilor și îl puteți folosi pentru cazuri avansate de utilizare atunci când gestionați resurse web.

Instalarea pycurl în mediul dvs. de lucru poate fi complexă. Încercați să instalați folosind pip:

pip install pycurl

⚠️ Dacă primiți erori în timpul procesului, puteți verifica Ghid de instalare PyCURL pentru sfaturi de depanare.

Alternativ, dacă ați instalat cURL, puteți instala legăturile Python la libcurl astfel:

sudo apt install python3-pycurl

Notă: Înainte de a instala legarea Python, trebuie să aveți instalat cURL. Dacă nu aveți cURL instalat pe mașina dvs., puteți proceda astfel: apt install curl.

Descărcarea fișierelor cu PyCURL

Iată codul pentru a descărca XKCD Comic folosind 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()

Să împărțim fragmentul mai mare în fragmente de cod mai mici pentru fiecare pas:

Pasul 1: importați modulele necesare

În primul rând, importăm pycurl, astfel încât să îl putem folosi pentru a face solicitări HTTP. Apoi importăm BytesIO din modul io pentru a crea un buffer pentru stocarea datelor descărcate:

import pycurl
from io import BytesIO

Pasul 2: Creați un obiect Curl și setați adresa URL

Specificăm adresa URL a benzii desenate XKCD Python pe care dorim să o descărcam. Și creați un obiect curl, care reprezintă cererea HTTP. Apoi, setăm adresa URL pentru obiectul Curl folosind 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)

Pasul 3: Creați un obiect BytesIO și setați opțiunea WRITEDATA

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

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

Pasul 4: Efectuați Solicitarea

Executați solicitarea HTTP folosind c.perform() și preluați datele imaginii comice:

# Perform the request
c.perform()

Pasul 5: Verificați codul de stare HTTP și salvați 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 HTTP este 200, scriem datele din buffer în fișierul imagine:

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

Pasul 6: Închideți obiectul Curl

În cele din urmă, închidem obiectul curl folosind c.close() pentru a curăța resurse:

# Close the Curl object
c.close()

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

Până acum, am văzut diferite moduri de a descărca benzile desenate XKCD Python — un fișier imagine mic — în directorul curent.

  Cum se selectează dispozitivul de pornire pe UEFI BIOS

Cu toate acestea, este posibil să doriți și să descărcați fișiere mult mai mari, cum ar fi programe de instalare pentru IDE-uri și altele. Când descărcați fișiere atât de mari, este util să le descărcați în bucăți mai mici și, de asemenea, să urmăriți progresul pe măsură ce descărcarea continuă. Putem folosi funcționalitatea bibliotecii de solicitări pentru aceasta.

Să folosim solicitările pentru a descărca Cod VS instalator în bucăți de dimensiunea de 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.')

Aici:

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

Pe măsură ce descărcarea continuă, veți vedea numărul de octeți descărcați în prezent/numărul total de octeți:

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

Și ar trebui să vedeți programul de instalare VS Code în directorul dvs.:

Încheierea

Sper că ați învățat câteva moduri diferite de a descărca fișiere din adrese URL folosind Python. Pe lângă urllib.request încorporat, am acoperit pachete populare Python terță parte, cum ar fi requests, urllib3, wget și PuCURL.

În calitate de dezvoltator, am folosit biblioteca de solicitări mai mult decât altele în proiectele mele pentru a descărca fișiere și a lucra cu API-uri web în general. Dar și celelalte metode ar putea fi utile în funcție de complexitatea sarcinii de descărcare și de nivelul de granularitate de care aveți nevoie pentru cererile HTTP. Descărcare fericită!