Descubra como utilizar o cURL em Python

Andrei Ogiolan em 12 de dezembro de 2022

O que é o cURL?

Para atingir o objetivo deste artigo, que é aprender a utilizar o cURL em Python, precisamos primeiro de introduzir o cURL. O URL do cliente (cURL) é, para abreviar, uma linha de comando fácil de usar projetada para desenvolvedores buscarem dados de um servidor.

Como utilizar o cURL?

Como já referi anteriormente, a utilização do cURL é bastante simples e pode extrair informações com apenas um comando de uma linha. Em primeiro lugar, é necessário abrir um terminal e escrever curl seguido de um link de um sítio Web, por exemplo:

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

Parabéns, você fez sua primeira solicitação usando cURL. Esse comando simples solicita informações do servidor, assim como um navegador tradicional faz, e retorna o HTML da página. Nem todos os sítios Web devolvem o HTML, existem pontos de extremidade que enviam dados como um objeto JSON. Veja este exemplo:

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

Escreva este comando no seu terminal e deverá obter esta resposta:

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

A maioria das API's devolve-lhe 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 dê uma vista de olhos na documentação do cURL para compreender melhor os seus parâmetros. Em alternativa, pode executar o seguinte comando:

$ curl --help

Isto mostrar-lhe-á algumas opções que pode definir para o 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 não são todas as opções que pode definir para o cURL, é um menu dividido em categorias. Provavelmente adivinhou que, para obter todas as opções que gostaria de executar:

$ curl --help all

Como usar o cURL em Python?

Para este passo, existem 2 pré-requisitos. O primeiro é bastante óbvio, deves instalar o Python na tua máquina. Você pode fazer isso navegando até o site oficial do Python e instalar a versão apropriada para o seu sistema operacional. Certifique-se de que seja uma versão nova, pois as mais antigas provavelmente não incluirão o pip, que é necessário para a maioria dos pacotes que vamos querer usar. Em seguida, execute o seguinte comando:

 $ pip --versão

Após a instalação bem-sucedida, isso deve fornecer a versão do pip que você instalou. 

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

O "pip" não é considerado um comando externo ou interno. Um ficheiro batch é um programa para operar.

É muito importante que tenha o pip instalado para poder prosseguir, uma vez que vai precisar dele para instalar pacotes.

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

Porquê usar cURL em Python?

Deve estar a perguntar-se: não basta utilizar o cURL a partir da linha de comandos? Estamos a executar apenas uma linha de comando e a API devolve-nos a informação, o que é correto, mas no mundo real vamos querer processar de alguma forma os dados que estamos a receber do servidor e é por isso que precisamos de uma linguagem de programação.

Porquê utilizar Python?

Python é uma linguagem de programação de alto nível utilizada para muitos fins. A sua sintaxe simples e a sua simplicidade fazem com que seja muito fácil para os principiantes aprenderem a utilizá-la. Para além disso, tem uma enorme comunidade pronta a ajudá-lo, pelo que, caso encontre algum problema, não deve hesitar em fazer uma pergunta. Um ótimo sítio onde pode fazer uma pergunta é o StackOverflow e alguém irá certamente entrar em contacto consigo.

Como integrar cURL em Python

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

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

Agora vamos ver a verdadeira vantagem de usar uma linguagem de programação. Podemos construir uma função que pode pegar um URL personalizado e executar o comando curl contra ele:

import os

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

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

Pode substituir https://www.webscrapingapi.com/blog/ por qualquer outro sítio Web a partir do qual pretenda obter dados. Parabéns, neste ponto criaste um script que recebe um url, executa o comando cURL e apresenta o resultado na consola. Pode executar Python diretamente no terminal, mas para uma melhor experiência de programação recomendo vivamente que utilize um Ambiente de Desenvolvimento Integrado. Há muitas escolhas que podes fazer, mas para Python recomendo o PyCharm que podes descarregar a partir daqui

Como eu já mencionei acima, o cURL não se limita a isso, ele pode fazer uma grande quantidade de coisas além de enviar pedidos GET. 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 viu, o comando fica um pouco diferente quando envia um pedido POST. No pedido anterior, não foi necessário utilizar os parâmetros -X e -data porque o método predefinido do cURL é GET. Depois de executar este comando, deve receber da API httpbin uma resposta que contém o seu pedido, o endereço IP, os parâmetros e o corpo que submeteu, que seria algo do género.

{
"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"
}

Neste ponto, já construíste uma ferramenta simples que pode 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 o escrever manualmente. No entanto, este é um pequeno benefício que temos ao usar cURL em Python. O maior benefício é que agora podemos processar os dados da maneira que quisermos, mesmo que a API não nos dê uma opção para obtê-los da maneira que gostaríamos. Por exemplo, digamos que nos é dada uma lista de todos os utilizadores, mas queremos dividi-los em dois 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 objectos JSON utilizando o método json.loads(), sobre o qual pode encontrar mais informações aqui. Depois disso, podemos iterar através do array de utilizadores e mostrar apenas os utilizadores na segunda metade da lista ou com os seus números de identificação superiores ao meio da lista. Para uma melhor compreensão, é assim que 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 o resultado do comando, ao contrário do módulo os que apenas executa o comando sem o guardar. O código é um simples pedido de get a uma API que nos devolve uma lista de utilizadores sob a forma de objectos 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'}}

Este é apenas um dos usos 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 mostrar 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 gostaríamos de verificar se existe ou não um nome com um nome específico numa lista. Para isso, podemos criar uma função que recebe a resposta que convertemos numa matriz JSON pronta a 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 devolver-nos-á este resultado:

Um utilizador chamado Clementina DuBuque existe na lista e tem o id de 10

Parabéns. Criou um script que vai buscar dados a um servidor, armazena-os e analisa-os depois. As vantagens de usar Python não param por aqui, Python até tem uma interface especial desenhada para usar cURL que se chama PycURL e que vamos discutir agora.

O que é o PycURL?

Como mencionámos anteriormente, o PycURL é, resumidamente, uma ferramenta Python que nos ajuda a utilizar o cURL de forma mais natural. Uma grande vantagem é que o PycURL é fortemente optimizado e suporta concorrência, o que significa que é muito rápido (mais rápido do que a popular biblioteca de pedidos Python). Por outro lado, o uso do PycURL não é tão fácil de usar como o que vimos anteriormente, sendo uma ferramenta direcionada para um programador avançado, mas não se deve sentir intimidado por isso, porque no final vai ganhar uma compreensão mais profunda das redes e vai ficar mais confortável com o Python.

Como instalá-lo?

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

$ pip install pycurl 

Desta vez, também gostaria de instalar o certifi para fins de segurança ao usar o pycurl. O certifi é uma ferramenta que valida certificados SSL enquanto verifica a identidade do host TLS. Para saber mais sobre o certifi, sugiro vivamente que consulte os seus documentos. Pode instalá-lo da mesma forma: 

$ pip install certifi

Pode testar agora a instalação com êxito executando o seguinte script: 

import certifi
print(certifi.where())

A saída deve ser o local 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. Resumindo, criamos uma instância da classe pycurl.Curl() , vamos buscar os dados e escrevê-los num buffer que mais tarde vamos descodificar para podermos 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 exemplos anteriores, isto vai buscar o conteúdo HTML da página WebScrapingAPI e imprimi-lo na linha de comandos.

Um pedido POST não é muito diferente, exceto que tem de dizer à sua instância da classe pycurl.Curl() que vai utilizar um método post, definir o seu corpo e cabeçalhos, se for esse o caso:

​​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 de volta, tal como antes, uma resposta que contém 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, existem apenas algumas coisas básicas que o pycURL pode fazer por nós. É uma ferramenta muito complexa e sofisticada sobre a qual podemos escrever muitos artigos. Se quiser explorar mais coisas que pode fazer com ele, encorajo-o vivamente a consultar os seus documentos.

Resumo

Em conclusão, a utilização do cURL em Python é muito eficaz e poupa muito tempo e, para além disso, pode ser um ponto de partida para alguns projectos interessantes em tópicos como a análise de dados ou a raspagem da Web. A abordagem que recomendo é começar por se sentir confortável com o cURL e o Python e depois avançar e utilizar o pycURL. Espero que tenha achado este recurso útil para aprender a usar o cURL em Python e que possa brincar com ele e construir alguns scripts.

Notícias e actualizações

Mantenha-se atualizado com os mais recentes guias e notícias sobre raspagem da Web, subscrevendo a nossa newsletter.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artigos relacionados

miniatura
GuiasTutorial do Scrapy Splash: Dominando a arte de raspar sites renderizados em JavaScript com Scrapy e Splash

Aprenda a extrair sites dinâmicos renderizados em JavaScript usando o Scrapy e o Splash. Desde a instalação até à escrita de um spider, à manipulação da paginação e à gestão das respostas do Splash, este guia abrangente oferece instruções passo a passo tanto para principiantes como para especialistas.

Ștefan Răcila
avatar do autor
Ștefan Răcila
6 min. de leitura
miniatura
Casos de utilizaçãoUtilização de Web Scraping para dados alternativos em finanças: Um guia completo para investidores

Explore o poder transformador da recolha de dados da Web no sector financeiro. Desde dados de produtos a análises de sentimentos, este guia oferece informações sobre os vários tipos de dados da Web disponíveis para decisões de investimento.

Mihnea-Octavian Manolache
avatar do autor
Mihnea-Octavian Manolache
13 min ler
miniatura
GuiasGuia de início rápido da API de raspagem da Web

Comece a utilizar o WebScrapingAPI, a derradeira solução de raspagem da Web! Recolha dados em tempo real, contorne sistemas anti-bot e beneficie de apoio profissional.

Mihnea-Octavian Manolache
avatar do autor
Mihnea-Octavian Manolache
9 min. de leitura