etechblog

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.

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.
  11 Převodník z binárního textu na text

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.
  Existuje JCPenney Mastercard?

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.

  Jak nastavit Resilio Sync Server na Linuxu

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í!

x