Voltar ao blogue
Guias
Andrei OgiolanLast updated on Mar 31, 20269 min read

Descubra como utilizar o cURL em Python

Descubra como utilizar o cURL em Python

O que é o cURL?

Para alcançar o objetivo deste artigo, que é aprender a usar o cURL em Python, precisamos primeiro apresentar o cURL. O Client URL (cURL) é, resumidamente, uma linha de comando fácil de usar, concebida para que os programadores possam obter dados de um servidor.

Como usar o cURL?

Como já mencionei acima, usar o cURL é bastante simples e permite extrair informações com apenas um comando de uma linha. Primeiro, é necessário abrir um terminal e digitar curl seguido de um link de um site, por exemplo:

$ curl 'https://www.webscrapingapi.com/'

Parabéns, fez o seu primeiro pedido utilizando o cURL. Este comando simples solicita informações ao servidor tal como um navegador tradicional e devolve o HTML da página. Nem todos os sites lhe devolverão HTML; existem pontos finais que devolvem dados como um objeto JSON. Veja este exemplo:

$ curl 'https://jsonplaceholder.typicode.com/todos/1'

Digite este comando no seu terminal e deverá receber esta resposta:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

A maioria das APIs devolve HTML ou JSON quando executa comandos cURL contra elas. Bem, isto não é tudo o que o cURL pode fazer por nós. Na realidade, é uma ferramenta muito sofisticada. Se quiser saber mais sobre o cURL, recomendo vivamente que consulte a documentação do cURL para compreender melhor os seus parâmetros. Em alternativa, pode executar o seguinte comando:

$ curl --help

Isto irá mostrar-lhe algumas opções que pode definir no cURL:

Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit

This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".

Como provavelmente pode ver, estas nem sequer são todas as opções que pode definir no cURL; trata-se de um menu dividido em categorias. Provavelmente já adivinhou que, para obter todas as opções que gostaria de executar:

$ curl --help all

Como utilizar o cURL em Python?

Para esta etapa, existem 2 pré-requisitos. O primeiro é bastante óbvio: deve instalar o Python na sua máquina. Pode fazê-lo navegando até ao site oficial do Python e instalando a versão adequada para o seu sistema operativo. Certifique-se de que é uma versão recente, pois as mais antigas provavelmente não incluirão o pip, que é necessário para a maioria dos pacotes que iremos querer utilizar. Em seguida, execute o seguinte comando:

$ pip --version

Após a instalação bem-sucedida, isto deverá indicar-lhe a versão do pip que instalou. 

Caso contrário, é mais provável que receba esta mensagem:

"pip" is not considered to be an external or internal command. A batch file is a program to operate.

É muito importante que tenha o pip instalado para poder prosseguir, pois irá precisar dele para instalar pacotes.

O segundo pré-requisito é que esteja familiarizado com a sintaxe do Python ou, pelo menos, tenha um nível de experiência de principiante com qualquer outra linguagem de programação.

Porquê usar o cURL em Python?

Provavelmente está a pensar: não basta usar o cURL a partir da linha de comandos? Estamos a executar apenas uma linha de comando e a API devolve-nos a informação. Isso está certo, mas no mundo real vamos querer processar de alguma forma os dados que recebemos do servidor e é por isso que precisamos de uma linguagem de programação. É nesse momento que o Python entra em cena.

Porquê usar Python?

O Python é uma linguagem de programação de alto nível utilizada para muitos fins. A sua sintaxe simples e a sua facilidade de utilização tornam-no muito fácil de aprender para principiantes. Além disso, conta com uma enorme comunidade pronta a ajudar-te, por isso, caso encontres algum problema, não hesites em fazer uma pergunta. Um ótimo local onde podes entrar e fazer uma pergunta é o StackOverflow, e alguém irá certamente responder-te.

Como integrar o cURL no Python

Tal como antes, o cURL em Python também é muito simples. Lembra-te de quando escrevemos um comando de uma linha para obter os dados do servidor. A diferença é que agora precisas de escrever duas linhas de código para esta chamada simples, por exemplo:

import os
os.system(f'curl "https://www.webscrapingapi.com/product/"')

Agora vamos ver a verdadeira vantagem de usar uma linguagem de programação. Podemos criar uma função que receba um URL personalizado e execute o comando curl nele:

import os

def cURL(url):
return os.system(f'curl "{url}"')

cURL('https://www.webscrapingapi.com/blog/')

Podes substituir https://www.webscrapingapi.com/blog/ por qualquer outro site do qual queiras obter dados. Parabéns, neste momento criaste um script que recebe uma URL, executa o comando cURL e exibe o resultado na consola. Podes executar o Python diretamente no teu terminal, mas para uma melhor experiência de programação recomendo vivamente que uses um Ambiente de Desenvolvimento Integrado. Existem muitas opções à sua escolha, mas para Python recomendo o PyCharm, que pode descarregar aqui

Como já mencionei acima, o cURL não se limita a isso. Ele pode fazer uma enorme quantidade de coisas além de enviar pedidos GET. Também pode descarregar ficheiros ou enviar pedidos POST, PUT ou DELETE. Aqui está um exemplo de uma função Python que envia um pedido POST para https://httpbin.org/post:

import os

def cURL(method,url,data):
return os.system(f'curl -X "{method}" --url "{url}" --data {data} ')

data = '{"foo":"bar"}'

cURL('POST', 'https://httpbin.org/post', data)

Como provavelmente reparou, o comando fica um pouco diferente ao enviar uma solicitação POST. Na solicitação anterior, não foi necessário usar os parâmetros -X e –data porque o método padrão do cURL é GET. Após executar este comando, deverá receber da API httpbin uma resposta contendo a sua solicitação, endereço IP, parâmetros e corpo que enviou, que seria algo semelhante a isto.

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{foo:bar}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "9", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/X.XX.X", 
    "X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
  }, 
  "json": null, 
  "origin": "0.0.0.0", 
  "url": "https://httpbin.org/post"
}

Nesta altura, já criou uma ferramenta simples capaz de enviar pedidos GET, POST, PUT, PATCH, DELETE, etc., para obter alguns dados de uma API. Agora podemos simplesmente definir o URL, o método e o corpo diretamente a partir do nosso script Python, em vez de os escrever manualmente. No entanto, esta é uma vantagem menor que temos ao usar o cURL em Python. A principal vantagem é que agora podemos processar os dados da forma que quisermos, mesmo que a API não nos dê a opção de os obter da forma que gostaríamos. Por exemplo, digamos que nos é fornecida uma lista de todos os utilizadores, mas queremos dividi-los em 2 grupos e obter os utilizadores do segundo grupo.

Podemos fazer isso graças ao Python, armazenando a resposta numa variável chamada users, que podemos converter numa matriz de objetos JSON utilizando o método json.loads(), sobre o qual pode encontrar mais informações aqui. Depois disso, podemos iterar pela matriz de utilizadores e exibir apenas os utilizadores na segunda metade da lista ou aqueles cujos números de identificação sejam maiores do que a metade da lista. Para uma melhor compreensão, eis como isto se traduz em código:

import subprocess
import json

def cURL(url):
   return subprocess.check_output(['curl',url])

users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))

for user in users:
   if(user['id'] > len(users) / 2): print(user)

Provavelmente reparou que, em vez de os, estamos agora a utilizar as bibliotecas subprocess e json. Estamos a utilizar a biblioteca subprocess porque queremos poder guardar a saída do comando, ao contrário do módulo os, que apenas executa o comando sem o armazenar. O código é um simples pedido GET a uma API que nos devolve uma lista de utilizadores sob a forma de objetos JSON. A saída deve ser:

{'id': 6, 'name': 'Mrs. Dennis Schulist', 'username': 'Leopoldo_Corkery', 'email': 'Karley_Dach@jasper.info', 'address': {'street': 'Norberto Crossing', 'suite': 'Apt. 950', 'city': 'South Christy', 'zipcode': '23505-1337', 'geo': {'lat': '-71.4197', 'lng': '71.7478'}}, 'phone': '1-477-935-8478 x6430', 'website': 'ola.org', 'company': {'name': 'Considine-Lockman', 'catchPhrase': 'Synchronised bottom-line interface', 'bs': 'e-enable innovative applications'}}

{'id': 7, 'name': 'Kurtis Weissnat', 'username': 'Elwyn.Skiles', 'email': 'Telly.Hoeger@billy.biz', 'address': {'street': 'Rex Trail', 'suite': 'Suite 280', 'city': 'Howemouth', 'zipcode': '58804-1099', 'geo': {'lat': '24.8918', 'lng': '21.8984'}}, 'phone': '210.067.6132', 'website': 'elvis.io', 'company': {'name': 'Johns Group', 'catchPhrase': 'Configurable multimedia task-force', 'bs': 'generate enterprise e-tailers'}}

{'id': 8, 'name': 'Nicholas Runolfsdottir V', 'username': 'Maxime_Nienow', 'email': 'Sherwood@rosamond.me', 'address': {'street': 'Ellsworth Summit', 'suite': 'Suite 729', 'city': 'Aliyaview', 'zipcode': '45169', 'geo': {'lat': '-14.3990', 'lng': '-120.7677'}}, 'phone': '586.493.6943 x140', 'website': 'jacynthe.com', 'company': {'name': 'Abernathy Group', 'catchPhrase': 'Implemented secondary concept', 'bs': 'e-enable extensible e-tailers'}}

{'id': 9, 'name': 'Glenna Reichert', 'username': 'Delphine', 'email': 'Chaim_McDermott@dana.io', 'address': {'street': 'Dayna Park', 'suite': 'Suite 449', 'city': 'Bartholomebury', 'zipcode': '76495-3109', 'geo': {'lat': '24.6463', 'lng': '-168.8889'}}, 'phone': '(775)976-6794 x41206', 'website': 'conrad.com', 'company': {'name': 'Yost and Sons', 'catchPhrase': 'Switchable contextually-based project', 'bs': 'aggregate real-time technologies'}}

{'id': 10, 'name': 'Clementina DuBuque', 'username': 'Moriah.Stanton', 'email': 'Rey.Padberg@karina.biz', 'address': {'street': 'Kattie Turnpike', 'suite': 'Suite 198', 'city': 'Lebsackbury', 'zipcode': '31428-2261', 'geo': {'lat': '-38.2386', 'lng': '57.2232'}}, 'phone': '024-648-3804', 'website': 'ambrose.net', 'company': {'name': 'Hoeger LLC', 'catchPhrase': 'Centralized empowering task-force', 'bs': 'target end-to-end models'}}

Esta é apenas uma das utilizações do cURL em Python. Já não dependemos da API para enviar dados de volta da forma que queremos; podemos processá-los de muitas maneiras diferentes, como, por exemplo, verificar se uma pessoa está numa lista de respostas com base no seu nome, e-mail, número de telefone ou qualquer outra propriedade única de uma pessoa. 

Por exemplo, digamos que queremos verificar se um nome específico existe ou não numa lista. Para isso, podemos criar uma função que receba a resposta que convertemos numa matriz JSON pronta para ser analisada pelo Python.

import subprocess
import json

def cURL(url):
   return subprocess.check_output(['curl',url])

users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))

def check_if_user_exists(users,name):
   for user in users:
       if(user['name'] == name): print(f'An user called {name} exists in the list and has the id of {user["id"]}')

check_if_user_exists(users,'Clementina DuBuque')

Este bloco de código irá então dar-nos este resultado:

An user called Clementina DuBuque exists in the list and has the id of 10

Parabéns. Criou um script que obtém dados de um servidor, os armazena e os analisa posteriormente. As vantagens de usar Python não param por aqui; o Python tem até uma interface especial concebida para usar o cURL, chamada PycURL, e vamos falar sobre ela agora.

O que é o PycURL?

Como mencionámos anteriormente, o PycURL é, em resumo, uma ferramenta Python que nos ajuda a utilizar o cURL de forma mais natural. Uma grande vantagem é que o PycURL é altamente otimizado e suporta concorrência, o que significa que é muito rápido (mais rápido do que a popular biblioteca request do Python). Por outro lado, usar o PycURL não é tão fácil como vimos anteriormente, sendo uma ferramenta destinada a programadores avançados. No entanto, não se deve sentir intimidado por isso, porque, no final, irá adquirir uma compreensão mais profunda das redes e ficará mais à vontade com o Python.

Como instalá-lo?

Tal como qualquer outro pacote, pode instalá-lo com o pip: 

$ pip install pycurl 

Desta vez, também é aconselhável instalar o certifi por motivos de segurança ao utilizar o pycurl. O certifi é uma ferramenta que valida certificados SSL enquanto verifica a identidade do host TLS. Para saber mais sobre o certifi, recomendo vivamente que consulte a documentação. Pode instalá-lo da mesma forma: 

$ pip install certifi

Pode agora testar se a instalação foi bem-sucedida executando o seguinte script: 

import certifi
print(certifi.where())

A saída deve ser a localização onde o pacote foi instalado:

/usr/local/lib/python3.10/site-packages/certifi/cacert.pem

Como utilizar o pycURL?

A diferença em relação ao que fizemos anteriormente é que agora estamos apenas a escrever código sem executar comandos diretamente. Resumidamente, criamos uma instância da classe pycurl.Curl(), obtemos os dados e gravamo-los num buffer que mais tarde iremos descodificar para poder ler os dados recebidos:

import pycurl
import certifi
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://docs.webscrapingapi.com/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()

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

Adivinhou, tal como nos nossos exemplos anteriores, isto obtém o conteúdo HTML da página WebScrapingAPI e imprime-o na linha de comandos.

Um pedido POST não é muito diferente, exceto que precisa de indicar à sua instância da classe pycurl.Curl() que vai utilizar um método POST, definir o corpo e os cabeçalhos, se for o caso. É assim que fica:

​​import pycurl
import certifi
import json
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://httpbin.org/post')
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])
data = json.dumps({"foo": "bar"})

c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

c.perform()
c.close()

body = buffer.getvalue()

print(body.decode('iso-8859-1'))

E devemos receber, tal como antes, uma resposta contendo o seu pedido, endereço IP, parâmetros e corpo:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{foo:bar}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "9", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/X.XX.X", 
    "X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
  }, 
  "json": null, 
  "origin": "0.0.0.0", 
  "url": "https://httpbin.org/post"
}

Como já mencionei, estas são apenas algumas das coisas básicas que o pycURL pode fazer por nós. É uma ferramenta muito complexa e sofisticada sobre a qual poderíamos escrever muitos artigos. Se quiseres explorar mais coisas que podes fazer com ela, recomendo vivamente que consultes a documentação.

Resumo

Em conclusão, usar o cURL em Python é muito eficaz e poupa muito tempo; além disso, pode ser um ponto de partida para alguns projetos interessantes em tópicos como análise de dados ou web scraping. A abordagem que recomendo é primeiro familiarizar-se com o cURL e o Python e, depois, avançar e usar o pycURL. Espero que tenha achado este recurso útil para aprender a usar o cURL em Python e que experimente com ele e crie alguns scripts.

Sobre o autor
Andrei Ogiolan, Desenvolvedor Full Stack @ WebScrapingAPI
Andrei OgiolanDesenvolvedor Full Stack

Andrei Ogiolan é um programador Full Stack na WebScrapingAPI, contribuindo em todas as áreas do produto e ajudando a criar ferramentas e funcionalidades fiáveis para a plataforma.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.