Como usar Python cURL?

Curl é um utilitário de linha de comando usado como um cliente HTTP. É popular para fazer solicitações HTTP a partir da linha de comando. O cURL pode ser usado para escrever scripts para web scraping, verificar a integridade de um site e baixar arquivos da linha de comando.

É incrivelmente simples e pode ser usado em muitas linguagens de programação. Este artigo orienta o que é cURL e como usá-lo no Python.

O que é cURL?

De acordo com o site, cURL significa “URL do cliente”. É uma ferramenta de linha de comando e uma biblioteca para transferência de dados usando diferentes protocolos de rede da camada de aplicativo, como HTTP, HTTPS, FTP e IMAP.

É incrivelmente popular e usado em mais de 10 bilhões de instalações em dispositivos como rádios, TVs, roteadores, impressoras e computadores. cURL é totalmente gratuito e de código aberto. Seu código-fonte está disponível no GitHub.

Casos de uso do cURL

cURL é muito útil e versátil. Listados abaixo estão os casos de uso mais populares para cURL. Embora a lista não seja exaustiva, os seguintes são apenas alguns dos casos mais populares:

  • APIs de teste: pode verificar se a API funciona corretamente, retornando os dados corretos para uma determinada solicitação. Além disso, também pode ser usado para verificar a velocidade da API, ou seja, a rapidez com que ela responde às solicitações. Você pode escrever um script para verificar a integridade da API periodicamente e enviar alertas quando algo der errado.
  • Web Scraping: também pode extrair automaticamente dados de sites. cURL pode ser usado em conjunto com muitas linguagens de programação e como um comando Bash. Com cURL, você pode buscar dados de sites dinamicamente. A partir do HTML de resposta, você pode analisar e extrair os dados necessários. Se você estiver interessado em web scraping, talvez queira verificar a API de web Scraping etechpt.com, que facilita a extração de dados.
  • Download de dados: Com cURL, você pode salvar a resposta das solicitações em um arquivo. Essas respostas podem ser dados de solicitações de API ou arquivos de um servidor. Efetivamente, ao escrever a resposta em um arquivo, você baixou o arquivo. Como o cURL é uma ferramenta de linha de comando, você pode automatizar esse processo para baixar muitos arquivos de uma só vez.
  9 opções gratuitas de armazenamento em nuvem de hospedagem de arquivos para uso pessoal e comercial

Como usar cURL em Python (PycURL)

Instalando o PycURL

Para usar cURL em Python, usamos a biblioteca PycURL. PycURL é uma interface Python para a biblioteca cURL. Ele cria um wrapper fino sobre a já rápida biblioteca cURL. Isso torna o PycURL mais rápido do que outras bibliotecas para fazer solicitações como urllib e solicitações. Para usar o PycURL, primeiro você precisa instalá-lo. Existem instruções detalhadas aqui, mas uma maneira fácil de instalá-lo é usando o pip.

pip install PycURL

No Ubuntu 22.04, tive que instalar ferramentas adicionais antes de instalar o PycURL. Use este comando antes de tentar instalar o PycURL com pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Fazendo uma solicitação GET simples

Para fazer uma solicitação, comece criando um script Python no qual gravar o código. Abra o arquivo com um editor de texto. Vou usar o Vim, mas você pode usar o que quiser. Para abrir o arquivo com o Vim, você usa o comando abaixo:

vim pycurl.py

Aqui, pycurl.py é o nome do arquivo no qual vou escrever meu código, mas você pode nomear seu arquivo como quiser.

  O que significa “OTOH” e como você o usa?

Em seguida, importamos a classe cURL do módulo PycURL

from pycurl import Curl

Depois de importar PycURL, importamos BytesIO de io. Vamos precisar disso para criar um buffer para escrever a resposta de PycURL.

from io import BytesIO

Em seguida, instanciamos uma nova instância de Curl.

c = Curl()

Em seguida, instanciamos BytesIO para criar um novo buffer. PycURL não possui um mecanismo de armazenamento integrado para armazenar respostas. Portanto, temos que criar um buffer e dizer a ele onde gravar os dados.

buffer = BytesIO()

Com o buffer criado, podemos definir opções em nosso objeto cliente. Neste caso, queremos definir duas opções; o primeiro é o URL que solicitamos. A segunda é onde queremos escrever o corpo da resposta. Aqui está o código para fazê-lo:

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

Depois de fazer isso, podemos solicitar chamando o método perform do objeto cliente e, em seguida, fechar a solicitação chamando o método close.

c.perform()
c.close()

Para obter a resposta, chamamos o método getvalue() do objeto buffer e o decodificamos. Podemos então imprimi-lo no console.

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

Seu arquivo deve ficar assim:

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

Depois de executar o script, você deve obter a seguinte saída:

Fazendo uma solicitação POST

Para fazer uma solicitação POST, você precisará definir as opções POSTFIELDS do objeto cliente cURL. Por exemplo, aqui está uma solicitação fazendo 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, criei um objeto dicionário com os dados que estarei enviando como parte da requisição. Em seguida, codifiquei os dados para JSON e os enviei anexados como carga útil à solicitação, definindo a opção POSTFIELDS para os dados codificados. Também especifiquei cabeçalhos para especificar o tipo de conteúdo da solicitação e o tipo de dados de resposta aceitos. Ao executar o código, você deve obter uma resposta como esta.

  Como destacar calendários diferentes no Outlook Online

Escrevendo respostas para arquivos

Você também pode passar um buffer de arquivo para a opção cURL WRITEDATA. Isso gravará os dados de resposta no arquivo. O exemplo a seguir ilustra o conceito:

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 para PycURL

PycURL fornece apenas uma camada fina sobre a biblioteca cURL. Isso o torna altamente personalizável, pois você tem mais controle sobre os recursos de nível inferior.

No entanto, torna mais difícil de usar e, portanto, é mais direcionado para o desenvolvedor avançado. Muitas vezes, você pode querer uma alternativa mais simples ao PycURL. Nesta seção, discutiremos as alternativas.

#1. Outras bibliotecas

Além do PycURL, o Python possui outras bibliotecas que podem ser usadas para fazer solicitações. Isso inclui a biblioteca de solicitações e a biblioteca urllib. Ambos são alternativas populares de anúncios mais fáceis para pycURL.

#2. Outras línguas

cURL possui interfaces implementadas em outras linguagens. Um site popular para converter sites cURL é o Curl Converter. Com o conversor cURL, você escreve um comando cURL para a solicitação que deseja fazer e ele converte automaticamente seu comando para qualquer linguagem de programação escolhida. Você também pode simplesmente chamar o comando cURL diretamente no seu terminal ou escrever um script Bash.

Conclusão

Neste artigo, apresentei o cURL e expliquei como usá-lo em Python usando o módulo PycURL. Também discutimos alternativas para PycURL, como o módulo de solicitações e o uso de linguagens diferentes para seus programas.

A seguir, confira o uso do comando cURL com exemplos em tempo real.