Como construir um Web Crawler em menos de 100 linhas de código

Raluca Penciuc em 13 de agosto de 2021

Vivemos numa era digital e temos acesso a uma tonelada de dados. Com esta informação, podemos compreender melhor a forma como trabalhamos, nos divertimos, aprendemos e vivemos. Não seria bom poder obter informações mais específicas sobre um determinado tópico?

Com este artigo, vamos demonstrar como utilizar o BeautifulSoup e o WebScrapingAPI em conjunto para construir os nossos próprios crawlers para recolher dados direcionados de websites.

Um aviso: a recolha de conteúdos protegidos por direitos de autor ou de informações pessoais é ilegal na maioria dos casos. Para se manter seguro, é melhor obter um consentimento explícito antes de fazer scraping de qualquer sítio, especialmente dos sítios das redes sociais.

O que são os Web crawlers

Existem inúmeros motores de pesquisa e todos nós os utilizamos. Os seus serviços são fáceis de utilizar - basta perguntar algo e eles procuram uma resposta em toda a Web. Por detrás da cortina, é o rastreador Googlebot do Google que torna o motor de pesquisa do Google um sucesso.

Ao procurar páginas na Web de acordo com as palavras-chave introduzidas, os crawlers ajudam os motores de pesquisa a catalogar essas páginas e a devolvê-las mais tarde através da indexação. Os motores de busca dependem dos rastreadores para recolher informações sobre o sítio Web, incluindo URLs, hiperligações, meta tags e artigos, bem como para examinar o texto HTML.

Devido à capacidade do bot de rastrear o que já acedeu, não tem de se preocupar com o facto de ele ficar preso na mesma página Web indefinidamente. A Internet pública e a seleção de conteúdos apresentam vários desafios aos Web crawlers. Todos os dias, os sítios Web existentes publicam dezenas de novas informações e, para não falar do número de novos sítios Web que surgem diariamente, é preciso ter em conta que a Internet pública e a seleção de conteúdos apresentam vários desafios para os Web crawlers.

No final, isso exigiria que pesquisassem milhões de páginas e actualizassem continuamente os seus índices. Os sistemas que analisam o conteúdo dos sítios Web dependem deles, pelo que são essenciais.

Portanto, os crawlers são importantes, mas porquê mencioná-los? Porque vamos construir o nosso próprio bot para ajudar no processo de extração de dados. Desta forma, podemos confiar nele para ir buscar URLs em vez de os escrever manualmente no scraper. Mais automação, uau!

Instalação

Agora que já temos uma compreensão básica dos Web crawlers, pode perguntar-se como é que tudo isto funciona em ação. Bem, vamos lá ver!

Antes de mais, precisamos de configurar o nosso ambiente de trabalho. Certifique-se de que a sua máquina cumpre os seguintes pré-requisitos:

  • python3;
  • Um IDE Python. Este guia irá utilizar o Visual Studio Code porque é leve e não requer qualquer configuração adicional. O código é independente de IDE, por isso pode escolher qualquer IDE com que se sinta confortável;

Por último, mas não menos importante, precisamos de uma chave de API. Pode criar uma conta WSA gratuita, que lhe dará 5000 chamadas de API durante os primeiros 14 dias. Depois de se registar, basta navegar para o seu painel de controlo, onde pode encontrar a sua chave de API e outros recursos valiosos.

imagem do blogue

Desenvolver o rastreador

Ótimo, já temos as ferramentas, por isso estamos mais perto de começar a construir o nosso crawler. Mas como é que o vamos utilizar? A sua implementação pode variar consoante o nosso objetivo final.

Escolha um site e inspeccione o HTML

Para este tutorial, escolhemos um sítio Web de comércio eletrónico que vende produtos de desperdício zero de diferentes utilizações. Vamos navegar por todas as páginas, extrair a lista de produtos de cada página e, finalmente, armazenar os dados num ficheiro CSV para cada página.

Para o fazer, temos primeiro de dar uma vista de olhos à estrutura da página e decidir a nossa estratégia. Clique com o botão direito do rato em qualquer parte da página e, em seguida, em "Inspecionar elemento", e a "Consola do programador" aparecerá. Aqui pode ver o documento HTML do sítio Web, que contém todos os dados de que precisamos.

imagem do blogue

Construir o rastreador

Ok, agora podemos escrever algum código!

Comece por abrir uma janela de terminal no seu IDE e execute o seguinte comando, que instalará a BeautifulSoup, uma biblioteca que nos ajuda a extrair os dados do HTML:

> pip install beautifulsoup4

Em seguida, crie uma pasta chamada "produtos". Esta pasta ajudará a organizar e a armazenar os resultados da recolha de dados em vários ficheiros CSV.

Finalmente, crie o ficheiro "crawler.py". Aqui vamos escrever todo o nosso código e lógica de rastreio. Quando terminarmos, podemos executar o ficheiro com o seguinte comando:

> py crawler.py

Para avançar, vamos importar as bibliotecas de que precisamos e depois definir algumas variáveis globais:

import requests
from bs4 import BeautifulSoup
import csv

BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION

ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"

Agora, vamos definir o ponto de entrada para o nosso rastreador:

def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup, filename)

crawl(FULL_START_URL, 'etee-page1.txt')

Implementamos a função crawl, que irá extrair os documentos HTML através do nosso procedimento get_page_source. Em seguida, construirá o objeto BeautifulSoup que facilitará a nossa análise e chamará a função start_crawling, que começará a navegar no sítio Web.

def get_page_source(url, filename):
params = {
"api_key": API_KEY,
"url": url,
"render_js": '1'
}
page = requests.request("GET", ENDPOINT, params=params)
soup = BeautifulSoup(page.content, 'html.parser')
body = soup.find('body')

file_source = open(filename, mode='w', encoding='utf-8')
file_source.write(str(body))
file_source.close()

return str(body)

As stated earlier, the get_page_source function will use WebScrapingAPI to get the HTML content of the website and will write in a text file in the <body> section, as it’s the one containing all the information we are interested in.

Agora, vamos dar um passo atrás e verificar como atingir os nossos objectivos. Os produtos estão organizados em páginas, pelo que temos de aceder a cada página repetidamente para os extrair a todos.

Isto significa que o nosso rastreador seguirá alguns passos recursivos desde que existam páginas disponíveis. Para colocar esta lógica no código, precisamos de ver como o HTML descreve estas condições.

Se voltar à Consola do Programador, pode ver que cada número de página é, na realidade, uma ligação para uma nova página. Mais do que isso, considerando que estamos na primeira página e não temos nenhuma outra antes desta, a seta para a esquerda está desactivada.

imagem do blogue

Assim, o seguinte algoritmo tem de:

  • Aceder à página;
  • Extrair os dados (implementá-lo-emos na próxima etapa);
  • Localizar o contentor de paginação no documento HTML; verificar se a seta "Página seguinte" está desactivada, parar se estiver e, se não estiver, obter a nova ligação e chamar a função de rastreio para a nova página.
def start_crawling(soup, filename):

extract_products(soup, filename)

pagination = soup.find('ul', {'class': 'pagination-custom'})
next_page = pagination.find_all('li')[-1]

if next_page.has_attr('class'):
if next_page['class'] == ['disabled']:
print("You reached the last page. Stopping the crawler...")
else:
next_page_link = next_page.find('a')['href']
next_page_address = BASE_URL + next_page_link
next_page_index = next_page_link[next_page_link.find('=') + 1]
crawl(next_page_address, f'etee-page{next_page_index}.txt')

Extrair dados e exportar para CSV

Finalmente, vamos verificar como podemos extrair os dados de que precisamos. Vamos espreitar novamente o documento HTML e podemos ver que podemos aceder à informação valiosa olhando para os nomes das classes.

imagem do blogue

Iremos extrair o nome do produto, a classificação, o número de críticas e o preço, mas pode ir tão longe quanto quiser.

Lembra-se da pasta "produtos" que criámos anteriormente? Agora vamos criar um arquivo CSV para exportar os dados que extraímos de cada página. A pasta ajudar-nos-á a organizá-los em conjunto.

def extract_products(soup, filename):
csv_filename = filename.replace('.txt', '.csv')
products_file = open(f'products/{csv_filename}', mode='a', encoding='utf-8', newline='')
products_writer = csv.writer(products_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
products_writer.writerow(['Title', 'Rating', 'Reviews', 'Price on sale'])

products = soup.find_all('div', {'class': 'product-grid-item'})
for product in products:
product_title = product.find('div', {'class': 'item-title'}).getText().strip()
product_rating = product.find('span', {'class': 'jdgm-prev-badge__stars'})['data-score']
product_reviews = product.find('span', {'class': 'jdgm-prev-badge__text'}).getText().strip()
product_price_on_sale = product.find('span', {'class': 'money'}).getText()
products_writer.writerow([product_title, product_rating, product_reviews, product_price_on_sale])

Depois de executar o programa, pode ver todas as informações extraídas nos ficheiros recém-criados.

imagem do blogue

Considerações finais

E é basicamente isso! Acabámos de criar o nosso próprio web crawler usando o BeautifulSoup e o WebScrapingAPI do Python em menos de 100 linhas de código. É claro que isso pode variar de acordo com a complexidade da sua tarefa, mas é um bom negócio para um crawler que navega pelas páginas de um site.

Para este guia, utilizámos a versão de avaliação gratuita da WebScrapingAPI, com 5000 chamadas à API nos primeiros 14 dias, mais do que suficiente para construir um crawler poderoso.  

Foi útil concentrarmo-nos apenas na lógica do crawler em vez de nos preocuparmos com os vários desafios encontrados na recolha de dados da Web. Poupou-nos tempo, energia e outros custos consideráveis, como a utilização dos nossos próprios proxies, por exemplo, apenas algumas das vantagens que se podem obter ao utilizar uma API para a recolha de dados da Web.

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
Ciência da recolha de dados da WebWeb Scraping facilitado: a importância da análise de dados

Descubra como extrair e organizar eficientemente dados para raspagem da Web e análise de dados através de análise de dados, bibliotecas de análise de HTML e metadados schema.org.

Suciu Dan
avatar do autor
Suciu Dan
12 min ler
miniatura
GuiasComo fazer um Web Crawler usando Python - Guia para iniciantes

Este tutorial demonstrará como rastrear a Web usando Python. O rastreamento da Web é uma abordagem poderosa para coletar dados da Web, localizando todos os URLs de um ou mais domínios.

Ștefan Răcila
avatar do autor
Ștefan Răcila
9 min. de leitura
miniatura
GuiasDescobrir como extrair uma tabela HTML com Python

Aprenda a utilizar o Python para a recolha de dados da Web em tabelas HTML: Extrair, armazenar e analisar dados | Tutorial para principiantes

Andrei Ogiolan
avatar do autor
Andrei Ogiolan
9 min. de leitura