Cómo extraer datos de TikTok sin ser bloqueado
Advanced Data Extraction Specialist
Conclusiones clave:
- TikTok envía sus datos en la página, luego hidrata el resto a través de XHR. Los perfiles y las primeras publicaciones viven en un blob JSON
#__UNIVERSAL_DATA_FOR_REHYDRATION__; los comentarios y las publicaciones más profundas llegan como XHR activados por desplazamiento que capturas de la red. - La región es parte de obtener un render limpio. El mismo perfil que agota el tiempo de espera en una salida se renderiza de inmediato desde otra — fija
proxyCountryy brinda la sesión con suficiente TTL para que los XHR de hidratación lleguen. - Extraes de la red, no adivinando selectores. Escucha las respuestas de
xhr/fetchmientras la página se desplaza y analiza el JSON que TikTok ya devuelve — sin scraping quebradizo del DOM de la cuadrícula de video. - TikTok utiliza huellas digitales de manera intensa, por lo que el navegador tiene que ser real. Ejecutar en Scrapeless Scraping Browser — Chromium anti-detección con salida residencial — es lo que permite que la hidratación ocurra.
- Una sesión, cinco superficies. Perfiles, publicaciones, comentarios, búsqueda y canal se reducen al mismo patrón de renderizar y luego extraer sobre una sola sesión en la nube.
- Gratis para comenzar. Nuevas cuentas en Scrapeless incluyen tiempo de ejecución gratuito para el Scraping Browser — regístrate en app.scrapeless.com.
Introducción: dónde TikTok guarda sus datos
TikTok renderiza sus páginas web en dos fases. El HTML inicial lleva una gran isla JSON — un blob <script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"> — que contiene el perfil, sus estadísticas y la primera página de publicaciones. Todo lo que ocurre después (más publicaciones a medida que te desplazas, hilos de comentarios, páginas de búsqueda) se obtiene a través de XHR después de que la página se inicia. Por lo tanto, raspar TikTok implica dos técnicas: leer el JSON de rehidratación para lo que ya está allí y capturar las respuestas de XHR para lo que se carga bajo demanda.
Ambas fases dependen de que TikTok crea que un navegador real está al mando. La plataforma utiliza huellas dactilares de forma agresiva, y una solicitud HTTP simple o un navegador sin cabeza predeterminado obtiene un shell sin datos utilizables. El render simplemente no se completa.
Esta guía funciona en Scrapeless Scraping Browser — un navegador en la nube anti-detección que combina Chromium desarrollado internamente con proxies residenciales — conectado a Puppeteer a través de CDP. La extracción de perfil a continuación fue capturada en vivo; los patrones de publicaciones y comentarios utilizan el mismo enfoque de renderizar y luego leer la red. Solo datos públicos en todo momento.
Lo Que Puedes Hacer Con Esto
- Obtener el perfil de un creador — biografía, verificación, conteos de seguidores/corazones/videos — del JSON de rehidratación.
- Recoger las publicaciones de un creador con subtítulos, metadatos de video, autor y estadísticas de compromiso.
- Raspar hilos de comentarios con texto, conteos de "me gusta", conteos de respuestas y manejadores de autores.
- Ejecutar búsqueda por palabras clave y capturar el feed de resultados.
- Recorrer un feed de canal/hashtag con el mismo bucle de desplazamiento y captura.
Por Qué Scrapeless Scraping Browser
Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para rastreadores web y agentes de IA. Para TikTok específicamente, ofrece:
- Chromium desarrollado internamente — un motor real, por lo que el JSON de rehidratación se pobla y los XHR se activan.
- Huella digital anti-detección — la sesión se lee como un navegador normal, por lo que TikTok sirve datos reales en lugar de un shell vacío.
- Proxies residenciales en más de 195 países — fija la salida por país para que la página se renderice de manera limpia y consistente.
- TTL de sesión configurable — mantener la sesión activa el tiempo suficiente para que los XHR activados por desplazamiento lleguen antes de la eliminación.
- Una conexión estándar de Puppeteer — crea una sesión con el SDK, luego
puppeteer.connect()a través de CDP; tu extracción es Puppeteer simple.
Obtén tu clave de API en el plan gratuito en app.scrapeless.com.
Requisitos Previos
- Node.js 18 o más reciente
- Una cuenta de Scrapeless y clave de API — regístrate en app.scrapeless.com
- Familiaridad básica con Puppeteer y JSON
Instalar
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="tu_token_api_aqui"
Paso 1 — Crear una sesión y conectar Puppeteer
El SDK crea la sesión en la nube (donde fijas el país del proxy y el TTL) y devuelve un endpoint de WebSocket; Puppeteer se conecta a él a través de CDP:
javascript
import { Scrapeless } from '@scrapeless-ai/sdk';
import puppeteer from 'puppeteer-core';
const client = new Scrapeless({ apiKey: process.env.SCRAPELESS_API_KEY });
const { browserWSEndpoint } = await client.browser.create({
proxyCountry: 'US', // fija la salida — la región afecta si la página se renderiza
sessionTTL: 300, // segundos; lo suficientemente largo para que los XHR de hidratación lleguen
});
const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
Una nota del mundo real al ejecutar esto: el mismo perfil que agotaba el tiempo de espera repetidamente desde una región de salida se renderizó a la primera desde otra. Si un render se queda colgado, cambia proxyCountry antes que nada.
Paso 2 — Raspar un perfil del JSON de rehidratación
El perfil, sus estadísticas y las primeras publicaciones ya están en la página cuando se carga, dentro de la etiqueta de script #__UNIVERSAL_DATA_FOR_REHYDRATION__. Espera a que ese nodo esté disponible, analízalo y lee el alcance de webapp.user-detail:
javascript
await page.goto('https://www.tiktok.com/@oddanimalspecimens', {
waitUntil: 'domcontentloaded',
timeout: 120000,
});
await page.waitForSelector('#__UNIVERSAL_DATA_FOR_REHYDRATION__', { timeout: 60000 });
const userInfo = await page.evaluate(() => {
const el = document.getElementById('__UNIVERSAL_DATA_FOR_REHYDRATION__');
const data = JSON.parse(el.textContent);
return data.__DEFAULT_SCOPE__['webapp.user-detail'].userInfo;
});
console.log(userInfo.user.uniqueId, '—', userInfo.stats);
Esto devuelve el objeto userInfo de TikTok tal cual — un objeto user y un objeto stats. No hay raspado del DOM; estás leyendo los datos que TikTok envió para renderizar su propia página.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Paso 3 — Capturar publicaciones y comentarios desde XHR
Las publicaciones más allá de la primera página y todos los hilos de comentarios llegan como XHR después de que la página arranca y mientras se desplaza. El patrón es adjuntar un oyente de response antes de navegar, desplazarse para activar las peticiones y luego analizar los cuerpos JSON:
javascript
const xhrCalls = [];
page.on('response', async (resp) => {
const rt = resp.request().resourceType();
if (rt !== 'xhr' && rt !== 'fetch') return;
try {
xhrCalls.push({ url: resp.url(), body: await resp.text() });
} catch { /* algunos cuerpos no son legibles; omitir */ }
});
await page.goto('https://www.tiktok.com/@oddanimalspecimens', { waitUntil: 'domcontentloaded' });
// Desplazarse para activar publicaciones/comentarios cargados perezosamente
for (let i = 0; i < 5; i++) {
await page.evaluate(() => window.scrollBy(0, document.body.scrollHeight));
await new Promise((r) => setTimeout(r, 2000));
}
// Filtrar los endpoints de lista de elementos/comentarios y JSON.parse los cuerpos
const itemLists = xhrCalls.filter((c) => /\/api\/(post|comment)\//.test(c.url));
A partir de ahí, JSON.parse cada cuerpo capturado y extrae los arreglos de elementos o comentarios. Este es el mismo enfoque de renderizado y lectura de la red que en el perfil, solo que impulsado por el desplazamiento en lugar de un solo blob de hidratación.
Lo que obtienes de regreso
La extracción del perfil devuelve el objeto userInfo de TikTok. La forma a continuación es exactamente lo que la ejecución en vivo emitió; los conteos son una captura real y cambiarán con el tiempo:
json
{
"user": {
"id": "...",
"uniqueId": "oddanimalspecimens",
"nickname": "Odd Animal Specimens",
"avatarLarger": "https://...",
"signature": "...",
"verified": false,
"secUid": "...",
"privateAccount": false
},
"stats": {
"followerCount": 4000000,
"followingCount": 9,
"heartCount": 78000000,
"videoCount": 179,
"diggCount": 0,
"friendCount": 6
}
}
// La forma es el userInfo de TikTok tal cual; los campos de cadena mostrados como "..." son una muestra ilustrativa, los conteos son una captura real y cambian con el tiempo.
Algunas observaciones honestas:
- El objeto
useres amplio — TikTok incluye docenas de campos (configuraciones, secUid, banderas de relación). Lee solo el puñado que necesitas; ignora el resto. heartyheartCountaparecen ambos y llevan el mismo total; utilizaheartCount.- Los conteos se redondean a gran escala. Las cuentas grandes informan totales redondeados (por ejemplo, 4,000,000) de la misma manera que TikTok los muestra en la interfaz.
- La región importa para el renderizado, no solo los datos. Fija
proxyCountryy da la sesión suficiente TTL.
Conclusión: un patrón en toda la superficie de TikTok
Raspar TikTok se reduce a dos lecturas: analizar #__UNIVERSAL_DATA_FOR_REHYDRATION__ para lo que ya está en la página y capturar respuestas XHR para lo que se hidrata al desplazarse. Perfiles, publicaciones, comentarios, búsquedas y canales son todas variaciones de ese único ciclo de renderizar y extraer. Ejecutarlo en Scrapeless Scraping Browser es lo que hace que el renderizado ocurra: Chromium anti-detección más salida residencial, por lo que TikTok sirve datos reales en lugar de una shell vacía. Para una variante de comercio electrónico del mismo patrón de SDK sobre CDP, consulta la guía del scraper de Etsy; la página del producto Scraping Browser y docs cubren toda la superficie del SDK. Fija la región, extiende el TTL para superficies con mucho desplazamiento y lee el JSON que TikTok ya te entrega.
¿Listo para construir tu pipeline de datos impulsado por IA?
Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que están construyendo pipelines de datos sociales: Discord · Telegram.
Regístrate en app.scrapeless.com para obtener el runtime gratuito de Scraping Browser y adapta los patrones anteriores a los perfiles, consultas y canales que tu flujo de trabajo necesita. Consulta precios para escalabilidad.
Preguntas Frecuentes
P: ¿Es legal raspar TikTok?
Recopilar datos visibles públicamente es generalmente permisible, pero las reglas varían según la jurisdicción y se aplican los Términos de Servicio de TikTok. Raspa solo datos públicos, revisa los Términos de Servicio y consulta a un abogado para tu caso de uso.
P: ¿Por qué mi raspado devuelve una página vacía o se agota el tiempo?
Dos causas comunes: la región de salida a través de la cual TikTok te enruta y una sesión que termina antes de que la hidratación se complete. Fija proxyCountry (cámbialo si un renderizado se congela) y aumenta sessionTTL.
P: ¿Necesito un proxy?
Sí. TikTok valora mucho la reputación de IP; fija la salida residencial con proxyCountry para que la página se renderice y los XHR se ejecuten.
P: ¿Cómo obtengo publicaciones más allá de la primera página?
Desplaza la página para activar las solicitudes XHR de carga perezosa y captúralas con un oyente de response, luego analiza los cuerpos JSON: el blob de rehidratación solo contiene el primer lote.
P: El marcado DOM cambió y mis selectores se rompieron. ¿Qué hago ahora?
Apóyate en las fuentes JSON —el blob de rehidratación y los cuerpos XHR— en lugar de raspar la cuadrícula renderizada. Cambian mucho menos que el marcado visual. Verifica los selectores solo para los pocos que aún necesitas.
P: ¿Cuántos trabajadores puedo ejecutar contra TikTok?
Mantén la concurrencia moderada —un puñado de sesiones por host— para que la señal de reputación IP se mantenga limpia.
P: ¿Puedo ejecutar esto sin un agente de IA?
Sí. Es el SDK de Scrapeless más Puppeteer simple sobre CDP —no se requiere agente.
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.



