Voltar ao blogue
Guias
Mihnea-Octavian ManolacheLast updated on Mar 31, 20269 min read

Como utilizar o CURL com Python para a extração de dados da Web

Como utilizar o CURL com Python para a extração de dados da Web

A ação mais básica que qualquer aplicação de web scraping tem de realizar é, em primeiro lugar, recolher o ficheiro HTML e só depois concentrar-se na sua manipulação. É claro que existem diferentes formas de o conseguir. No entanto, no artigo de hoje, vamos descobrir como utilizar o cURL com Python para criar um web scraper. Aqui fica uma antevisão de apenas uma pequena parte do que irá aprender após ler este artigo:

  • O que é o cURL e como aceder a partir da linha de comandos
  • Como usar o comando cURL para recolher informações de qualquer site
  • Como usar o cURL em Python para criar um web scraper simples

Como usar o cURL com Python?

Resumidamente, o cURL é principalmente uma ferramenta de linha de comandos utilizada para obter dados de um servidor. Sei que, ao mencionar a linha de comandos, as coisas podem parecer complicadas. No entanto, posso garantir-lhe que, na prática, como irá descobrir ao longo deste artigo, o cURL é talvez uma das ferramentas mais fáceis que alguma vez utilizará como programador.

Para usar o cURL a partir da linha de comando, basta abrir uma nova janela de terminal e digitar `curl` seguido da URL que pretende extrair. Por exemplo:

~ » curl 'https://api.ipify.org?format=json'

Este comando simples está a aceder à API do ipify, solicitando informações ao servidor, tal como um navegador tradicional faria. O resultado deste exemplo será um objeto JSON contendo o seu endereço IP. Embora possa não parecer, acabou de construir a infraestrutura para um futuro web scraper. Tudo isto numa única linha de código.

O cURL é, na verdade, uma ferramenta mais avançada. Se quiser saber mais sobre como usar o curl, pode consultar a documentação oficial. Também pode usar a opção `--help` e ler sobre as várias opções disponíveis. 

Como usar o cURL para obter ficheiros HTML

No exemplo acima, a resposta que recebemos do servidor ipify foi um ficheiro JSON. Isso deve-se ao facto de este endpoint de API específico devolver dados no formato JSON. Em termos de web scraping, irá normalmente deparar-se com sites tradicionais que servem ficheiros HTML, dos quais terá então de analisar e extrair dados.

No entanto, por enquanto, o nosso foco não é a manipulação de dados, mas sim a extração de dados. E sabemos que podemos usar o cURL para fazer web scraping, mas como é que o fazemos na prática? Bem, se ainda não ficou curioso e não experimentou, basta pedir ao curl para aceder a qualquer URL genérica que saiba que seria um site tradicional baseado em HTML. Vamos tomar como exemplo o httpbin.org:

curl 'https://httpbin.org/forms/post'

Digite esse comando no seu terminal e receberá o HTML simples como resposta:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
  <!-- Example form from HTML5 spec http://www.w3.org/TR/html5/forms.html#writing-a-form's-user-interface -->
  <form method="post" action="/post">
   <p><label>Customer name: <input name="custname"></label></p>
   <p><label>Telephone: <input type=tel name="custtel"></label></p>
   <p><label>E-mail address: <input type=email name="custemail"></label></p>
   <fieldset>
    <legend> Pizza Size </legend>
    <p><label> <input type=radio name=size value="small"> Small </label></p>
    <p><label> <input type=radio name=size value="medium"> Medium </label></p>
    <p><label> <input type=radio name=size value="large"> Large </label></p>
   </fieldset>
   <fieldset>
    <legend> Pizza Toppings </legend>
    <p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
    <p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
    <p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
    <p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
   </fieldset>
   <p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery"></label></p>
   <p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
   <p><button>Submit order</button></p>
  </form>
  </body>
</html>

Como usar o cURL em Python

Como viu, extrair dados com o cURL é uma solução simples e não requer programação propriamente dita. Trata-se simplesmente de enviar um comando e receber algumas informações. Se quiser construir um projeto real de web scraping, terá de utilizar de alguma forma os dados que recolheu. E, como somos programadores, queremos manipular os dados programaticamente. É aqui que o Python entra em cena.

Porquê escolher Python para um projeto de web scraping

Sem dúvida, o Python é uma das linguagens de programação mais populares. Não só é muito poderoso, como a sua sintaxe simples torna-o perfeito para programadores iniciantes. Tem também uma excelente comunidade que está sempre pronta a intervir e ajudar. Por isso, se em algum momento se deparar com um problema e ficar bloqueado, não hesite em fazer uma pergunta no Stackoverflow, por exemplo, e alguém irá certamente ajudá-lo. 

No que diz respeito ao web scraping em particular, o Python é uma excelente escolha devido a todos os pacotes que inclui. Como verá mais adiante neste artigo, a manipulação de dados requer a análise dos ficheiros HTML, de modo a que possa depois «extrair» os elementos e obter apenas a informação que procura nessa página web específica.

Web Scraping com cURL e Python

Até agora, descobrimos como usar o curl no terminal, mas como é que o integramos efetivamente com o Python? Bem, na verdade, existem várias formas de abordar isto. Por exemplo, pode usar o módulo `os` do Python e enviar comandos de terminal:

import os
curl = os.system(f'curl "https://httpbin.org/forms/post"')
print(curl)

Ou pode até criar a sua própria função em torno disso e utilizá-la ao longo do projeto:

import os
def curl(website):
return os.system(f'curl "{website}"')

print(curl('https://httpbin.org/forms/post'))

No entanto, como disse, um dos maiores pontos fortes do Python é a diversidade de pacotes. Como o cURL é muito mais diversificado, a nossa função teria de ser muito mais complexa para acomodar todas as suas funcionalidades. Por isso, em vez de reinventar a roda, recomendo que usemos um pacote existente para integração do cURL no Python: o PycURL.

O que é o PycURL e como instalá-lo

De acordo com o seu site, o PycURL é uma interface para a biblioteca cURL, herdando assim todas as capacidades da libcURL. Em suma, o PycURL é o meio pelo qual utilizaremos o cURL em Python. No que diz respeito à instalação, tal como com qualquer outro pacote Python, utilizaremos o pip. Se não estiver familiarizado com o pip, trata-se de um sistema de gestão de pacotes para Python e os programadores Python utilizam-no constantemente para instalar rapidamente dependências.

Dito isto, para instalar o PycURL, basta adicionar o seguinte comando no seu terminal:

~ » pip install pycurl

Análise de HTML usando o BeautifulSoup

Já que estamos a falar de dependências e do pip, vale a pena mencionar que a comunidade Python criou várias soluções para a análise de HTML. Um dos pacotes de análise de HTML mais populares é o BeautifulSoup. Na WebScrapingAPI, dedicámos uma publicação inteira no blogue sobre como extrair e analisar dados da web com Python e BeautifulSoup

Tal como com o PycURL, a instalação do BeautifulSoup requer apenas um comando:

~ » pip install beautifulsoup4

Como criar um web scraper com Python e cURL

Agora que já abordámos a parte teórica e sabemos como utilizar o cURL tanto no terminal como em Python, vamos passar diretamente à programação. Nesta secção, vamos aprender a utilizar o curl em Python através da criação de um verdadeiro web scraper. Portanto, sem mais delongas, que comece a programação!

1. Configurar o diretório

Como engenheiro de software, é importante estruturar os nossos projetos de forma a que sejam fáceis de manter e ler, tanto por nós próprios como por outros programadores. Para manter tudo organizado, vamos começar por criar um novo diretório que irá conter todos os ficheiros do nosso projeto. Abra uma nova janela de terminal, use o comando `cd` para aceder ao Desktop e crie uma nova pasta chamada `py_scraper`:

~ » cd desktop && mkdir py_scraper && cd py_scraper

Deixem-me explicar brevemente os comandos que usámos até agora:

  • `cd` - mudar de diretório atual
  • `&&` - executa o comando seguinte apenas se o anterior for bem-sucedido
  • `mkdir` - criar novo diretório

Abra o seu projeto no seu IDE preferido e crie um novo ficheiro chamado «scraper.py» dentro do diretório `py_scraper`. Dica: também pode fazê-lo a partir da linha de comandos usando este comando:

~/desktop/py_scraper » touch scraper.py && code .

Se estiver a usar o VSCode (como eu), será agora apresentada uma janela que deverá ter este aspeto:

2. Instalação de pacotes

O seu terminal deve agora estar dentro do diretório `py_scraper`.  A última coisa que precisamos de fazer antes de codificar o scraper propriamente dito é instalar os pacotes que apresentámos anteriormente e mais um. No entanto, queremos mantê-los apenas dentro do diretório `py_scraper` (e não os ter instalados globalmente). Para tal, teremos de utilizar os ambientes virtuais do Python. Estes permitem-nos isolar o interpretador Python, as bibliotecas e os scripts instalados.

Para configurar um novo ambiente virtual dentro do diretório `py_scraper`, use o seguinte comando:

~/desktop/py_scraper » python3 -m venv env

Isto irá criar uma nova pasta `env` que precisamos de ativar antes de instalar os pacotes desejados. Ative-a utilizando este comando:

~/desktop/py_scraper » source env/bin/activate

Agora que criou e ativou o seu ambiente virtual, só falta instalar os pacotes necessários utilizando os comandos pip que apresentámos anteriormente.

~/desktop/py_scraper » pip install pycurl beautifulsoup4 certify

3. Criar o Web Scraper em Python e cURL

Agora está tudo pronto para utilizar o PycURL e o BeautifulSoup. Para utilizar estes pacotes, precisamos primeiro de os importar para o nosso ficheiro `scraper.py`. Basta adicionar este trecho no topo do ficheiro:

import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup

# All our logic will go underneath this line

Agora que importou os pacotes, vamos lidar com a lógica do nosso web scraper. Pelo que discutimos até agora, sabemos que precisamos de abordar dois aspetos: extração de dados e tratamento de dados. A primeira secção é coberta pelo PycURL e a segunda secção é coberta pelo BeautifulSoup. Para uma melhor estrutura, sugiro que tratemos cada secção separadamente.

3.1. Extração de dados com cURL e Python

Quando digo «scraping», estou a referir-me à parte de extração do web scraper. Tendo isto em mente e sabendo como usar o curl em Python através da interação com a interface PycURL, vamos escrever o código:

# Setting global variables
TARGET_URL = 'https://httpbin.org/forms/post'

# Using cURL and Python to gather data from a server via PycURL
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, TARGET_URL)
curl.setopt(curl.WRITEDATA, buffer)
curl.setopt(curl.CAINFO, certifi.where())
curl.perform()
curl.close()

# Using BytesIO to retrieve the scraped data
body = buffer.getvalue()

# Saving the output and printing it in terminal
data = body.decode('iso-8859-1')
print(data)

No código acima, começamos por declarar a variável global `TARGET_URL`, que contém o URL do site do qual queremos extrair dados. Em seguida, criamos um buffer usando `BufferIO`, inicializamos o PycURL e definimos duas opções: uma para a transferência de dados e outra para o nome do ficheiro que contém os certificados. Por último, mas não menos importante, executamos a ação curl e, em seguida, encerramos a sessão. 

É isso, utilizou com sucesso o Python para fazer um pedido cURL e imprimiu o ficheiro HTML na sua consola. Agora, tudo o que precisamos de fazer é tratar da segunda secção, nomeadamente o tratamento de dados.

3.2. Análise de HTML com Python e BeautifulSoup

Ter os dados brutos é redundante na extração de dados da web, a menos que realizemos algum tipo de ação sobre eles. Pois o objetivo mais básico de qualquer extrator de dados da web é extrair dados do HTML. Para o nosso exemplo, vamos supor que queremos extrair todo o texto dentro dos elementos `<p>` da variável `data` (que atualmente contém todo o HTML extraído). Eis como fazemos isso usando o BeautifulSoup:

# Parsing data using BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Finding elements using BeautifoulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Como pode ver, com o BeautifulSoup, bastam apenas 4 linhas de código para extrair o resultado desejado. A execução do script completo deverá agora apresentar o texto dentro de cada parágrafo encontrado no ficheiro HTML que recolhemos do nosso site de destino. 

Assim, partindo do princípio de que seguiu as instruções e que o seu `scraper.py` inclui todo o código que escrevemos nesta secção, vamos voltar ao terminal e executar o script:

~/desktop/py_scraper » python3 scraper.py
Customer name: 
Telephone: 
E-mail address: 
  Small 
  Medium 
  Large 
  Bacon 
  Extra Cheese 
  Onion 
  Mushroom 
Preferred delivery time: 
Delivery instructions: 
Submit order

Conclusão

Construir um web scraper com Python e cURL é um projeto muito útil e pode ser o ponto de partida para uma aplicação de web scraping maior. A abordagem recomendada para integrar as duas tecnologias é utilizar o PycURL. Também pode escrever a sua própria interface ou função para interagir com o cURL em Python. Só demora um pouco mais de tempo e esforço :).

Espero que este artigo tenha sido um bom recurso para aprender a usar o cURL, como utilizá-lo com Python e construir um web scraper básico. Além disso, convido-te a ajustar o código e torná-lo teu, para que tenhas mais um projeto para adicionar ao teu portfólio.

Sobre o autor
Mihnea-Octavian Manolache, Desenvolvedor Full Stack @ WebScrapingAPI
Mihnea-Octavian ManolacheDesenvolvedor Full Stack

Mihnea-Octavian Manolache é engenheiro Full Stack e DevOps na WebScrapingAPI, onde desenvolve funcionalidades do produto e mantém a infraestrutura que garante o bom funcionamento da 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.