Como usar CURL com Python para Web Scraping

Mihnea-Octavian Manolache em 30 de novembro de 2022

A ação mais básica que qualquer aplicação de recolha de dados da Web tem de executar é começar por recolher o ficheiro HTML e só depois se concentrar na sua manipulação. É claro que existem diferentes maneiras de conseguir isso. No entanto, no artigo de hoje, vamos descobrir Como usar CURL com Python para um web scraper. Aqui está uma prévia de apenas uma fração das coisas que você aprenderá depois de ler este artigo:

  • O que é o cURL e como aceder-lhe a partir da linha de comandos
  • Como utilizar o comando cURL para recolher informações de qualquer sítio Web
  • Como usar o cURL em Python para construir um raspador web simples

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:

  1. `cd` - muda o diretório atual
  2. `&&` - executa o comando seguinte apenas se o anterior for bem sucedido
  3. `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:

imagem do blogue

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 ficará por baixo 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:

# Definindo variáveis globais
TARGET_URL = 'https://httpbin.org/forms/post'

# Usando cURL e Python para coletar dados de um servidor 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()

# Utilizar BytesIO para obter 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:

# Analisar dados usando BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Encontrar elementos usando BeautifoulSoup
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 correio eletrónico:
Pequeno
Médio
Grande
Bacon
Queijo extra
Cebola
Cogumelo
Prazo de entrega preferido:
Instruções de entrega:
Submeter encomenda

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.

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
GuiasAPI de raspagem da Amazon - Guia de início

Faça scraping da Amazon de forma eficiente com a solução económica da Web Scraping API. Aceda a dados em tempo real, desde produtos a perfis de vendedores. Registe-se agora!

WebscrapingAPI
avatar do autor
WebscrapingAPI
8 min. de leitura
miniatura
GuiasComo extrair dados de produtos da Amazon: Um guia abrangente de melhores práticas e ferramentas

Explore as complexidades da extração de dados de produtos da Amazon com nosso guia detalhado. De práticas recomendadas e ferramentas como a API Amazon Scraper a considerações legais, saiba como enfrentar desafios, contornar CAPTCHAs e extrair insights valiosos com eficiência.

Suciu Dan
avatar do autor
Suciu Dan
15 min. de leitura
miniatura
Ciência da recolha de dados da WebScrapy vs. Selenium: Um guia abrangente para escolher a melhor ferramenta de raspagem da Web

Explore a comparação aprofundada entre o Scrapy e o Selenium para raspagem da Web. Desde a aquisição de dados em grande escala até o tratamento de conteúdo dinâmico, descubra os prós, os contras e os recursos exclusivos de cada um. Saiba como escolher a melhor estrutura com base nas necessidades e na escala do seu projeto.

WebscrapingAPI
avatar do autor
WebscrapingAPI
14 min ler