Voltar ao blogue
Guias
Raluca PenciucLast updated on Mar 31, 20266 min read

Como criar um rastreador da Web com menos de 100 linhas de código

Como criar um rastreador da Web com menos de 100 linhas de código

Vivemos numa era digital e temos acesso a uma enorme quantidade de dados. Ao utilizar esta informação, podemos compreender melhor como trabalhamos, nos divertimos, aprendemos e vivemos. Não seria bom poder obter informações mais específicas sobre um determinado tema?

Neste artigo, vamos demonstrar como utilizar o BeautifulSoup e a WebScrapingAPI em conjunto para criar os nossos próprios rastreadores para recolher dados específicos de sites.

Uma advertência: extrair conteúdo protegido por direitos de autor ou informações pessoais é ilegal na maioria dos casos. Para se manter seguro, é melhor obter consentimento explícito antes de extrair qualquer site, especialmente sites de redes sociais.

O que são rastreadores da web

Existem inúmeros motores de busca por aí, e todos nós os usamos. Os seus serviços são fáceis de usar — basta perguntar algo e eles procuram em toda a web para encontrar uma resposta para si. Nos bastidores, é o rastreador Googlebot do Google que torna o motor de busca do Google um sucesso.

Ao analisar a web em busca de páginas de acordo com as palavras-chave introduzidas, os rastreadores ajudam os motores de busca a catalogar essas páginas e a apresentá-las posteriormente através da indexação. Os motores de busca dependem dos rastreadores para recolher informações de sites, 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 precisa de se preocupar com a possibilidade 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 rastreadores da web. Todos os dias, os sites existentes publicam dezenas de novas informações e nem me faça falar de quantos novos sites surgem diariamente.

No final, isto exigiria que eles pesquisassem milhões de páginas e atualizassem os seus índices continuamente. Os sistemas que analisam o conteúdo dos sites dependem deles, por isso são essenciais.

Portanto, os rastreadores 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 contar com ele para buscar URLs em vez de as digitar manualmente no scraper. Mais automação, uau!

Instalação

Agora que temos uma compreensão básica dos rastreadores da Web, pode estar a perguntar-se como é que tudo isto funciona na prática. Bem, vamos aprofundar o assunto!

Primeiro, precisamos de configurar o nosso ambiente de trabalho. Certifique-se de que o seu computador cumpre os seguintes pré-requisitos:

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

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

Desenvolver o rastreador

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

Escolha um site e analise o HTML

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

Para tal, temos primeiro de analisar a estrutura da página e definir a nossa estratégia. Clique com o botão direito do rato em qualquer ponto da página, depois em «Inspecionar elemento», e o «Consola do programador» irá aparecer. Aqui pode ver o documento HTML do site, que contém todos os dados de que precisamos.

Criar 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 irá instalar o BeautifulSoup, uma biblioteca que nos ajudará a extrair os dados do HTML:

> pip install beautifulsoup4

Em seguida, crie uma pasta chamada “products”. Isso ajudará a organizar e armazenar os resultados da extração em vários ficheiros CSV.

Por fim, crie o ficheiro “crawler.py”. Aqui vamos escrever todo o nosso código e a lógica de rastreamento. Quando terminarmos, podemos executar o ficheiro com o seguinte comando:

> py crawler.py

Continuando, vamos importar as bibliotecas de que precisamos e, em seguida, 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 crawler:

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, irá construir o objeto BeautifulSoup que facilitará a nossa análise e chamar a função start_crawling, que dará início à navegação no site.

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)

Conforme mencionado anteriormente, a função get_page_source utilizará a WebScrapingAPI para obter o conteúdo HTML do site e irá gravá-lo num ficheiro de texto na secção <body>, uma vez que é essa que contém toda a informação que nos interessa.

Agora, vamos dar um passo atrás e verificar como atingir os nossos objetivos. Os produtos estão organizados em páginas, por isso precisamos de aceder a cada página repetidamente para extrair todos eles.

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

Se voltares à Consola do Desenvolvedor, podes ver que cada número de página é, na verdade, um link 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á desativada.

Assim, o algoritmo seguinte tem de:

  • Aceder à página;
  • Extrair os dados (implementaremos isto no próximo passo);
  • Encontrar o contêiner de paginação no documento HTML; Verificar se a seta “Próxima Página” está desativada; parar se estiver e, caso contrário, obter o novo link e chamar a função de rastreamento 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

Por fim, vamos ver como podemos extrair os dados de que precisamos. Vamos dar mais uma olhadela no documento HTML e podemos ver que podemos aceder às informações valiosas observando os nomes das classes.

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

Lembra-se da pasta “products” que criámos anteriormente? Vamos agora criar um ficheiro CSV para exportar os dados que extraímos de cada página. A pasta irá 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, poderá ver todas as informações extraídas nos ficheiros recém-criados.

Considerações finais

E é basicamente isso! Acabámos de criar o nosso próprio rastreador web usando o BeautifulSoup do Python e a WebScrapingAPI em menos de 100 linhas de código. Claro que pode variar de acordo com a complexidade da sua tarefa, mas é um ótimo resultado para um rastreador 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 de API durante os primeiros 14 dias, mais do que suficiente para construir um rastreador poderoso.  

Foi útil concentrarmo-nos apenas na lógica do rastreador, em vez de nos preocuparmos com os vários desafios encontrados na extração de dados da web. Isso 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 pode obter ao utilizar uma API para extração de dados da web.

Sobre o autor
Raluca Penciuc, Desenvolvedor Full-Stack @ WebScrapingAPI
Raluca PenciucDesenvolvedor Full-Stack

Raluca Penciuc é programadora Full Stack na WebScrapingAPI, onde desenvolve scrapers, aperfeiçoa estratégias de evasão e procura formas fiáveis de reduzir a deteção nos sites-alvo.

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.