Různé způsoby stahování souborů z URL pomocí Pythonu
Potřebujete stáhnout soubory z internetové adresy za použití programovacího jazyka Python? Prozkoumejte s námi rozmanité metody, jak toho dosáhnout.
Během práce na projektech v Pythonu se může objevit potřeba stáhnout různé soubory z webu – konkrétně z určené URL adresy.
I když je možné soubory stahovat do vašeho lokálního prostředí manuálně, je daleko efektivnější a pohodlnější automatizovat proces stahování přímo ve vašem pythonovském skriptu.
V tomto návodu se ponoříme do několika metod, jak efektivně stáhnout soubory z webu s využitím Pythonu – a to jak s pomocí zabudovaných modulů, tak i za použití externích knihoven.
Jak využít Python pro stahování souborů z URL
Pokud jste se již s Pythonem setkali, možná vám je známý populární XKCD komiks o Pythonu:
Komiks Python | Zdroj: XKCD
Pro praktickou demonstraci se pokusíme stáhnout tento obrázek komiksu XKCD (soubor s příponou .png) do našeho pracovního adresáře za pomoci různých přístupů.
Během tohoto tutoriálu budeme používat několik externích knihoven pro Python. Doporučujeme je nainstalovat do samostatného virtuálního prostředí, které si pro tento projekt vytvoříte.
Využití modulu urllib.request
Pro stahování souborů z URL adres je možné efektivně využít zabudovaný modul urllib.request v Pythonu. Tento modul nabízí funkce pro zpracování HTTP požadavků a URL adres, a poskytuje tak jednoduchý způsob interakce s webovými zdroji, včetně stahování dat z webových stránek.
Nyní si ukážeme, jak stáhnout komiks XKCD Python za použití modulu urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
V tomto kódu provádíme následující kroky:
- Importujeme modul urllib.request.
- Definujeme URL adresu obrázku komiksu XKCD.
- Pomocí funkce urllib.request.urlretrieve stahujeme obrázek a ukládáme ho do souboru ‚xkcd_comic.png‘ v aktuálním adresáři.
Po provedení skriptu, pomocí příkazu ‚ls‘ v terminálu, uvidíte ve vašem aktuálním adresáři soubor s názvem ‚xkcd_comic.png‘:
Použití knihovny Requests
Knihovna Requests je populární a velmi často používaná externí knihovna v Pythonu. Umožňuje odesílat HTTP požadavky a načítat obsah z webových stránek.
Nejprve si nainstalujte knihovnu Requests:
pip install requests
Pokud jste pro tento úkol vytvořili nový pythonovský skript, nezapomeňte před spuštěním odstranit soubor ‚xkcd_comic.png‘, pokud existuje.
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)
Pojďme si podrobněji rozebrat, co jsme v tomto přístupu udělali:
- Importovali jsme knihovnu Requests.
- Definovali URL adresu obrázku komiksu XKCD.
- Odeslali jsme GET požadavek na danou URL adresu pomocí funkce requests.get.
- Uložili jsme obsah odpovědi (obrázková data) do souboru ‚xkcd_comic.png‘ v binárním režimu zápisu.
Po spuštění skriptu a vypsání obsahu adresáře byste měli vidět stažený obrázek:
Využití knihovny urllib3
Viděli jsme, jak používat vestavěný modul urllib.request. Nyní si ukážeme, jak můžete využít externí knihovnu urllib3.
Urllib3 je knihovna v Pythonu pro odesílání HTTP požadavků a správu síťových připojení efektivněji než vestavěný modul urllib. Nabízí funkce, jako je sdružování připojení, opakování požadavků a bezpečnost vláken, což z ní dělá silný nástroj pro manipulaci s HTTP komunikací v pythonovských aplikacích.
Nainstalujte urllib3 pomocí příkazu pip:
pip install urllib3
Nyní si stáhněte komiks XKCD Python pomocí knihovny urllib3:
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)
Tento přístup se může zdát komplikovanější než předchozí metody s urllib.request a Requests. Proto si jednotlivé kroky podrobněji popíšeme:
- Začneme importováním modulu urllib3, který poskytuje funkce pro vytváření HTTP požadavků.
- Následně definujeme URL adresu komiksu XKCD.
- Potom vytváříme instanci třídy urllib3.PoolManager(). Tento objekt se stará o správu připojení a umožňuje nám posílat HTTP požadavky.
- Pomocí metody http.request(‚GET‘, url) odesíláme HTTP GET požadavek na danou URL adresu. Tímto požadavkem načteme obsah komiksu XKCD.
- Po úspěšném provedení požadavku načteme obsah (data obrázku) z HTTP odpovědi pomocí response.data.
- Nakonec zapisujeme data obrázku (získaná z odpovědi) do souboru.
Po spuštění skriptu byste měli obdržet podobný výstup:
Použití knihovny wget
Knihovna wget v Pythonu zjednodušuje proces stahování souborů z URL adres. Je ideální pro načítání webových zdrojů a zvláště užitečná pro automatizaci stahování.
Pro instalaci knihovny wget použijte pip a poté její funkce pro stahování souborů z URL:
pip install wget
Následující kód využívá modul wget pro stažení komiksu XKCD Python a jeho uložení jako ‚xkcd_comic.png‘ do aktuálního adresáře:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Zde se provádí:
- Import modulu wget.
- Nastavení URL adresy obrázku komiksu XKCD Python.
- Stažení obrázku a jeho uložení jako ‚xkcd_comic.png‘ do aktuálního adresáře pomocí funkce wget.download.
Po stažení komiksu XKCD pomocí wget, byste měli obdržet podobný výstup:
Použití knihovny PyCURL
Pokud jste někdy používali počítač se systémem Linux nebo macOS, možná je vám známý nástroj příkazového řádku cURL pro stahování souborů z webu.
PyCURL, pythonovské rozhraní pro libcurl, je výkonný nástroj pro vytváření HTTP požadavků. Nabízí detailní kontrolu nad požadavky a je vhodný pro pokročilé manipulace s webovými zdroji.
Instalace pycurl ve vašem pracovním prostředí může být náročnější. Zkuste instalaci pomocí pip:
pip install pycurl
⚠️ Pokud se během instalace objeví chyby, podívejte se do Průvodce instalací PyCURL pro tipy, jak řešit případné problémy.
Alternativně, pokud máte nainstalovaný cURL, můžete instalovat pythonovské vazby pro libcurl následovně:
sudo apt install python3-pycurl
Poznámka: Pro instalaci pythonovských vazeb musíte mít nainstalované cURL. Pokud cURL na svém počítači nemáte, můžete jej nainstalovat pomocí příkazu: apt install curl.
Stahování souborů pomocí PyCURL
Zde je kód pro stažení komiksu XKCD pomocí 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()
Pro lepší pochopení rozdělíme tento větší kus kódu na menší části:
Krok 1: Import potřebných modulů
Nejprve importujeme modul pycurl, abychom ho mohli použít pro vytváření HTTP požadavků. Potom importujeme modul BytesIO z modulu io pro vytvoření vyrovnávací paměti pro ukládání stažených dat:
import pycurl from io import BytesIO
Krok 2: Vytvoření objektu Curl a nastavení URL
Definujeme URL adresu komiksu XKCD Python, který chceme stáhnout. Následně vytvoříme objekt curl, který reprezentuje HTTP požadavek. Poté nastavíme URL adresu pro objekt Curl pomocí funkce 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)
Krok 3: Vytvoření objektu BytesIO a nastavení volby WRITEDATA
Vytvoříme objekt BytesIO pro ukládání stažených dat a nakonfigurujeme objekt Curl tak, aby zapisoval data odpovědi do našeho bufferu pomocí funkce c.setopt(pycurl.WRITEDATA, buffer):
# Create a BytesIO object to store the downloaded data buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Krok 4: Provedení požadavku
Provedeme HTTP požadavek pomocí c.perform() a načteme data obrázku komiksu:
# Perform the request c.perform()
Krok 5: Kontrola stavového kódu HTTP a uložení stažených dat
Získáme stavový kód HTTP pomocí funkce c.getinfo(pycurl.HTTP_CODE), abychom se ujistili, že požadavek byl úspěšný (HTTP kód 200). Pokud je stavový kód HTTP 200, zapíšeme data z bufferu do souboru s obrázkem:
# 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())
Krok 6: Uzavření objektu Curl
Nakonec uzavřeme objekt curl pomocí c.close() pro uvolnění systémových zdrojů:
# Close the Curl object c.close()
Jak stahovat velké soubory po menších částech
Zatím jsme si ukázali různé způsoby, jak stáhnout komiks XKCD Python – malý obrázkový soubor – do aktuálního adresáře.
Můžete si také stáhnout mnohem větší soubory, jako jsou instalační programy pro IDE a další. Při stahování tak velkých souborů je užitečné je stahovat po menších částech a sledovat průběh stahování. K tomuto účelu můžeme využít funkcionality knihovny Requests.
Použijeme knihovnu Requests ke stažení VS Code instalačního souboru v blocích o velikosti 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.')
V tomto kódu:
- Nastavujeme `chunk_size` pro určení velikosti každého bloku (v tomto příkladu 1 MB).
- Následně používáme funkci request.get s parametrem stream=True pro streamování obsahu odpovědi, abychom se vyhnuli načtení celého souboru do paměti najednou.
- Každý blok postupně ukládáme do souboru.
Během stahování můžete sledovat počet aktuálně stažených bytů z celkového počtu bytů:
Po dokončení stahování se zobrazí zpráva „Download complete“:
A ve vašem adresáři by se měl objevit instalační program VS Code:
Závěrem
Doufám, že jste se v tomto návodu naučili různé metody stahování souborů z URL adres pomocí programovacího jazyka Python. Kromě vestavěného modulu urllib.request jsme se podívali na populární externí knihovny Pythonu, jako jsou Requests, urllib3, wget a PyCURL.
Jako vývojář nejčastěji využívám knihovnu Requests pro stahování souborů a pro práci s webovými API. Nicméně ostatní metody mohou být užitečné v závislosti na složitosti stahování a úrovni kontroly, kterou potřebujete pro HTTP požadavky. Přeji vám úspěšné stahování!