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.