Xcrap Logo
Exemplos Práticos

Exemplo: Books to Scrape

Um guia completo extraindo livros do site toscrape.com.

O site books.toscrape.com é o sandbox perfeito para testar suas habilidades.

Objetivo

Extrair o título, preço e link de todos os livros na página inicial.

Implementação Completa

Neste exemplo, usaremos o AxiosClient (já que a página é estática) e o HtmlExtractionModel.

import { AxiosClient } from "@xcrap/axios-client";
import { HtmlParser, HtmlExtractionModel, css, extract } from "@xcrap/extractor";

async function scrapeBooks() {
    // 1. Obter o HTML
    const client = new AxiosClient();
    const response = await client.fetch({ url: "https://books.toscrape.com/" });
    
    // 2. Definir os Modelos
    const bookModel = new HtmlExtractionModel({
        title: {
            query: css("h3 a"),
            extractor: extract("attribute:title")
        },
        price: {
            query: css(".price_color"),
            extractor: extract("innerText")
        },
        link: {
            query: css("h3 a"),
            extractor: extract("attribute:href")
        }
    });

    const catalogModel = new HtmlExtractionModel({
        books: {
            query: css(".product_pod"),
            multiple: true,
            model: bookModel
        }
    });

    // 3. Extrair os Dados usando o HttpResponse
    const parser = response.asHtmlParser();
    const data = await parser.extractModel({ model: catalogModel });

    console.log(data.books);
}

scrapeBooks();

O que está acontecendo aqui?

  1. AxiosClient: Faz a requisição HTTP GET para o site.
  2. query: css(".product_pod"): Identifica o container de cada livro.
  3. multiple: true: Diz ao Xcrap para encontrar todos os elementos que batem com o seletor, não apenas o primeiro.
  4. model: Define um novo modelo para ser aplicado dentro de cada container encontrado.
  5. extract("attribute:title"): Pega o valor do atributo title da tag <a>, que contém o nome completo do livro.

Este mesmo padrão pode ser aplicado a qualquer site com listas (Amazon, eBay, etc), mudando apenas os seletores CSS.

On this page