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 primeirocontinuationCommandque 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/livestreamslista 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:
- conto quantas empresas da cidade têm cada palavra buscada;
- 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):
- Twitch: https://apify.com/jeffev/twitch-scraper
- Canais do YouTube com e-mail: https://apify.com/jeffev/youtube-channel-scraper
- Perfis do TikTok: https://apify.com/jeffev/tiktok-profile-scraper
- Kick: https://apify.com/jeffev/kick-scraper
- Linktree e páginas de link na bio: https://apify.com/jeffev/link-in-bio-scraper
- Patreon: https://apify.com/jeffev/patreon-creator-scraper
- Bluesky: https://apify.com/jeffev/bluesky-scraper