Como Extrair Dados do TikTok Sem Ser Bloqueado
Advanced Data Extraction Specialist
Principais Conclusões:
- O TikTok envia seus dados na página e depois alimenta o restante via XHR. Perfis e as primeiras postagens estão em um blob JSON
#__UNIVERSAL_DATA_FOR_REHYDRATION__; comentários e postagens mais profundas chegam como XHR acionados pelo rolar da página que você captura da rede. - A região é parte da obtenção de uma renderização limpa. O mesmo perfil que expira em uma saída é renderizado imediatamente de outra — fixe
proxyCountrye dê à sessão tempo de vida suficiente para que os XHRs de hidratação cheguem. - Você extrai da rede, não adivinhando seletores. Fique atento às respostas
xhr/fetchenquanto a página rola e analise o JSON que o TikTok já retorna — sem arrastar o DOM frágil da grade de vídeos. - O TikTok usa impressão digital de forma agressiva, então o navegador tem que ser real. Rodar no Scrapeless Scraping Browser — um Chromium anti-detecção com saída residencial — é o que faz a hidratação acontecer.
- Uma sessão, cinco superfícies. Perfis, postagens, comentários, buscas e canais se reduzem ao mesmo padrão de renderizar e, em seguida, extrair em uma única sessão em nuvem.
- Gratuito para começar. Novas contas Scrapeless incluem tempo de execução gratuito do Scraping Browser — inscreva-se em app.scrapeless.com.
Introdução: onde o TikTok mantém seus dados
O TikTok renderiza suas páginas da web em duas fases. O HTML inicial carrega uma grande ilha JSON — um blob <script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"> — que contém o perfil, suas estatísticas e a primeira página de postagens. Tudo além disso (mais postagens conforme você rola, threads de comentários, páginas de busca) é obtido via XHR após a página ser carregada. Portanto, raspar o TikTok envolve duas técnicas: ler o JSON de reidratação para ver o que já está lá e capturar as respostas XHR para o que é carregado sob demanda.
Ambas as fases dependem do TikTok acreditar que um navegador real está em uso. A plataforma usa impressão digital de forma agressiva, e um simples pedido HTTP ou um navegador sem cabeça padrão não obtém uma saída com dados utilizáveis. A renderização simplesmente não é concluída.
Este guia utiliza o Scrapeless Scraping Browser — um navegador em nuvem anti-detecção que combina um Chromium desenvolvido internamente com proxies residenciais — conectado ao Puppeteer via CDP. A extração do perfil abaixo foi capturada ao vivo; os padrões de postagens e comentários usam a mesma abordagem de renderizar e, em seguida, ler a rede. Dados públicos apenas ao longo do texto.
O Que Você Pode Fazer Com Isso
- Extrair um perfil de criador — bio, verificação, contagem de seguidores/corações/vídeos — do JSON de reidratação.
- Coletar as postagens de um criador com legendas, metadados de vídeo, autor e estatísticas de engajamento.
- Raspar threads de comentários com texto, contagens de curtidas, contagens de respostas e manejadores de autor.
- Executar uma pesquisa por palavra-chave e capturar o feed de resultados.
- Navegar por um feed de canal/hashtag com o mesmo loop de rolagem e captura.
Por Que Scrapeless Scraping Browser
O Scrapeless Scraping Browser é um navegador em nuvem personalizável e anti-detecção projetado para web crawlers e agentes de IA. Para o TikTok especificamente, ele oferece:
- Chromium desenvolvido internamente — um verdadeiro motor, então o JSON de reidratação é preenchido e os XHRs são acionados.
- Impressão digital anti-detecção — a sessão é identificada como um navegador normal, então o TikTok fornece dados reais em vez de uma saída vazia.
- Proxies residenciais em mais de 195 países — fixe a saída por país para que a página renderize de forma limpa e consistente.
- TTL de sessão configurável — mantenha a sessão ativa tempo suficiente para que os XHRs acionados pela rolagem cheguem antes do término.
- Uma conexão padrão do Puppeteer — crie uma sessão com o SDK, depois
puppeteer.connect()via CDP; sua extração é simples Puppeteer.
Obtenha sua chave de API no plano gratuito em app.scrapeless.com.
Pré-requisitos
- Node.js 18 ou mais recente
- Uma conta Scrapeless e chave de API — inscreva-se em app.scrapeless.com
- Familiaridade básica com Puppeteer e JSON
Instalação
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="seu_token_api_aqui"
Passo 1 — Crie uma sessão e conecte o Puppeteer
O SDK cria a sessão em nuvem (onde você fixa o país do proxy e o TTL) e retorna um endpoint WebSocket; o Puppeteer se conecta a ele via 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', // fixar a saída — a região afeta se a página renderiza
sessionTTL: 300, // segundos; tempo suficiente para que os XHRs de hidratação cheguem
});
const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
Uma observação do mundo real ao rodar isso: o mesmo perfil que expirou repetidamente de uma região de saída foi renderizado na primeira tentativa de outra. Se uma renderização travar, mude proxyCountry antes de qualquer outra coisa.
Passo 2 — Raspe um perfil do JSON de reidratação
O perfil, suas estatísticas e as primeiras postagens já estão na página quando ela carrega — dentro da tag de script #__UNIVERSAL_DATA_FOR_REHYDRATION__. Espere por esse nó, analise-o e leia o escopo 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);
Isso retorna o próprio objeto userInfo do TikTok verbatim — um objeto user e um objeto stats. Sem raspagem de DOM; você está lendo os dados que o TikTok enviou para renderizar sua própria página.
Obtenha sua chave de API no plano gratuito: app.scrapeless.com
Etapa 3 — Capturar postagens e comentários de XHR
Postagens além da primeira página e todos os comentários chegam como XHR após a página inicializar e à medida que você rola. O padrão é anexar um ouvinte de response antes de navegar, rolar para acionar as requisições, e então analisar os corpos 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 { /* alguns corpos não são legíveis; ignorar */ }
});
await page.goto('https://www.tiktok.com/@oddanimalspecimens', { waitUntil: 'domcontentloaded' });
// Role para acionar postagens/comentários carregados de forma preguiçosa
for (let i = 0; i < 5; i++) {
await page.evaluate(() => window.scrollBy(0, document.body.scrollHeight));
await new Promise((r) => setTimeout(r, 2000));
}
// Filtrar os endpoints de lista de item/comentário e JSON.parse os corpos
const itemLists = xhrCalls.filter((c) => /\/api\/(post|comment)\//.test(c.url));
A partir daí, você JSON.parse cada corpo capturado e puxa os arrays de itens ou comentários. Essa é a mesma abordagem de renderizar e depois ler a rede que foi usada no perfil, apenas conduzida pela rolagem em vez de um único blob de hidratação.
O Que Você Recebe de Volta
A extração do perfil retorna o objeto userInfo do TikTok. A forma abaixo é exatamente o que a execução ao vivo emitiu; as contagens são uma captura real e mudarão com o tempo:
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
}
}
// A forma é verbatim do userInfo do TikTok; campos de string mostrados como "..." são uma amostra ilustrativa, as contagens são uma captura real e mudarão com o tempo.
Algumas observações honestas:
- O objeto
useré amplo — O TikTok inclui dezenas de campos (configurações, secUid, bandeiras de relação). Leia o punhado que você precisa; ignore o resto. hearteheartCountaparecem ambos e carregam o mesmo total — useheartCount.- Contagens arredondam em escala. Contas grandes relatam totais arredondados (por exemplo, 4.000.000) da mesma forma que o TikTok os exibe na interface.
- A região importa para a renderização, não apenas para os dados. Defina
proxyCountrye dê à sessão um TTL suficiente.
Conclusão: um padrão em todas as superfícies do TikTok
Raspar o TikTok se resume a duas leituras: analisar #__UNIVERSAL_DATA_FOR_REHYDRATION__ para o que já está na página e capturar respostas XHR para o que se hidrata ao rolar. Perfis, postagens, comentários, busca e canais são todas variações desse único loop de renderizar e extrair. Executá-lo no Scrapeless Scraping Browser é o que faz a renderização acontecer — Chromium anti-detecção mais egressos residenciais, para que o TikTok forneça dados reais em vez de uma casca vazia. Para uma variante de e-commerce do mesmo padrão SDK-over-CDP, veja o guia do scraper Etsy; a página do produto Scraping Browser e docs cobrem toda a superfície do SDK. Defina a região, estenda o TTL para superfícies com muita rolagem e leia o JSON que o TikTok já te oferece.
Pronto para Construir Seu Pipeline de Dados Potencializado por IA?
Junte-se à nossa comunidade para reivindicar um plano gratuito e conectar-se com desenvolvedores que constroem pipelines de dados sociais: Discord · Telegram.
Cadastre-se em app.scrapeless.com para obter o runtime gratuito do Scraping Browser e adaptar os padrões acima aos perfis, consultas e canais necessários para o seu fluxo de trabalho. Veja preços para escalabilidade.
FAQ
P: É legal fazer scraping no TikTok?
Coletar dados publicamente visíveis é geralmente permitido, mas as regras variam conforme a jurisdição e os Termos de Serviço do TikTok se aplicam. Faça scraping apenas de dados públicos, revise os ToS e consulte um advogado para o seu caso de uso.
P: Por que meu scraping retorna uma página vazia ou expira?
Duas causas comuns: a região de saída pela qual o TikTok te redireciona e uma sessão que termina antes que a hidratação finalize. Fixe proxyCountry (troque se a renderização travar) e aumente sessionTTL.
P: Eu preciso de um proxy?
Sim. O TikTok pesa muito a reputação do IP; fixe a saída residencial com proxyCountry para que a página renderize e as XHRs sejam ativadas.
P: Como consigo posts além da primeira página?
Role a página para ativar as requisições XHR carregadas de forma preguiçosa e capture-as com um ouvinte de response, depois analise os corpos JSON — o blob de reidratação contém apenas o primeiro lote.
P: A marcação DOM mudou e meus seletores quebraram. E agora?
Confie nas fontes JSON — o blob de reidratação e os corpos XHR — em vez de fazer scraping da grade renderizada. Elas mudam muito menos do que a marcação visual. Verifique novamente os seletores apenas para os poucos que você ainda precisa.
P: Quantos workers posso executar contra o TikTok?
Mantenha a concorrência modesta — um punhado de sessões por host — para que o sinal de reputação do IP permaneça limpo.
P: Posso executar isso sem um agente de IA?
Sim. É o SDK Scrapeless mais o Puppeteer simples sobre o CDP — nenhum agente é necessário.
Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.



