Jak používat Python cURL?

Curl je nástroj příkazového řádku používaný jako HTTP klient. Je oblíbený pro vytváření požadavků HTTP z příkazového řádku. cURL lze použít k psaní skriptů pro web scraping, kontrole stavu webu a stahování souborů z příkazového řádku.

Je neuvěřitelně jednoduchý a dá se použít v mnoha programovacích jazycích. Tento článek popisuje, co je cURL a jak jej používat v Pythonu.

Co je cURL?

Podle webu je cURL zkratka pro „URL klienta“. Jedná se o nástroj příkazového řádku a knihovnu pro přenos dat pomocí různých síťových protokolů aplikační vrstvy, jako jsou HTTP, HTTPS, FTP a IMAP.

Je neuvěřitelně populární a používá se ve více než 10 miliardách instalací napříč zařízeními, jako jsou rádia, televize, routery, tiskárny a počítače. cURL je zcela zdarma a open-source. Jeho zdrojový kód je dostupný na GitHubu.

cURL případy použití

cURL je velmi užitečné a všestranné. Níže jsou uvedeny nejoblíbenější případy použití pro cURL. I když seznam není vyčerpávající, níže jsou jen některé z nejoblíbenějších případů:

  • Testování rozhraní API: Může zkontrolovat, zda rozhraní API funguje správně, a vrátit správná data pro daný požadavek. Kromě toho se dá použít i pro kontrolu rychlosti API, tedy jak rychle reaguje na požadavky. Můžete napsat skript, který bude pravidelně kontrolovat stav API a odesílat upozornění, když se něco pokazí.
  • Web Scraping: Dokáže také automaticky extrahovat data z webových stránek. cURL lze použít ve spojení s mnoha programovacími jazyky a jako příkaz Bash. Pomocí cURL můžete dynamicky načítat data z webových stránek. Z HTML odpovědi můžete analyzovat a extrahovat data, která potřebujete. Pokud vás zajímá web scraping, možná budete chtít vyzkoušet etechblog.cz Web Scraping API, které usnadňuje scraping dat.
  • Stahování dat: Pomocí cURL můžete uložit odpovědi na požadavky do souboru. Tyto odpovědi mohou být data z požadavků API nebo soubory ze serveru. Efektivně, zápisem odpovědi do souboru jste soubor stáhli. Vzhledem k tomu, že cURL je nástroj příkazového řádku, můžete tento proces automatizovat a stahovat mnoho souborů najednou.
  Jak připojit ovladače GameCube k Nintendo Switch

Jak používat cURL v Pythonu (PycURL)

Instalace PycURL

Pro použití cURL v Pythonu používáme knihovnu PycURL. PycURL je rozhraní Pythonu ke knihovně cURL. Vytváří tenký obal nad již tak rychlou knihovnou cURL. Díky tomu je PycURL rychlejší než jiné knihovny pro vytváření požadavků, jako je urllib a požadavky. Chcete-li používat PycURL, musíte jej nejprve nainstalovat. Zde jsou podrobné pokyny, ale snadný způsob instalace je pomocí pip.

pip install PycURL

Na Ubuntu 22.04 jsem musel před instalací PycURL nainstalovat další nástroje. Před pokusem o instalaci PycURL pomocí pip použijte tento příkaz:

sudo apt install libcurl4-openssl-dev libssl-dev

Podání jednoduchého požadavku GET

Chcete-li vytvořit požadavek, začněte vytvořením skriptu Python, do kterého zapíšete kód. Otevřete soubor pomocí textového editoru. Budu používat Vim, ale můžete použít jakýkoli, který chcete. Chcete-li soubor otevřít pomocí Vim, použijte příkaz uvedený níže:

vim pycurl.py

Zde je pycurl.py název souboru, do kterého budu psát svůj kód, ale svůj soubor můžete pojmenovat jakkoli.

Dále importujeme třídu cURL z modulu PycURL

from pycurl import Curl

Po importu PycURL importujeme BytesIO z io. Budeme to potřebovat k vytvoření vyrovnávací paměti pro zápis odpovědi PycURL.

from io import BytesIO

Poté vytvoříme instanci nové instance Curl.

c = Curl()

Dále vytvoříme instanci BytesIO, abychom vytvořili nový buffer. PycURL nemá vestavěný úložný mechanismus pro ukládání odpovědí. Musíme tedy vytvořit vyrovnávací paměť a říct jí, kam má data zapisovat.

buffer = BytesIO()

S vytvořeným bufferem můžeme nastavit možnosti na našem klientském objektu. V tomto případě chceme nastavit dvě možnosti; první je adresa URL, kterou požadujeme. Druhá je místo, kam chceme napsat tělo odpovědi. Zde je kód, jak to udělat:

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

Jakmile to uděláme, můžeme požádat voláním metody perform objektu klienta a poté požadavek uzavřít voláním metody close.

c.perform()
c.close()

Abychom získali odpověď, zavoláme metodu getvalue() objektu buffer a dekódujeme ji. Ten pak můžeme vytisknout na konzoli.

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Váš soubor by měl vypadat takto:

from pycurl import Curl
from io import BytesIO

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Po spuštění skriptu byste měli získat následující výstup:

  Jak získat všechny vaše balíčky Amazon ve stejný den

Odeslání požadavku POST

Chcete-li vytvořit požadavek POST, budete muset nastavit možnosti POSTFIELDS objektu klienta cURL. Zde je například požadavek vytvářející požadavek POST na rozhraní API JSON Placeholder.

from io import BytesIO
from json import dumps
from pycurl import Curl

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

# Create a data dictionary
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# Encode the data to json
encoded_data = dumps(data)

# Set request options
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Ve výše uvedeném kódu jsem vytvořil objekt slovníku s daty, které budu posílat v rámci požadavku. Dále jsem zakódoval data do JSON a odeslal jsem je připojený jako užitečné zatížení k požadavku nastavením možnosti POSTFIELDS na zakódovaná data. Zadal jsem také hlavičky pro určení typu obsahu požadavku a datového typu přijaté odpovědi. Když spustíte kód, měli byste dostat odpověď jako je tato.

  Je dotyková obrazovka vašeho telefonu poškozená? Vyhněte se těmto špatným tipům na opravu

Zápis odpovědí do souborů

Můžete také předat do vyrovnávací paměti souboru volbu cURL WRITEDATA. Tím se zapíší data odpovědi do souboru. Koncept ilustruje následující příklad:

from pycurl import Curl

file_name="output.json"

# Opening the file in write mode
with open(file_name, 'wb') as f:
    
    # Creating a Curl instance
    c = Curl()

    # Set request options
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Make the request
    c.perform()

    # Close the connection
    c.close()

    print(f'Wrote output to {file_name}')

Alternativy k PycURL

PycURL poskytuje pouze tenkou vrstvu přes knihovnu cURL. Díky tomu je vysoce přizpůsobitelný, protože máte větší kontrolu nad funkcemi nižší úrovně.

Ztěžuje to však použití, a proto je více zaměřeno na pokročilé vývojáře. Často možná budete chtít jednodušší alternativu k PycURL. V této části probereme alternativy.

#1. Jiné knihovny

Kromě PycURL má Python další knihovny, které lze použít pro vytváření požadavků. Patří mezi ně knihovna požadavků a knihovna urllib. Oba jsou populární alternativou pro snadnější reklamy k pycURL.

#2. Jiné jazyky

cURL má rozhraní implementovaná v jiných jazycích. Populární web pro konverzi webových stránek cURL je Curl Converter. S převaděčem cURL napíšete příkaz cURL pro požadavek, který chcete provést, a ten automaticky převede váš příkaz do libovolného zvoleného programovacího jazyka. Můžete také jednoduše zavolat příkaz cURL přímo ve vašem terminálu nebo napsat Bash skript.

Závěr

V tomto článku jsem představil cURL a vysvětlil, jak jej používat v Pythonu pomocí modulu PycURL. Probrali jsme také alternativy k PycURL, jako je modul požadavků a použití různých jazyků pro vaše programy.

Dále se podívejte na použití příkazu cURL s příklady v reálném čase.