Ulike metoder for å laste ned filer fra en URL med Python
Ønsker du å hente filer fra en spesifikk URL ved hjelp av Python? La oss utforske de ulike tilnærmingene du kan bruke for å oppnå dette.
Når du jobber med et Python-prosjekt, kan behovet for å laste ned filer fra nettet oppstå. Dette kan være filer som ligger bak en bestemt URL.
Selv om du kan laste ned disse filene manuelt til datamaskinen din, er det mer effektivt å automatisere nedlastingsprosessen via et Python-skript.
I denne veiledningen vil vi se nærmere på de ulike metodene for å laste ned filer fra nettet med Python. Vi vil utforske bruken av både innebygde Python-moduler og eksterne pakker.
Hvordan bruke Python for å laste ned filer fra URL
Hvis du har erfaring med Python, er du kanskje kjent med den populære XKCD-tegneserien om Python:
Python tegneserie | Kilde: XKCD
Som et praktisk eksempel, vil vi prøve å laste ned denne XKCD-tegneserien (en .png-fil) til din arbeidsmappe ved hjelp av forskjellige metoder.
Gjennom denne veiledningen vil vi jobbe med flere eksterne Python-pakker. Det anbefales å installere alle disse pakkene i et dedikert virtuelt miljø for prosjektet ditt.
Bruk av urllib.request
Du kan dra nytte av Pythons innebygde modul urllib.request for å laste ned filer fra en URL. Denne modulen gir funksjonalitet for å opprette HTTP-forespørsler og håndtere URL-er. Det gir en enkel måte å samhandle med nettressurser og støtter oppgaver som å hente data fra nettsider.
La oss laste ned XKCD Python-tegneserien fra den gitte URL-en ved å bruke urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Dette kodesnutten gjør følgende:
- Importerer
urllib.request
-modulen. - Definerer URL-en til XKCD Python-tegneseriebildet.
- Bruker
urllib.request.urlretrieve
for å laste ned bildet og lagre det somxkcd_comic.png
i gjeldende mappe.
Hvis du nå kjører kommandoen ls
i terminalen for å se innholdet i den gjeldende mappen, vil du se filen xkcd_comic.png
:
Bruk av «requests»-biblioteket
Requests-biblioteket er en populær og mye brukt Python-pakke. Den gjør det mulig å sende HTTP-forespørsler over nettet og hente innhold.
Først, installer requests-biblioteket:
pip install requests
Dersom du har opprettet et nytt Python-skript i samme mappe, slett xkcd_comic.png
før du kjører det nye skriptet.
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)
La oss analysere hva vi gjorde i denne tilnærmingen:
- Importerer requests-biblioteket.
- Definerer URL-en til XKCD Python-tegneseriebildet.
- Sender en GET-forespørsel til URL-en ved hjelp av
requests.get
. - Lagrer innholdet i responsen (bildedataene) som
xkcd_comic.png
i binær skrivemodus.
Du skal nå se det nedlastede bildet når du sjekker innholdet i mappen:
Bruk av urllib3
Vi har sett hvordan man kan bruke den innebygde modulen urllib.request. Man kan også bruke den eksterne Python-pakken urllib3.
Urllib3 er et Python-bibliotek for å lage HTTP-forespørsler og administrere tilkoblinger på en mer pålitelig og effektiv måte enn den innebygde urllib-modulen. Den tilbyr funksjoner som tilkoblingspooling, gjenbruk av forespørsler og trådsikkerhet, noe som gjør den til et solid valg for å håndtere HTTP-kommunikasjon i Python-applikasjoner.
Installer urllib3 ved hjelp av pip:
pip install urllib3
La oss nå laste ned XKCD Python-tegneserien ved hjelp av urllib3-biblioteket:
import urllib3 url="https://imgs.xkcd.com/comics/python.png" http = urllib3.PoolManager() response = http.request('GET', url) image_data = response.data file_name="xkcd_comic.png" with open(file_name, 'wb') as file: file.write(image_data)
Denne tilnærmingen kan virke mer omfattende enn de tidligere, som brukte urllib.request og requests-biblioteket. La oss derfor bryte ned de forskjellige trinnene:
- Vi starter med å importere urllib3-modulen som gir oss funksjonalitet for å lage HTTP-forespørsler.
- Deretter spesifiserer vi URL-en til XKCD-tegneserien.
- Vi lager så en instans av
urllib3.PoolManager()
. Dette objektet håndterer tilkoblingspoolen og lar oss opprette HTTP-forespørsler. - Vi bruker metoden
http.request('GET', url)
for å sende en HTTP GET-forespørsel til den spesifiserte URL-en. Denne forespørselen henter innholdet i XKCD-tegneserien. - Når forespørselen er vellykket, henter vi innholdet (bildedata) fra HTTP-svaret ved å bruke
response.data
. - Til slutt skriver vi bildedataene (hentet fra svaret) til filen.
Når du kjører Python-skriptet, bør du få følgende resultat:
Bruk av wget
Wget Python-biblioteket forenkler nedlasting av filer fra URL-er. Du kan bruke den til å hente nettressurser, og den er spesielt nyttig for å automatisere nedlastingsoppgaver.
Du kan installere wget-biblioteket ved hjelp av pip og deretter bruke funksjonene til å laste ned filer fra URL-er:
pip install wget
Denne kodebiten bruker wget-modulen for å laste ned XKCD Python-tegneserien og lagre den som xkcd_comic.png
i arbeidsmappen:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Her:
- Importerer vi wget-modulen.
- Definerer URL-en til XKCD Python-tegneseriebildet.
- Bruker
wget.download
for å laste ned bildet og lagre det somxkcd_comic.png
i gjeldende mappe.
Når du laster ned XKCD-tegneserien ved hjelp av wget, bør du se et lignende resultat:
Bruk av PyCURL
Hvis du har jobbet med en Linux-maskin eller Mac, er du kanskje kjent med kommandolinjeverktøyet cURL for å laste ned filer fra nettet.
PyCURL, et Python-grensesnitt til libcurl, er et kraftig verktøy for å lage HTTP-forespørsler. Den gir finkornet kontroll over forespørsler, og du kan bruke den til avanserte brukstilfeller når du jobber med nettressurser.
Installering av PyCURL i arbeidsmiljøet ditt kan være litt komplisert. Prøv å installere med pip:
pip install pycurl
⚠️ Hvis du opplever feil i løpet av prosessen, kan du sjekke PyCURL sin installasjonsveiledning for feilsøkingstips.
Alternativt, dersom du har installert cURL, kan du installere Python-bindingene til libcurl slik:
sudo apt install python3-pycurl
Merk: Før du installerer Python-bindingen må du ha cURL installert. Hvis du ikke har cURL installert på maskinen din, kan du gjøre det slik: apt install curl
.
Nedlasting av filer med PyCURL
Her er koden for å laste ned XKCD Comic med PyCURL:
import pycurl from io import BytesIO url="https://imgs.xkcd.com/comics/python.png" c = pycurl.Curl() c.setopt(pycurl.URL, url) buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer) c.perform() http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue()) c.close()
La oss dele opp den større kodebiten i mindre kodebiter for hvert trinn:
Trinn 1: Importer de nødvendige modulene
Først importerer vi pycurl
, slik at vi kan bruke den til å lage HTTP-forespørsler. Deretter importerer vi BytesIO
fra io-modulen for å lage en buffer for å lagre nedlastede data:
import pycurl from io import BytesIO
Trinn 2: Opprett et Curl-objekt og angi URL-en
Vi spesifiserer URL-en til XKCD Python-tegneserien som vi ønsker å laste ned. Deretter oppretter vi et Curl-objekt som representerer HTTP-forespørselen. Så setter vi URL-en for Curl-objektet ved hjelp av c.setopt(pycurl.URL, url)
:
url="https://imgs.xkcd.com/comics/python.png" c = pycurl.Curl() c.setopt(pycurl.URL, url)
Trinn 3: Opprett et BytesIO-objekt og angi WRITEDATA-alternativet
Vi oppretter et BytesIO
-objekt for å lagre de nedlastede dataene og konfigurerer Curl-objektet til å skrive svardataene til bufferet ved hjelp av c.setopt(pycurl.WRITEDATA, buffer)
:
buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Trinn 4: Utfør forespørselen
Utfør HTTP-forespørselen ved hjelp av c.perform()
og hent de komiske bildedataene:
c.perform()
Trinn 5: Sjekk HTTP-statuskoden og lagre de nedlastede dataene
Vi henter HTTP-statuskoden ved hjelp av c.getinfo(pycurl.HTTP_CODE)
for å sikre at forespørselen var vellykket (HTTP-kode 200). Hvis HTTP-statuskoden er 200, skriver vi dataene fra bufferet til bildefilen:
http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue())
Trinn 6: Lukk Curl-objektet
Til slutt lukker vi Curl-objektet ved hjelp av c.close()
for å rydde opp i ressurser:
c.close()
Hvordan laste ned store filer i mindre biter
Så langt har vi sett på forskjellige metoder for å laste ned XKCD Python-tegneserien – en liten bildefil – til gjeldende mappe.
Det kan imidlertid også være nyttig å laste ned større filer, som installasjonsprogrammer for IDE-er osv. Når du laster ned så store filer, er det nyttig å laste dem ned i mindre biter og følge med på fremdriften. Vi kan bruke forespørselsbibliotekets funksjoner for å oppnå dette.
La oss bruke requests for å laste ned VS Code installasjonsprogrammet i biter på 1 MB:
import requests url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user" chunk_size = 1024 * 1024 response = requests.get(url, stream=True) 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() print(f'Downloading... {file_size}/{total_size} bytes', end='\r') print('Download complete.')
Her:
- Setter vi
chunk_size
for å bestemme størrelsen på hver bit (1 MB i dette eksempelet). - Deretter bruker vi
requests.get
medstream=True
for å strømme responsinnholdet uten å laste hele filen inn i minnet på en gang. - Vi lagrer hver bit til filen etter hvert som den lastes ned.
Mens nedlastingen pågår, vil du se antall byte som er lastet ned/totalt antall byte:
Når nedlastingen er fullført, bør du se meldingen «Nedlasting fullført»:
Og du bør se VS Code-installasjonsprogrammet i mappen din:
Oppsummering
Jeg håper du har lært noen forskjellige metoder for å laste ned filer fra URL-er ved hjelp av Python. I tillegg til den innebygde modulen urllib.request
, har vi utforsket populære eksterne Python-pakker som requests, urllib3, wget og PyCURL.
Som utvikler har jeg brukt requests-biblioteket mer enn de andre i prosjektene mine for å laste ned filer og jobbe med web-APIer generelt. Men de andre metodene kan også være nyttige avhengig av kompleksiteten til nedlastingsoppgaven og nivået av kontroll du trenger over HTTP-forespørslene. Lykke til med nedlastingen!