Vil du downloade filer fra en URL ved hjælp af Python? Lad os lære de forskellige måder at gøre det på.
Når du arbejder på et Python-projekt, skal du muligvis downloade filer fra nettet – fra en bestemt URL.
Du kan downloade dem manuelt til dit arbejdsmiljø. Det er dog mere praktisk at downloade filer fra deres URL’er programmatisk i et Python-script.
I denne vejledning vil vi dække de forskellige måder at downloade filer fra nettet på med Python – ved at bruge både indbyggede og tredjeparts Python-pakker.
Indholdsfortegnelse
Sådan bruger du Python til at downloade filer fra URL
Hvis du er bekendt med Python, ville du være stødt på denne populære XKCD Python-tegneserie:
Python tegneserie | Kilde: XKCD
Som et eksempel vil vi prøve at downloade dette XKCD-tegneseriebillede (.png-udvidelse) PNG-billede til vores arbejdsmappe ved hjælp af forskellige metoder.
Gennem hele selvstudiet vil vi arbejde med flere tredjeparts Python-pakker. Installer dem alle i et dedikeret virtuelt miljø til dit projekt.
Brug af urllib.request
Du kan bruge Pythons indbyggede urllib.request modul til at downloade filer fra en URL. Dette indbyggede modul kommer med funktionalitet til at lave HTTP-anmodninger og håndtere URL’er. Det giver en enkel måde at interagere med webressourcer på og understøtter opgaver som at hente data fra websteder.
Lad os downloade XKCD Python-tegneserien fra dens URL ved hjælp af urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Her gør vi følgende:
- Importer urllib.request-modulet.
- Indstil URL’en til XKCD Python tegneseriebilledet.
- Brug urllib.request.urlretrieve til at downloade billedet og gemme det som ‘xkcd_comic.png’ i den aktuelle mappe.
Hvis du nu kører kommandoen ls på terminalen for at se indholdet af den aktuelle mappe, vil du se filen ‘xkcd_comic.png’:
Brug af anmodningsbiblioteket
Det Anmoder om bibliotek er en populær og en af de mest downloadede Python-pakker. Du kan sende HTTP-anmodninger over nettet og hente indhold.
Installer først anmodningsbiblioteket:
pip install requests
Hvis du har oprettet et nyt Python-script i samme mappe, skal du slette ‘xkcd_comic.png’, før du kører det aktuelle script.
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)
Lad os nedbryde, hvad vi har gjort i denne tilgang:
- Importer anmodningsbiblioteket.
- Indstil URL’en til XKCD Python tegneseriebilledet.
- Send en GET-anmodning til URL’en ved hjælp af requests.get.
- Gem indholdet af svaret (billeddataene) som ‘xkcd_comic.png’ i binær skrivetilstand.
Og du bør se det downloadede billede, når du udskriver indholdet af mappen:
Brug af urllib3
Vi har set, hvordan man bruger den indbyggede urllib.request. Men du kan også bruge tredjeparts Python-pakken urllib3.
Urllib3 er et Python-bibliotek til at lave HTTP-anmodninger og administrere forbindelser på en mere pålidelig og effektiv måde end det indbyggede urllib-modul. Det giver funktioner som forbindelsespooling, genforsøg på anmodning og trådsikkerhed, hvilket gør det til et robust valg til håndtering af HTTP-kommunikation i Python-applikationer.
Installer urllib3 ved hjælp af pip:
pip install urllib3
Lad os nu downloade XKCD Python-tegneserien ved hjælp af urllib-biblioteket:
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)
Denne tilgang ser ud til at være mere involveret end de tidligere tilgange, der bruger urllib.requests og anmodningsbiblioteket. Så lad os nedbryde de forskellige trin:
- Vi begynder med at importere urllib3-modulet, som giver funktionalitet til at lave HTTP-anmodninger.
- Derefter angiver vi URL’en til XKCD-tegneseriebilledet.
- Dernæst opretter vi en instans af urllib3.PoolManager(). Dette objekt administrerer forbindelsespuljen og giver os mulighed for at lave HTTP-anmodninger.
- Vi bruger derefter metoden http.request(‘GET’, url) til at sende en HTTP GET-anmodning til den angivne URL. Denne anmodning henter indholdet af XKCD-tegneserien.
- Når anmodningen er vellykket, henter vi indholdet (billeddata) fra HTTP-svaret ved hjælp af response.data.
- Til sidst skriver vi billeddataene (hentet fra svaret) til filen.
Når du kører dit Python-script, bør du få følgende output:
Brug af wget
Det wget Python-bibliotek forenkler fildownloads fra URL’er. Du kan bruge det til at hente webressourcer og er især praktisk til automatisering af downloadopgaver.
Du kan installere wget-biblioteket ved hjælp af pip og derefter bruge dets funktioner til at downloade filer fra URL’er:
pip install wget
Dette uddrag bruger wget-modulet til at downloade XKCD Python-tegneserien og gemme den som ‘xkcd_comic.png’ i arbejdsmappen:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Her:
- Vi importerer wget-modulet.
- Indstil URL’en til XKCD Python tegneseriebilledet.
- Brug wget.download til at downloade billedet og gemme det som ‘xkcd_comic.png’ i den aktuelle mappe.
Når du downloader XKCD-tegneserien ved hjælp af wget, bør du se et lignende output:
Bruger PyCURL
Hvis du har brugt en Linux-maskine eller en Mac, er du muligvis bekendt med kommandolinjeværktøjet cURL til at downloade filer fra nettet.
PyCURL, en Python-grænseflade til libcurl, er et kraftfuldt værktøj til at lave HTTP-anmodninger. Det giver finmasket kontrol over anmodninger, og du kan bruge det til avancerede brugssager, når du håndterer webressourcer.
Det kan være komplekst at installere pycurl i dit arbejdsmiljø. Prøv at installere ved hjælp af pip:
pip install pycurl
⚠️ Hvis du får fejl under processen, kan du tjekke PyCURL installationsvejledning for tip til fejlfinding.
Alternativt, hvis du har cURL installeret, kan du installere Python-bindingerne til libcurl sådan:
sudo apt install python3-pycurl
Bemærk: Før du installerer Python-bindingen, skal du have cURL installeret. Hvis du ikke har cURL installeret på din maskine, kan du gøre det sådan: apt install curl.
Downloader filer med PyCURL
Her er koden til at downloade XKCD Comic ved hjælp af 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()
Lad os opdele det større uddrag i mindre kodestykker for hvert trin:
Trin 1: Importer de nødvendige moduler
Først importerer vi pycurl, så vi kan bruge det til at lave HTTP-anmodninger. Så importerer vi BytesIO fra io modul for at oprette en buffer til lagring af de downloadede data:
import pycurl from io import BytesIO
Trin 2: Opret et Curl-objekt og indstil URL’en
Vi angiver URL’en på XKCD Python-tegneserien, som vi vil downloade. Og opret et krølleobjekt, som repræsenterer HTTP-anmodningen. Derefter indstiller vi URL’en til Curl-objektet ved hjælp af 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)
Trin 3: Opret et BytesIO-objekt og indstil indstillingen WRITEDATA
Vi opretter et BytesIO-objekt til at gemme de downloadede data og konfigurerer Curl-objektet til at skrive svardataene til vores buffer ved hjælp af c.setopt(pycurl.WRITEDATA, buffer):
# Create a BytesIO object to store the downloaded data buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Trin 4: Udfør anmodningen
Udfør HTTP-anmodningen ved hjælp af c.perform() og hent de komiske billeddata:
# Perform the request c.perform()
Trin 5: Tjek HTTP-statuskoden og gem de downloadede data
Vi får HTTP-statuskoden ved hjælp af c.getinfo(pycurl.HTTP_CODE) for at sikre, at anmodningen var vellykket (HTTP-kode 200). Hvis HTTP-statuskoden er 200, skriver vi dataene fra bufferen til billedfilen:
# 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())
Trin 6: Luk krølleobjektet
Til sidst lukker vi curl-objektet ved hjælp af c.close() for at rydde op i ressourcer:
# Close the Curl object c.close()
Sådan downloader du store filer i mindre bidder
Indtil videre har vi set forskellige måder at downloade XKCD Python-tegneserien – en lille billedfil – til den aktuelle mappe.
Men du vil måske også downloade meget større filer såsom installationsprogrammer til IDE’er og mere. Når du downloader så store filer, er det nyttigt at downloade dem i mindre bidder og også spore fremskridtene, efterhånden som downloadingen skrider frem. Vi kan bruge anmodningsbibliotekets funktionalitet til dette.
Lad os bruge anmodninger til at downloade VS kode installationsprogram i bidder af størrelse 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.')
Her:
- Vi indstiller `chunk_size` for at bestemme størrelsen af hver chunk (1 MB i dette eksempel).
- Så bruger vi requests.get med stream=True til at streame svarindholdet uden at indlæse hele filen i hukommelsen på én gang.
- Vi gemmer hver del til filen sekventielt, efterhånden som den downloades.
Efterhånden som downloadingen skrider frem, vil du se antallet af bytes, der i øjeblikket er downloadet/det samlede antal bytes:
Når overførslen er fuldført, skulle du se meddelelsen ‘Download færdig’:
Og du bør se VS Code-installationsprogrammet i din mappe:
Afslutter
Jeg håber, du har lært et par forskellige måder at downloade filer fra URL’er ved hjælp af Python. Ud over den indbyggede urllib.request har vi dækket populære tredjeparts Python-pakker såsom anmodninger, urllib3, wget og PuCURL.
Som udvikler har jeg brugt anmodningsbiblioteket mere end andre i mine projekter til at downloade filer og arbejde med web-API’er generelt. Men de andre metoder kan også være nyttige afhængigt af kompleksiteten af downloadopgaven og det granularitetsniveau, du har brug for på HTTP-anmodningerne. God download!