Xcrap Logo

Factory (Criação Dinâmica)

Automatize a criação de clientes e modelos a partir de configurações.

O @xcrap/factory é ideal para aplicações que precisam ser flexíveis. Em vez de instanciar classes manualmente, você define um registro de classes permitidas e usa o Factory para criá-las a partir de objetos de configuração (JSON).

Por que usar?

  • Configuração via Banco de Dados: Salve a lógica de scraping como JSON.
  • Switching Dinâmico: Mude de AxiosClient para PuppeteerClient apenas alterando uma string no config.
  • Abstração: O código principal não precisa conhecer as classes específicas dos clientes.

Registrando e Criando um Cliente

import { AxiosClient } from "@xcrap/axios-client";
import { GotScrapingClient } from "@xcrap/got-scraping-client";
import { createClient } from "@xcrap/factory";

const config = {
    allowedClients: {
        "http-simple": AxiosClient,
        "http-pro": GotScrapingClient 
    }
}

// Criando dinamicamente
const client = createClient({
    config,
    type: "http-pro",
    options: { /* Opções do GotScraping */ }
});

Criando um Modelo de Extração

O Factory também gerencia a criação de modelos, convertendo queries em strings automaticamente para seletores CSS, a menos que especificado de outra forma.

import { HtmlExtractionModel, extractInnerText } from "@xcrap/extractor";
import { createExtractionModel } from "@xcrap/factory";

const factoryConfig = {
    allowedExtractors: {
        text: extractInnerText,
    },
    allowedModels: {
        html: HtmlExtractionModel
    }
}

const model = createExtractionModel({
    config: factoryConfig,
    model: {
        type: "html",
        model: {
            title: {
                query: "h1", // Auto-converte para CSS
                extractor: "text"
            },
            price: {
                query: { value: "//span[@class='price']", type: "xpath" },
                extractor: "text"
            }
        }
    }
});

Modelos Aninhados no Factory

No Factory, para criar modelos aninhados, usamos a propriedade nested (em vez de model, como no uso direto do Extractor).

const model = createExtractionModel({
    config: factoryConfig,
    model: {
        type: "html",
        model: {
            category: { query: "h1", extractor: "text" },
            products: {
                query: ".product-item",
                multiple: true,
                nested: {
                    type: "html", // Define o tipo do modelo aninhado
                    model: {
                        name: { query: "a", extractor: "text" }
                    }
                }
            }
        }
    }
});

On this page