Actualizaciones de productos | Nueva función de perfil
Advanced Data Extraction Specialist
Para mejorar la practicidad y estabilidad de Scraping Browser en escenarios de varias sesiones, hemos lanzado oficialmente la función de Perfil para datos de usuario persistentes. Esta función almacena datos del navegador (como cookies, almacenamiento, caché y estados de inicio de sesión) en la nube, lo que permite compartir y reutilizar sin problemas en diferentes sesiones, eliminando la necesidad de iniciar sesión repetidamente. Simplifica significativamente la depuración y mejora la eficiencia de los scripts de automatización.
¿Por qué introducir perfiles?
En los procesos de captura o interacción automatizados, los usuarios a menudo necesitan “recordar el estado de inicio de sesión”, “reutilizar cookies de una captura particular” y “sincronizar cachés de página entre tareas”. Los navegadores sin cabeza tradicionales se inician en un entorno completamente nuevo cada vez y no pueden retener ningún contexto histórico. La nueva función de Perfil resuelve este problema al permitir que Scraping Browser apoye:
- La retención a largo plazo del estado de inicio de sesión, eliminando la necesidad de re-autenticarse cada vez
- Una identidad de usuario consistente en múltiples solicitudes al mismo sitio
- Reutilización del contexto del navegador entre sesiones durante la depuración de scripts
Aspectos destacados de esta actualización
La página de creación y gestión de perfiles ya está activa
Ahora puedes ir a “Para Scraping → Perfiles” para:
- Crear/Editar/ Copiar/Eliminar
- Ver el tamaño de datos del archivo, la última vez utilizada
- Buscar el perfil objetivo por nombre o ID
- Copiar IDs con un clic para referencia en scripting o en equipo.
Página de detalles del perfil: Visibilidad completa en la configuración y el historial de uso
Accede a cualquier perfil para ver su configuración completa y los registros de uso, incluyendo:
- Información básica: Nombre del perfil, ID, tamaño de datos, última vez utilizada y conteo total de usos (es decir, cuántas veces se ha utilizado en sesiones);
- Registros de sesión asociados:
-
Lista de sesiones en vivo: Sesiones en tiempo real que actualmente utilizan este perfil;
-
Lista de historial de sesiones: Todas las sesiones históricas donde se utilizó este perfil, con entradas clicables para una vista detallada.
-
Esto hace que el proceso de depuración sea más transparente y ayuda a reproducir y rastrear problemas de manera más eficiente.
Integración profunda con el sistema de sesiones
También hemos agregado visualización de información del perfil y navegación rápida en las siguientes interfaces:
- Sesiones en vivo: Muestra el perfil en uso (clicable para saltar a la página de detalles del perfil)
- Historial de sesiones: Muestra el perfil asociado con cada sesión
- Detalles de sesión: Te permite ver qué perfil se utilizó durante el tiempo de ejecución específico
Demostración funcional
Caso 1: Inicio de sesión persistente + Mejora en la velocidad de carga
Objetivo: Abrir automáticamente páginas que requieren inicio de sesión sin ingresar tu nombre de usuario y contraseña cada vez.
Pasos:
1. Configura y guarda el estado de inicio de sesión por primera vez.
Formas de crear un perfil:
- Creación manual a través del tablero: Crea perfiles manualmente a través del tablero.
- Creación por API: Crea perfiles automáticamente utilizando la API de creación de perfil.
- Creación por SDK: Crea perfiles utilizando el método SDK.
NodeJS
import { Scrapeless } from "@scrapeless-ai/sdk"
const scrapeless = new Scrapeless({
apiKey: "TU_API_KEY"
})
// crear un nuevo perfil
const perfil = await scrapeless.profiles.create("perfil_scrapeless")
console.log("Id de perfil:", perfil.profileId)
Inicia una sesión, luego especifica el profile_id y habilita la persistencia, e inicia sesión manualmente una vez. El estado de inicio de sesión (como cookies y tokens) se guardará automáticamente en la nube del perfil.
NodeJS
import puppeteer from "puppeteer-core"
import { Scrapeless } from "@scrapeless-ai/sdk"
const scrapeless = new Scrapeless({
apiKey: "TU_API_KEY"
});
async function main() {
const proxy= "TU_PROXY"
const profileId = "TU_PROFILE_ID" // reemplaza con tu profileId
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "CUALQUIERA",
proxy_url: proxy,
session_ttl: "900",
session_name: "Perfil de Prueba",
profile_id: profileId,
profile_persist: true,
});
const browser = await puppeteer.connect({
browserWSEndpoint,
defaultViewport: null,
})
const page = await browser.newPage()
await page.goto("https://the-internet.herokuapp.com/login", {
timeout: 30000,
waitUntil: "domcontentloaded",
})
const username = "tu nombre de usuario"
const password = "tu contraseña!"
await page.type('[name="username"]', username)
await page.type('[name="password"]', password)
await Promise.all([
page.click('button[type="submit"]'),
page.waitForNavigation({ timeout: 15000 }).catch(() => { }),
])
const successMessage = await page.$(".flash.success")
if (successMessage) {
console.log("✅ ¡Inicio de sesión exitoso!")
} else {
console.log("❌ ¡Falló el inicio de sesión.")
}
await browser.close()
}
main().catch(console.error)
2. Reutilización automática de la información de inicio de sesión
- Reutilizar el mismo profileId en scripts o tareas subsecuentes.
- Iniciar una nueva sesión haciendo referencia al profileId creado anteriormente, iniciar sesión automáticamente en https://the-internet.herokuapp.com/ y abrir la página de inicio personal.
Caso de uso: Gestionar múltiples navegadores para acceder de manera concurrente a plataformas como Amazon y llevar a cabo diferentes tareas bajo la misma cuenta.
Pasos:
1. Configuración de Identidad Unificada
- Crear un Perfil compartido en la consola
- Iniciar sesión en Amazon ingresando tu nombre de usuario y contraseña, y luego guardar los datos de la sesión después de iniciar sesión correctamente
NodeJS
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"
async function loginToAmazonWithSessionProfile() {
const token = "TU_API_KEY"; // Clave API
const proxy = "TU_PROXY"
const amazonAccountEmail = "TU_EMAIL"
const amazonAccountPassword = "TU_CONTRASEÑA"
const profileName = "amazon";
const scrapeless = new Scrapeless({ apiKey: token });
let profile;
let profileId = "";
// intentar obtener el perfil existente, o crear uno nuevo
const profiles = await scrapeless.profiles.list({
name: profileName,
page: 1,
pageSize: 1,
});
if (profiles?.docs && profiles.docs.length > 0) {
profile = profiles.docs[0];
} else {
profile = await scrapeless.profiles.create(profileName);
}
profileId = profile?.profileId;
if (!profileId) {
return;
}
console.log(profile)
// Construir conexión URL para el navegador Scrapeless
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "CUALQUIERA",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: "Iniciar sesión en amazon",
profile_id: profileId, // profileId específico
profile_persist: true, // persistir datos del navegador en el perfil
})
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await browser.newPage();
await page.goto("https://amazon.com", { waitUntil: "networkidle2" });
// Hacer clic en "Continuar comprando" si está presente
try {
await page.waitForSelector("button.a-button-text", { timeout: 5000 });
await page.evaluate(() => {
const buttons = Array.from(document.querySelectorAll("button.a-button-text"));
const btn = buttons.find(b => b.textContent.trim() === "Continuar comprando");
if (btn) btn.click();
});
console.log("se hizo clic en el botón 'Continuar comprando'.");
} catch (e) {
console.log("el botón 'continuar comprando' no fue encontrado, continuando...");
}
// Hacer clic en el botón "Iniciar sesión"
await page.waitForSelector("#nav-link-accountList", { timeout: 5000 });
await page.click("#nav-link-accountList");
console.log("se hizo clic en el botón 'Iniciar sesión'.");
// Ingresar correo electrónico
await page.waitForSelector("#ap_email_login", { timeout: 5000 });
await page.type("#ap_email_login", amazonAccountEmail, { delay: Math.floor(Math.random() * 91) + 10 });
console.log("correo electrónico ingresado.");
// Hacer clic en "Continuar"
await page.waitForSelector("#continue-announce", { timeout: 5000 });
await page.click("#continue-announce");
console.log("se hizo clic en el botón 'Continuar'.");
// Ingresar contraseña con un retraso aleatorio por carácter
await page.waitForSelector("#ap_password", { timeout: 5000 });
for (const char of amazonAccountPassword) {
await page.type("#ap_password", char, { delay: Math.floor(Math.random() * 91) + 10 });
}
console.log("contraseña ingresada.");
// Hacer clic en el botón de envío "Iniciar sesión"
await page.waitForSelector("#signInSubmit", { timeout: 5000 });
await page.click("#signInSubmit");
console.log("se hizo clic en el botón de envío 'Iniciar sesión'.");
Opcionalmente: await page.waitForNavigation();
await browser.close();
}
(async () => {
await loginToAmazonWithSessionProfile();
})();
2. Llamadas Concurrentes con Identidad Consistente
-
Lanzar múltiples sesiones (por ejemplo, 3), todas haciendo referencia al mismo
profile_id -
Todas las sesiones funcionan bajo la misma identidad de usuario
-
Realizar diferentes acciones en las páginas por separado, como agregar productos A, B y C al carrito de compras
-
Sesión 1 busca
zapatosy los agrega al carrito
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"
async function addGoodsToCart() {
const token = "TU_API_KEY"
const proxy = "TU_PROXY"
const profileId = "TU_PROFILE_ID"
const search = "zapatos"
const scrapeless = new Scrapeless({
apiKey: token
})
// crear sesión de navegador
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "CUALQUIERA",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `productos ${search}`,
profile_id: profileId,
profile_persist: false, // deshabilitar persistencia de sesión
})
const client = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await client.newPage()
try {
await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })
javascript
await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })
// Buscar productos
console.log(`buscar productos: ${search}`);
await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
await page.keyboard.press('Enter');
await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })
// Hacer clic en los productos
await page.click('button[id="a-autoid-3-announce"]')
console.log(`clic en productos`);
await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })
await new Promise((resolve) => setTimeout(resolve, 5000))
const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
if (buttons.length > 0) {
// Hacer clic en agregar al carrito
await buttons[0].click();
console.log(`clic en agregar al carrito`);
}
await client.close();
} catch (e) {
console.log("Agregar al carrito falló.", e);
}
}
(async () => {
await addGoodsToCart()
})()
- La sesión 2 busca
ropay los agrega al carrito
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"
async function addGoodsToCart() {
const token = "YOUR_API_KEY"
const proxy = "YOUR_PROXY"
const profileId = "YOUR_PROFILE_ID"
const search = "ropa"
const scrapeless = new Scrapeless({
apiKey: token
})
// crear sesión de navegador
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `productos ${search}`,
profile_id: profileId,
profile_persist: false, // desactivar persistencia de sesión
})
const client = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await client.newPage()
try {
await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })
await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })
// Buscar productos
console.log(`buscar productos: ${search}`);
await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
await page.keyboard.press('Enter');
await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })
// Hacer clic en los productos
await page.click('button[id="a-autoid-3-announce"]')
console.log(`clic en productos`);
await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })
await new Promise((resolve) => setTimeout(resolve, 5000))
const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
if (buttons.length > 0) {
// Hacer clic en agregar al carrito
await buttons[0].click();
console.log(`clic en agregar al carrito`);
}
await client.close();
} catch (e) {
console.log("Agregar al carrito falló.", e);
}
}
(async () => {
await addGoodsToCart()
})()
- La sesión 3 busca
pantalonesy los agrega al carrito
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"
async function addGoodsToCart() {
const token = "YOUR_API_KEY"
const proxy = "YOUR_PROXY"
const profileId = "YOUR_PROFILE_ID"
const search = "pantalones"
const scrapeless = new Scrapeless({
apiKey: token
})
// crear sesión de navegador
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `productos ${search}`,
profile_id: profileId,
profile_persist: false, // desactivar persistencia de sesión
})
const client = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await client.newPage()
try {
await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })
await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })
// Buscar productos
console.log(`buscar productos: ${search}`);
await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
await page.keyboard.press('Enter');
await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })
// Hacer clic en los productos
await page.click('button[id="a-autoid-3-announce"]')
console.log(`clic en productos`);
await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })
await new Promise((resolve) => setTimeout(resolve, 5000))
const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
if (buttons.length > 0) {
// Hacer clic en agregar al carrito
javascript
await buttons[0].click();
console.log(`se hizo clic en agregar al carrito`);
}
await client.close();
} catch (e) {
console.log("La adición al carrito de compras falló.", e);
}
}
(async () => {
await addGoodsToCart()
})()

¿Para Qué Escenarios Son Adecuadas Estas Funciones?
El lanzamiento de Perfiles mejora significativamente el rendimiento del Navegador de Scraping en entornos de múltiples usuarios, múltiples sesiones y flujos de trabajo complejos. A continuación se presentan casos de uso prácticos típicos:
Proyectos de Recolección de Datos Automatizados / Rastreo
Al raspar frecuentemente sitios web que requieren inicio de sesión (como plataformas de comercio electrónico, reclutamiento o redes sociales):
- Persistir estados de inicio de sesión para evitar activaciones frecuentes de control de riesgos;
- Retener contextos clave como cookies, almacenamiento y tokens;
- Asignar diferentes identidades (Perfiles) para diferentes tareas para gestionar grupos de cuentas o grupos de identidades.
Colaboración en Equipo / Gestión de Configuración en Múltiples Entornos
Dentro de los equipos de desarrollo, pruebas y operaciones:
- Cada miembro mantiene su propia configuración de Perfil sin interferencias;
- Los ID de Perfil se pueden incrustar directamente en scripts de automatización para asegurar llamadas consistentes;
- Soporta nombres personalizados y limpieza masiva para mantener los entornos limpios y organizados.
QA / Soporte al Cliente / Reproducción de Problemas en Línea
- QA puede preestablecer Perfiles asociados con casos de prueba clave, evitando la reconstrucción del estado durante la reproducción;
- Los escenarios de soporte al cliente pueden restaurar los entornos operativos de los clientes a través de Perfiles para una reproducción precisa de problemas;
- Todas las sesiones pueden vincularse a registros de uso de Perfil, facilitando la resolución de problemas relacionados con el contexto.
👉 Abre el Playground y vívelo ahora.
En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.



