Voltar ao blogue
Guias
Mihnea-Octavian Manolache30 de novembro de 202211 min de leitura

Como usar CURL com Python para Web Scraping

Como usar CURL com Python para Web Scraping

Como usar CURL com Python?

Resumidamente, o cURL é sobretudo uma ferramenta de linha de comandos utilizada para ir buscar dados a um servidor. Eu sei que, ao mencionar a linha de comando, as coisas podem parecer complicadas. No entanto, posso assegurar-lhe que, na prática, como irá descobrir ao longo deste artigo, o cURL é talvez uma das ferramentas mais fáceis que alguma vez irá 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 deseja extrair. Por exemplo:

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

Este simples comando está a aceder à API do ipify, solicitando informações do servidor, tal como um browser tradicional faria. O resultado deste exemplo será um objeto JSON que contém o seu endereço IP. Mesmo que não pareça, acabou de construir a infraestrutura para um futuro web scraper. Tudo em apenas uma linha de código.

O cURL é de facto uma ferramenta mais avançada. Se quiser aprender 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. Isto deve-se ao facto de este ponto de extremidade da API em particular devolver dados no formato JSON. Em termos de raspagem da Web, normalmente depara-se com sítios Web tradicionais que fornecem ficheiros HTML, dos quais terá de analisar e extrair dados.

No entanto, por agora, 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 extrair dados de sites, mas como é que o fazemos? Bem, se ainda não ficou curioso e tentou, basta pedir ao curl para aceder a qualquer URL genérico que saiba ser um site tradicional baseado em HTML. Tomemos como exemplo 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 cURL em Python 

Como viu, a extração de dados com cURL é uma solução simples e não requer qualquer codificação. É simplesmente uma questão de enviar um comando e receber alguma informação. Se quiser construir um verdadeiro projeto de web scraping, terá de utilizar de alguma forma os dados recolhidos. E como somos programadores, queremos manipular os dados de forma programática. É aqui que o Python entra em ação.

Porquê escolher Python para um projeto de Web Scraping

Sem dúvida, Python é uma das linguagens de programação mais populares. Para além de ser muito poderosa, a sua sintaxe simples torna-a perfeita para programadores principiantes. Além disso, tem uma grande comunidade que está sempre pronta a intervir e a ajudar. Por isso, se em qualquer altura se deparar com um problema e ficar bloqueado, não hesite em colocar uma questão no Stackoverflow, por exemplo, e alguém o ajudará de certeza. 

No que diz respeito à recolha de dados da Web, em particular, o Python é uma óptima escolha devido a todos os pacotes que o acompanham. Como verá mais adiante neste artigo, a manipulação de dados requer a análise dos ficheiros HTML, de modo a poder "extrair" os elementos e extrair apenas a informação que pretende dessa página Web específica.

Web Scraping com cURL e Python

Até agora, descobrimos como usar o curl no terminal, mas como integrá-lo ao Python? Bem, existem várias maneiras de fazer isso. Por exemplo, você 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 mesmo construir a sua própria função em torno dela e utilizá-la em todo o projeto:

import os  
def curl(website):     
    return os.system(f'curl "{website}"')
  
print(curl('https://httpbin.org/forms/post'))

No entanto, como eu disse, um dos maiores pontos fortes do Python é a diversidade de pacotes. Como o cURL é muito mais diversificado, nossa função precisaria ser muito mais complexa para acomodar todas as suas caraterísticas. Então, ao invés de reinventar a roda, eu recomendo que usemos um pacote existente para integração do cURL em Python: PycURL.

O que é o PycURL e como instalá-lo

De acordo com o site deles, PycURL é uma interface para a biblioteca cURL, herdando assim todas as capacidades da libcURL. Em resumo, o PycURL é o meio pelo qual usaremos o cURL em Python. Quando se trata de instalá-lo, como com qualquer outro pacote Python, usaremos o pip. Se você não está familiarizado com o pip, ele é um sistema de gerenciamento de pacotes para Python e os desenvolvedores Python o usam o tempo todo para instalar dependências rapidamente.

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

~ " pip install pycurl 

Analisando HTML usando BeautifulSoup

Já que estamos discutindo dependências e pip, também vale a pena mencionar que a comunidade Python criou algumas soluções para análise de HTML. Um dos pacotes de análise de HTML mais populares é o BeautifulSoup. Na WebScrapingAPI, nós dedicamos um post inteiro sobre como extrair e analisar dados da web com Python e BeautifulSoup

Assim como no PycURL, a instalação do BeautifulSoup requer apenas um comando:

~ " pip install beautifulsoup4

Como construir um Web Scraper com Python e cURL

Agora que já cobrimos a parte teórica e sabemos como usar o cURL tanto no terminal quanto em Python, vamos pular direto para a codificação. Nesta secção, vamos aprender como usar o curl em Python, construindo um web scraper real. Então, sem mais delongas, que comece o jogo de programação!

1. Configurar o diretório

Como engenheiro de software, é importante estruturar os nossos projectos de modo a que sejam fáceis de manter e de ler por nós próprios e também 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, `cd` no Desktop e crie uma nova pasta chamada `py_scraper`:

~ " cd desktop && mkdir py_scraper && cd py_scraper

Deixe-me explicar brevemente os comandos que utilizámos até agora:

  • `cd` - muda o diretório atual
  • `&&` - executa o comando seguinte apenas se o anterior for bem sucedido
  • `mkdir` - cria um novo diretório

Abra seu projeto em sua IDE favorita e crie um novo arquivo chamado 'scraper.py' dentro do diretório `py_scraper`. Dica: Você também pode fazer isso a partir da linha de comando, usando este comando:

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

Se estiver a utilizar o VSCode (como eu faço), ser-lhe-á apresentada uma janela com o seguinte aspeto:

Janela do editor de código Dark aberta num ficheiro Python em branco chamado scraper.py

2. Instalar os pacotes

Seu terminal deve estar agora dentro do diretório `py_scraper`. A última coisa que precisamos fazer antes de codificar o scraper é instalar os pacotes que apresentamos anteriormente e mais um. No entanto, queremos contê-los apenas dentro do diretório `py_scraper` (e não tê-los instalados globalmente). Para isso, teremos que 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

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

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

Agora que criou e activou o seu ambiente virtual, tudo o que resta é instalar os pacotes necessários utilizando os comandos pip que apresentámos anteriormente.

~/desktop/py_scraper " pip install pycurl beautifulsoup4 certify

3. Criando o Raspador Web Python e cURL

Agora você está pronto para usar PycURL e BeautifulSoup. Para usar esses pacotes, precisamos primeiro importá-los em nosso arquivo `scraper.py`. Basta adicionar este snippet no topo do arquivo:

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

# Toda a nossa lógica será colocada abaixo desta linha

Agora que importou os pacotes, vamos tratar da lógica do nosso Web scraper. Do que discutimos até agora, sabemos que precisamos de cobrir dois aspectos: 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ção, sugiro que tratemos cada secção separadamente.

3.1. Raspagem 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, interagindo com a interface PycURL, vamos escrever o código:

# Definição de variáveis globais
TARGET_URL = 'https://httpbin.org/forms/post'

# Utilização do cURL e do Python para recolher dados de um servidor através do 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()

# Utilização do BytesIO para recuperar os dados extraídos
body = buffer.getvalue()

# Guardar a saída e imprimi-la no 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 arquivo que contém os certificados. Por último, mas não menos importante, executamos a ação curl e fechamos a sessão depois. 

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

3.2. Analisando HTML com Python e BeautifulSoup

Having the raw data is redundant in web scraping, unless we perform some sort of action on it. As the most basic scope of any web scraper is to extract data from HTML. For our example, let us assume that we want to scrape all text inside the `<p>` elements from the `data` variable (that is currently holding all the scraped HTML). Here is how we do this using BeautifulSoup:

# Análise de dados com o BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
# Localização de elementos com o BeautifulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Como pode ver, com o BeautifulSoup, são necessárias apenas 4 linhas de código para extrair o resultado desejado. A execução do script completo deve agora imprimir o texto dentro de cada parágrafo encontrado no ficheiro HTML que recolhemos do nosso website alvo. 

Então, assumindo 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
Nome do cliente: 
Telefone: 
Endereço de e-mail: 
  Pequena 
  Média 
  Grande 
  Bacon 
  Queijo extra 
  Cebola 
  Cogumelos 
Hora de entrega preferida: 
Instruções de entrega: 
Enviar pedido

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 maior de web scraping. A abordagem recomendada para integrar as duas tecnologias é usar PycURL. Também podes escrever a tua própria interface ou função para interagir com o cURL em Python. Só que isso leva um pouco mais de tempo e esforço :).

Espero que este artigo tenha sido um bom recurso para aprender curl, como usá-lo com Python e construir um web scraper básico. Além disso, convido-vos a alterar o código e a torná-lo vosso, de forma a terem mais um projeto para adicionar ao vosso portfolio.

Sobre o autor
Mihnea-Octavian Manolache, Desenvolvedor Full Stack na 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.