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
AxiosClientparaPuppeteerClientapenas 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" }
}
}
}
}
}
});