5 způsobů, jak stahovat soubory z adresy URL pomocí Pythonu
Chcete stahovat soubory z adresy URL pomocí Pythonu? Naučme se různé způsoby, jak toho dosáhnout.
Když pracujete na projektu Python, možná budete muset stáhnout soubory z webu – z konkrétní adresy URL.
Můžete si je stáhnout ručně do svého pracovního prostředí. Je však pohodlnější stahovat soubory z jejich URL programově v rámci skriptu Python.
V tomto tutoriálu se budeme zabývat různými způsoby stahování souborů z webu pomocí Pythonu – pomocí vestavěných balíčků Pythonu i balíčků třetích stran.
Table of Contents
Jak používat Python pro stahování souborů z URL
Pokud znáte Python, narazili byste na tento populární komiks XKCD Python:
Komiks Python | Zdroj: XKCD
Jako příklad se pokusíme stáhnout tento komiksový obrázek XKCD (přípona .png) obrázek PNG do našeho pracovního adresáře pomocí různých metod.
V průběhu kurzu budeme pracovat s několika balíčky Pythonu třetích stran. Nainstalujte je všechny do vyhrazeného virtuálního prostředí pro váš projekt.
Pomocí urllib.request
Můžete použít vestavěný Python urllib.request modul pro stahování souborů z adresy URL. Tento vestavěný modul přichází s funkcí pro vytváření požadavků HTTP a zpracování URL. Poskytuje jednoduchý způsob interakce s webovými zdroji a podporuje úkoly, jako je načítání dat z webových stránek.
Pojďme si stáhnout komiks XKCD Python z jeho adresy URL pomocí urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Zde provádíme následující:
- Importujte modul urllib.request.
- Nastavte adresu URL obrázku komiksu XKCD Python.
- Pomocí urllib.request.urlretrieve stáhněte obrázek a uložte jej jako ‚xkcd_comic.png‘ do aktuálního adresáře.
Pokud nyní spustíte příkaz ls na terminálu pro zobrazení obsahu aktuálního adresáře, uvidíte soubor ‚xkcd_comic.png‘:
Použití knihovny požadavků
The Knihovna žádostí je populární a jeden z nejstahovanějších balíčků Pythonu. Můžete odesílat požadavky HTTP přes web a načítat obsah.
Nejprve nainstalujte knihovnu požadavků:
pip install requests
Pokud jste ve stejném adresáři vytvořili nový skript Python, před spuštěním aktuálního skriptu odstraňte ‚xkcd_comic.png‘.
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 rozebrat, co jsme v tomto přístupu udělali:
- Importujte knihovnu požadavků.
- Nastavte adresu URL obrázku komiksu XKCD Python.
- Odešlete požadavek GET na adresu URL pomocí request.get.
- Uložte obsah odpovědi (obrázková data) jako ‚xkcd_comic.png‘ v režimu binárního zápisu.
A při tisku obsahu adresáře byste měli vidět stažený obrázek:
Pomocí urllib3
Viděli jsme, jak používat vestavěný urllib.request. Ale můžete také použít balíček třetí strany urllib3 v Pythonu.
Urllib3 je knihovna Pythonu pro vytváření požadavků HTTP a správu připojení spolehlivějším a efektivnějším způsobem než vestavěný modul urllib. Poskytuje funkce, jako je sdružování připojení, opakování požadavků a bezpečnost vláken, což z něj činí robustní volbu pro zpracování HTTP komunikace v aplikacích Pythonu.
Nainstalujte urllib3 pomocí pip:
pip install urllib3
Nyní si stáhněte komiks XKCD Python pomocí knihovny 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)
Tento přístup se zdá být více zapojený než předchozí přístupy používající urllib.requests a knihovnu požadavků. Pojďme si tedy jednotlivé kroky rozebrat:
- Začneme importem modulu urllib3, který poskytuje funkce pro vytváření požadavků HTTP.
- Poté určíme URL obrázku komiksu XKCD.
- Dále vytvoříme instanci urllib3.PoolManager(). Tento objekt spravuje fond připojení a umožňuje nám zadávat požadavky HTTP.
- Poté pomocí metody http.request(‚GET‘, url) odešleme požadavek HTTP GET na zadanou URL. Tento požadavek načte obsah komiksu XKCD.
- Jakmile je požadavek úspěšný, načteme obsah (obrázková data) z HTTP odpovědi pomocí response.data.
- Nakonec zapíšeme data obrázku (získáme z odpovědi) do souboru.
Když spustíte svůj skript Python, měli byste získat následující výstup:
Pomocí wget
The Knihovna wget Python zjednodušuje stahování souborů z adres URL. Můžete jej použít k načítání webových zdrojů a je zvláště užitečný pro automatizaci úloh stahování.
Knihovnu wget můžete nainstalovat pomocí pip a poté použít její funkce ke stažení souborů z URL:
pip install wget
Tento úryvek používá modul wget ke stažení komiksu XKCD Python a jeho uložení jako ‚xkcd_comic.png‘ do pracovního adresáře:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Tady:
- Importujeme modul wget.
- Nastavte adresu URL obrázku komiksu XKCD Python.
- Pomocí wget.download stáhněte obrázek a uložte jej jako ‚xkcd_comic.png‘ do aktuálního adresáře.
Když si stáhnete komiks XKCD pomocí wget, měli byste vidět podobný výstup:
Pomocí PyCURL
Pokud jste používali počítač se systémem Linux nebo Mac, možná znáte nástroj příkazového řádku cURL pro stahování souborů z webu.
PyCURL, rozhraní Pythonu pro libcurl, je výkonný nástroj pro vytváření požadavků HTTP. Poskytuje jemnou kontrolu nad požadavky a můžete jej použít pro pokročilé případy použití při manipulaci s webovými zdroji.
Instalace pycurl ve vašem pracovním prostředí může být složitá. Zkuste nainstalovat pomocí pip:
pip install pycurl
⚠️ Pokud se během procesu objeví chyby, můžete zkontrolovat Průvodce instalací PyCURL pro tipy pro odstraňování problémů.
Případně, pokud máte nainstalovaný cURL, můžete nainstalovat vazby Pythonu na libcurl takto:
sudo apt install python3-pycurl
Poznámka: Před instalací vazby Pythonu musíte mít nainstalovanou cURL. Pokud nemáte na svém počítači nainstalovaný cURL, můžete to udělat takto: apt install curl.
Stahování souborů pomocí PyCURL
Zde je kód ke stažení XKCD Comic 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()
Pojďme si pro každý krok rozdělit větší úryvek na menší úryvky kódu:
Krok 1: Importujte požadované moduly
Nejprve importujeme pycurl, abychom jej mohli použít pro vytváření požadavků HTTP. Poté importujeme BytesIO z io modul pro vytvoření vyrovnávací paměti pro ukládání stažených dat:
import pycurl from io import BytesIO
Krok 2: Vytvořte objekt Curl a nastavte adresu URL
Zadáme URL XKCD Python komiksu, který chceme stáhnout. A vytvořte objekt curl, který představuje požadavek HTTP. Poté nastavíme adresu URL pro objekt Curl pomocí 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řte objekt BytesIO a nastavte možnost WRITEDATA
Vytvoříme objekt BytesIO pro uložení stažených dat a nakonfigurujeme objekt Curl tak, aby zapisoval data odezvy do našeho bufferu pomocí c.setopt(pycurl.WRITEDATA, buffer):
# Create a BytesIO object to store the downloaded data buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Krok 4: Proveďte požadavek
Proveďte požadavek HTTP pomocí c.perform() a načtěte data komiksového obrázku:
# Perform the request c.perform()
Krok 5: Zkontrolujte stavový kód HTTP a uložte stažená data
Stavový kód HTTP získáme pomocí 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 vyrovnávací paměti do souboru obrázku:
# 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: Zavřete objekt Curl
Nakonec zavřeme objekt curl pomocí c.close() k vyčištění zdrojů:
# Close the Curl object c.close()
Jak stahovat velké soubory v menších částech
Doposud jsme viděli různé způsoby, jak stáhnout komiks XKCD Python – malý obrázkový soubor – do aktuálního adresáře.
Můžete si však také stáhnout mnohem větší soubory, jako jsou instalační programy pro IDE a další. Při stahování takto velkých souborů je užitečné stahovat je po menších kouscích a také sledovat průběh stahování. K tomu můžeme využít funkcionalitu knihovny požadavků.
Použijme žádosti ke stažení VS kód instalační program 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.')
Tady:
- Nastavíme `chunk_size`, abychom určili velikost každého bloku (v tomto příkladu 1 MB).
- Potom použijeme request.get s stream=True ke streamování obsahu odpovědi bez načítání celého souboru do paměti najednou.
- Každý blok ukládáme do souboru postupně, jak se stahuje.
Jak stahování pokračuje, uvidíte počet aktuálně stažených bajtů/celkový počet bajtů:
Po dokončení stahování by se měla zobrazit zpráva „Stahování dokončeno“:
A ve vašem adresáři byste měli vidět instalační program VS Code:
Zabalit se
Doufám, že jste se naučili několik různých způsobů stahování souborů z URL pomocí Pythonu. Kromě vestavěného urllib.request jsme pokryli oblíbené balíčky Pythonu třetích stran, jako jsou requesty, urllib3, wget a PuCURL.
Jako vývojář jsem ve svých projektech používal knihovnu požadavků více než ostatní pro stahování souborů a práci s webovými API obecně. Ale další metody se mohou také hodit v závislosti na složitosti úlohy stahování a úrovni granularity, kterou potřebujete pro požadavky HTTP. Šťastné stahování!