1

7 truques (e 3 armadilhas) que aprendi raspando Twitch, YouTube, TikTok, Kick, Bluesky e Patreon sem login e sem navegador

Nas últimas semanas construí uma família de scrapers de dados de criadores de conteúdo: perfis, seguidores, redes sociais e contato comercial. A regra que me impus foi não usar navegador headless nem login, só HTTP puro. Sai mais barato, mais rápido e quebra menos. Junto aqui o que funcionou, o que não funcionou e os números, porque quase nada disso está documentado.

1. Twitch: o GraphQL público resolve quase tudo, menos a paginação

O site da Twitch conversa com gql.twitch.tv/gql usando um Client-Id público, o mesmo do player web. Com ele saem perfil, seguidores, se está ao vivo, VODs, clipes e até os painéis do canal, que é onde o streamer coloca o e-mail comercial.

A armadilha: a paginação com after: devolve failed integrity check, porque exige um token de integridade gerado no navegador. A saída foi não paginar. Cada consulta aceita first: 100, então faço uma consulta por idioma, as 100 lives com mais espectadores de cada.

Resultado prático: em VALORANT + português, 6 de 10 streamers tinham e-mail de contato nos painéis.

2. Bluesky: a busca funciona sem login, mas só num host

public.api.bsky.app responde perfil, feed e seguidores, mas searchPosts ali dá 403. Em api.bsky.app a mesma busca funciona sem autenticação. Só que o cursor da segunda página volta 403.

A saída foi andar para trás no tempo: a próxima chamada usa until = o indexedAt mais antigo da página anterior. Assim consegui milhares de posts por termo, sem login.

3. YouTube: a aba "Sobre" já vem pronta no HTML

A página /@canal/about traz um aboutChannelViewModel dentro do ytInitialData, com inscritos, visualizações, país, data de criação, links e a descrição. Tem também o campo signInForBusinessEmail. O e-mail comercial em si fica atrás de login e captcha, mas esse campo diz se o canal tem um.

A busca de canais usa o filtro sp=EgIQAg== mais as continuações de youtubei/v1/search. Duas pegadinhas:

  • o token de continuação certo está dentro de continuationItemRenderer, não no primeiro continuationCommand que aparece;
  • no layout novo, o número de inscritos vem no campo chamado videoCountText. Sim, de verdade.

4. TikTok: perfil fácil, lista de vídeos difícil

O perfil inteiro está em <script id="__UNIVERSAL_DATA_FOR_REHYDRATION__">: seguidores, curtidas, link da bio, categoria de conta comercial. A estatística de um vídeo, pela URL dele, também. Já a lista de vídeos de um perfil exige assinatura (X-Bogus), e eu não fiz.

Curiosidade: na nuvem, o proxy residencial devolvia a página vazia. O IP de datacenter funcionava.

5. Kick, Linktree e Patreon

  • Kick: kick.com/api/v2/channels/<slug> traz canal e redes sociais. web.kick.com/api/v1/livestreams lista as lives com cursor de verdade.
  • Linktree: tudo está no __NEXT_DATA__, inclusive país, plano e data de criação da página.
  • Patreon: tem uma API JSON:API pública com busca e níveis de assinatura. O número de patronos aparece na busca mesmo quando o criador esconde na página dele.

Armadilha 1: o Cloudflare olha a sua biblioteca HTTP

No Patreon, a mesma URL dava 200 com requests e 403 ("Just a moment...") com httpx, vindo do mesmo IP da nuvem. É a impressão digital do TLS. Ou seja, "funcionou no meu teste" não vale se o teste usa outra biblioteca.

Armadilha 2: memória com 2,7 milhões de linhas

Outro produto meu casa lugares do Google Maps com o CNPJ da Receita Federal. Buscar em São Paulo carregava a cidade inteira (2,7 milhões de empresas) e estourava 4 GB.

A correção foi um filtro em duas passadas com PyArrow:

  1. conto quantas empresas da cidade têm cada palavra buscada;
  2. mantenho só as linhas com o mesmo telefone, o mesmo CEP ou palavras raras (o casamento por nome desiste de palavras com mais de 400 ocorrências mesmo).

Antes de publicar, comparei o resultado antigo com o novo em 210 lugares: zero diferenças. A memória caiu de 3,9 GB (com crash) para 350 MB.

Armadilha 3: a busca da loja favorece quem já chegou

Publiquei os scrapers na Apify Store, cobrando por resultado. Bastante gente olha a página, uns 15% abrem o formulário e metade desses roda. Mas na busca interna da loja os produtos novos quase não aparecem, porque o ranking pesa usuários e avaliações. O que trouxe visitante de fora foi o post anterior aqui no TabNews.

O primeiro scraper fora do nicho de CNPJ a ter cliente pagante foi justamente o da Twitch, no dia em que foi publicado.


Se quiser testar, eles estão na Apify (o plano gratuito dá US$ 5 de crédito por mês):

Carregando publicação patrocinada...