Domine o cURL em Python: Guia completo com PycURL e alternativas

O Curl, um utilitário de linha de comando, funciona como um cliente HTTP, sendo muito popular para realizar solicitações HTTP diretamente do terminal. Com o cURL, é possível criar scripts para web scraping, verificar a funcionalidade de sites e efetuar downloads de arquivos, tudo a partir da linha de comando.

Sua simplicidade é notável, e ele se integra facilmente com diversas linguagens de programação. Este guia aborda o conceito de cURL e sua aplicação no Python.

O que é cURL?

Conforme definido em seu site oficial, cURL significa “URL do cliente”. Trata-se de uma ferramenta de linha de comando e também de uma biblioteca que possibilita a transferência de dados através de diversos protocolos de rede da camada de aplicação, como HTTP, HTTPS, FTP e IMAP.

Sua popularidade é indiscutível, presente em mais de 10 bilhões de instalações em uma vasta gama de dispositivos, como rádios, televisores, roteadores, impressoras e computadores. O cURL é totalmente gratuito e de código aberto, com seu código-fonte disponível no GitHub.

Aplicações do cURL

O cURL é notavelmente útil e versátil. Abaixo, listamos alguns de seus usos mais comuns. Embora esta lista não seja exaustiva, ela oferece uma visão das aplicações mais populares:

  • Teste de APIs: Permite verificar se uma API opera corretamente, retornando os dados esperados para cada solicitação específica. Além disso, pode ser empregado para monitorar a velocidade da API, ou seja, a rapidez com que responde às solicitações. É possível criar scripts para verificar periodicamente a integridade da API e enviar alertas caso algo saia do esperado.
  • Web Scraping: Possibilita a extração automática de dados de sites. O cURL pode ser utilizado em conjunto com diversas linguagens de programação, bem como diretamente como um comando Bash. Com ele, é possível obter dados de sites de forma dinâmica. A partir do HTML recebido, é possível analisar e extrair as informações necessárias. Caso você tenha interesse em web scraping, vale a pena conferir a API de web scraping da etechpt.com, que simplifica a extração de dados.
  • Download de Dados: Com o cURL, é possível salvar a resposta de solicitações em um arquivo. Essas respostas podem ser dados de requisições de API ou arquivos hospedados em um servidor. Ao direcionar a resposta para um arquivo, efetua-se o download do mesmo. Sendo uma ferramenta de linha de comando, o cURL permite automatizar este processo, baixando vários arquivos simultaneamente.

Como Usar o cURL em Python (PycURL)

Instalando o PycURL

Para utilizar o cURL no Python, empregamos a biblioteca PycURL, uma interface que serve como uma ponte entre o Python e a biblioteca cURL. Esta interface cria um invólucro leve sobre a já veloz biblioteca cURL, tornando o PycURL mais rápido do que outras bibliotecas para realizar solicitações, como urllib e requests. Para começar a usar o PycURL, é necessário instalá-lo. Existem instruções detalhadas sobre como fazer isso, mas uma forma simples é através do pip.

pip install PycURL

No Ubuntu 22.04, foi necessário instalar algumas ferramentas adicionais antes de instalar o PycURL. Execute este comando antes de tentar instalar o PycURL com o pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Realizando uma Solicitação GET Simples

Para realizar uma solicitação, comece criando um arquivo Python onde você irá escrever o código. Abra o arquivo com um editor de texto. Eu usarei o Vim, mas você pode utilizar o editor de sua preferência. Para abrir o arquivo com o Vim, use o seguinte comando:

vim pycurl.py

Aqui, ‘pycurl.py’ é o nome do arquivo onde escreverei o código, mas você pode nomeá-lo como preferir.

Em seguida, importamos a classe Curl do módulo PycURL.

from pycurl import Curl

Após importar o PycURL, importamos BytesIO do módulo io. Isso será necessário para criar um buffer onde armazenaremos a resposta do PycURL.

from io import BytesIO

Agora, criamos uma nova instância de Curl.

c = Curl()

Em seguida, instanciamos o BytesIO para criar um novo buffer. O PycURL não tem um mecanismo próprio para armazenar as respostas, sendo necessário criar um buffer e indicar a ele onde os dados devem ser escritos.

buffer = BytesIO()

Com o buffer criado, podemos definir as opções do objeto cliente. Neste exemplo, definiremos duas opções: a URL a ser solicitada e o local onde desejamos armazenar o corpo da resposta. O código para isso é:

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

Depois de configurar as opções, podemos executar a solicitação chamando o método perform do objeto cliente, e então fechamos a conexão com o método close.

c.perform()
c.close()

Para obter a resposta, chamamos o método getvalue() do objeto buffer e o decodificamos. Em seguida, podemos imprimir o resultado no console.

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

Seu arquivo deve estar semelhante a este:

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'))

Ao executar o script, você deverá obter uma saída semelhante a esta:

Realizando uma Solicitação POST

Para realizar uma solicitação POST, é necessário definir as opções POSTFIELDS do objeto cliente cURL. Por exemplo, este é um exemplo de uma solicitação POST para a 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'))

No código acima, foi criado um dicionário com os dados que serão enviados como parte da requisição. Em seguida, esses dados foram codificados para o formato JSON e enviados como o corpo da solicitação, através da opção POSTFIELDS. Também foram especificados cabeçalhos para indicar o tipo de conteúdo da solicitação e o tipo de dados que a resposta deverá ter. Ao executar o código, você deverá obter uma resposta semelhante a esta.

Salvando Respostas em Arquivos

Você também pode passar um objeto arquivo para a opção cURL WRITEDATA, o que direcionará os dados da resposta diretamente para o arquivo. O seguinte exemplo demonstra como isso funciona:

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}')

Alternativas ao PycURL

O PycURL serve como uma camada leve sobre a biblioteca cURL, o que o torna altamente personalizável e permite maior controle sobre seus recursos.

Contudo, essa característica pode torná-lo mais complexo de usar, o que geralmente o direciona a desenvolvedores mais experientes. Muitas vezes, uma alternativa mais simples ao PycURL pode ser mais conveniente. Nesta seção, abordaremos algumas dessas alternativas.

#1. Outras Bibliotecas

Além do PycURL, o Python dispõe de outras bibliotecas que também podem ser usadas para realizar solicitações, incluindo as bibliotecas requests e urllib. Ambas são alternativas populares e mais fáceis de usar do que o PycURL.

#2. Outras Linguagens

O cURL possui interfaces implementadas em diversas outras linguagens. Uma ferramenta popular para converter solicitações cURL é o Curl Converter. Com ele, você insere um comando cURL para a solicitação desejada, e ele automaticamente converte esse comando para a linguagem de programação de sua escolha. Você também pode simplesmente executar o comando cURL diretamente no seu terminal ou dentro de um script Bash.

Conclusão

Neste artigo, foi apresentado o cURL, e foi explicado como utilizá-lo no Python através do módulo PycURL. Também foram discutidas alternativas ao PycURL, como o módulo requests e o uso de outras linguagens para realizar essas operações.

Para aprofundar seus conhecimentos, confira exemplos práticos do uso do comando cURL em situações reais.