nti-Web Scraping Ninja Como Blindar Seu Site Contra os Robozões Ladrões de Dados

Anti-Web Scraping Ninja: Como Blindar Seu Site Contra os Robozões Ladrões de Dados!


Introdução: Quem Nunca Foi Roubado Que Atire a Primeira Linha de Código
O web scraping — aquela prática "inocente" de arrancar tudo do seu site igual mão boba em Black Friday — é o terror dos devs modernos.
Se não tomar cuidado, além de perder dados valiosos, você ainda entope o servidor e dá de bandeja a experiência do usuário real pra bots folgados.
Spoiler: vamos usar o caso real do meu chapa fsimobiliaria.com, onde o scraper tomou uma surra bonita e foi pra casa chorando.

Testado e aprovado com Manus.im e Perplexity.ai, porque a gente aqui é tech raiz, mas com pezinho no futuro.

Seguinte: se seu site já teve aquele tráfego esquisito às 3 da manhã, tipo ex stalkeando no Zap, pode apostar que era bot tentando surrupiar seus dados.

Hoje, meu chapa, vamos aprender a meter umas armadilhas ninjas no seu site, igual aqueles chefes de fase difícil que o pessoal rage quitava nos jogos antigos.


Origem:




Anti-Web Scraping Ninja: Como Blindar Seu Site

sim o resultado esta aqui...


Anti-Web Scraping Ninja: Como Blindar Seu Site


Sério???




🕵️‍♂️ O Que É Web Scraping e Por Que Isso É Um Problemão?

vem, coleta informação e vaza — nem bate palma.
Mas na maioria das vezes é treta: cópia de conteúdo, sobrecarga de servidor, quebra de regras... só falta pedir CPF e senha.

Web scraping é tipo aquele vizinho fofoqueiro:

Às vezes é de boas (tipo o Google indexando sua página).

No site fsimobiliaria.com, o robozão teve que encarar:

  • Falha dramática ao tentar rolar a página 👎

  • Bloqueio cruel já na segunda navegação 👀

  • IP tomando chá de banco de dados (sim se voce acha que seu ip nao é registrado fica expert)🍵

  • Desafios JavaScript que nem os bots hardcore passaram 😵

Tudo isso não foi acidente, foi estratégia de defesa muito bem bolada, fi.


🛡️ Como Jogar Água no Chopp dos Scrapers: Técnicas de Defesa

1. Detectando Bots Com JavaScript: Rápido Demais, Mané!

Resumo da ópera: humanos erram, bots não.

Quer pegar bot? Monitora cliques rápidos demais. Se o cabra clicar 3x em 0,2 segundos... é bot, fi.

Primeirão Basic:

// Detecta mão boba (típicas de bots e abdução alienigina ha)

<script type='text/javascript'>

    // Desabilitar o menu de contexto ao clicar com o botão direito do mouse
    document.addEventListener(&#39;contextmenu&#39;, function(e) {
        e.preventDefault();
        alert(&quot;Evite copiar imagens. Entre em contato para obter permissão.&quot;);
    });
</script>  


Trechinho de Código:
(spoiler: seu site vai virar detector de Flash Reverso dos robôs)

javascript

// Detecta interações rápidas demais (típicas de bots) const clicks = []; const THRESHOLD_TIME = 150; // milissegundos const MAX_CLICKS_TO_ANALYZE = 5; document.addEventListener('click', function(event) { const timestamp = new Date().getTime(); clicks.push(timestamp); if (clicks.length > MAX_CLICKS_TO_ANALYZE) { clicks.shift(); // Mantém apenas os últimos cliques // Analisa o tempo entre cliques let suspiciousClicks = 0; for (let i = 1; i < clicks.length; i++) { if (clicks[i] - clicks[i-1] < THRESHOLD_TIME) { suspiciousClicks++; } } if (suspiciousClicks >= 3) { // Comportamento suspeito detectado document.body.innerHTML = 'Comportamento suspeito detectado.'; reportSuspiciousActivity(); } } }); function reportSuspiciousActivity() { // Lógica para registrar atividade suspeita fetch('/api/security/report', { method: 'POST', body: JSON.stringify({ type: 'rapid-clicking', timestamp: new Date().toISOString() }) }); }

Este código monitora a velocidade dos cliques e identifica padrões que seriam difíceis para humanos replicarem, como cliques muito rápidos em sequência.


2. Detectando Navegador Headless: Só Olho Vivo, Sem Corpo!

Bot safado ama navegador "fantasma" (headless). A gente detecta e mete o pé na porta!

Trechinho de Código:



<script type="text/javascript" src="./headlessDetect.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var headlessDetector = new HeadlessDetect();
if(headlessDetector.getHeadlessScore() > 0.25) {
// Navegador headless detectado
console.log("Navegador headless detectado");
// Implementa medidas anti-scraping
disruptScrapingAttempt();
}
});
function disruptScrapingAttempt() {
// Modifica o DOM de maneira que afeta apenas scrapers
// Apresenta conteúdo falso ou mensagem de erro
setTimeout(() => {
document.querySelectorAll('.property-card').forEach(card => {
// Substitui informações reais por falsas para scrapers
const originalHTML = card.innerHTML;
card.setAttribute('data-original', btoa(originalHTML));
card.innerHTML = "<p>Conteúdo indisponível temporariamente</p>";
});
}, 100);
}
</script>

3. Rolagem de Página: Bot, Vai Rolar Não!

Bot adora descer a página igual adolescente em rede social.

A gente deixa armadilha pra prender o safado num loop infinito de conteúdo falso. 🎣

Trechinho de Código:


// Código armando cilada para scraper mané
javascript
// Monitora comportamento de rolagem let scrollEvents = 0; let lastScrollTime = 0; let isBlockingScroll = false; window.addEventListener("scroll", function() { const currentTime = new Date().getTime(); scrollEvents++; // Verifica se chegou ao fim da página if (window.innerHeight + window.scrollY >= document.body.offsetHeight) { // Detecta rolagem até o fim console.log("scrolled to bottom"); // Verifica se foi rápido demais (comportamento de bot) if (scrollEvents > 10 && (currentTime - lastScrollTime) < 3000) { isBlockingScroll = true; implementScrollDefense(); } } // Verifica padrões suspeitos de rolagem if (lastScrollTime > 0 && (currentTime - lastScrollTime) < 50) { // Rolagem mais rápida que um humano normal scrollSuspicionCounter++; if (scrollSuspicionCounter > 5) { isBlockingScroll = true; implementScrollDefense(); } } lastScrollTime = currentTime; }); function implementScrollDefense() { // Implementa mecanismos anti-scraping if (isBlockingScroll) { // Adiciona conteúdo infinito falso para prender o scraper setInterval(() => { const fakeContent = document.createElement('div'); fakeContent.className = 'fake-content'; fakeContent.innerHTML = `<div class="property-item"> <h3>Propriedade ${Math.floor(Math.random() * 1000)}</h3> <p>Conteúdo gerado dinamicamente...</p> </div>`; document.body.appendChild(fakeContent); }, 500); // Altera o comportamento de rolagem window.scrollTo = function() { return false; }; } }

4. Honeypot: Docinho de Bot (Só Que Não)

Campo escondido no formulário.
Humano de verdade não vê, bot burro preenche, a gente detecta, ri da cara dele e bloqueia.

Trechinho de Código:

<!-- Honeypot ativado! -->

<form action="/submit" method="post" id="contact-form"> <div class="form-group"> <label for="nome">Nome</label> <input type="text" id="nome" name="nome" required> </div> <!-- Honeypot: invisível para humanos, atraente para bots --> <div class="business"> <label for="work-email" aria-hidden="true">E-mail de Trabalho</label> <input type="email" id="work-email" name="work-email" tabindex="-1"> </div> <div class="form-group"> <label for="email">E-mail</label> <input type="email" id="email" name="email" required> </div> <div class="form-group"> <label for="mensagem">Mensagem</label> <textarea id="mensagem" name="mensagem" required></textarea> </div> <button type="submit" id="submit">Enviar</button> </form> <style> .business { position: absolute; left: 0%; top: 0%; right: auto; bottom: auto; z-index: -1; overflow: hidden; width: 0px; height: 0px; opacity: 0; display: none; } </style> <script> const submit = document.querySelector("#submit"); const honeypot = document.querySelector("#work-email"); honeypot.oninput = function() { if (honeypot.value.length > 0) { // Bot detectado - desabilita o botão de envio submit.disabled = true; // Registra a tentativa de bot fetch('/api/security/report-bot', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ type: 'honeypot-triggered', timestamp: new Date().toISOString() }) }); } }; </script>

Quer mais dicas de tecnologia com aquele toque de nostalgia, piadas ruins e sabedoria do interior?
Segue a gente porque aqui a gente ri da tecnologia antes que ela ria da gente! 🤠
sim aqui tem um codigo aqui nao ta vendo???

5. Exemplo de Código: Ofuscação de Conteúdo Crítico

javascript

// ativar poeira nos bots! (function() { // Ofuscação com Base64 const encodedContent = "SGlkZGVuIGNvbnRlbnQgdGhhdCBzaG91bGQgbm90IGJlIHNjcmFwZWQ="; // Função para decodificar apenas para usuários legítimos function showRealContent() { if (isLegitimateUser()) { const realContent = atob(encodedContent); document.getElementById('protected-content').innerHTML = realContent; } } // Função para verificar legitimidade do usuário function isLegitimateUser() { // Implementa várias verificações let legitimacyScore = 0; // Verifica interações prévias na página if (window.userInteractions && window.userInteractions > 3) { legitimacyScore += 2; } // Verifica tempo na página if (window.pageLoadTime && ((new Date().getTime() - window.pageLoadTime) > 15000)) { legitimacyScore += 2; } // Verifica comportamento de mouse if (window.mouseMovements && window.mouseMovements > 10) { legitimacyScore += 1; } return legitimacyScore >= 3; } // Inicia monitoramento de interações window.userInteractions = 0; window.pageLoadTime = new Date().getTime(); window.mouseMovements = 0; document.addEventListener('click', function() { window.userInteractions++; }); document.addEventListener('mousemove', function() { window.mouseMovements++; }); // Revela conteúdo após verificações setTimeout(showRealContent, 1000);


🎯 Conclusão: Ou Você Defende Seu Site, Ou Vira Piquenique de Bot

Hoje em dia, deixar seu site sem proteção é tipo jogar PS5 no meio da praça e esperar ninguém levar.
Implementa essas técnicas, revisa seus logs e mantém o site filé, porque scraper bom é scraper chorando no suporte técnico.

Ah, e lembra: proteger site também é proteger o meio ambiente, viu? Cada servidor que você salva de sobrecarga, é menos energia jogada fora. 🌎✨


🧠 Bônus TopCringeTech

Quer mais dicas de tecnologia com aquele toque de nostalgia, piadas ruins e sabedoria do interior?
Segue a gente porque aqui a gente ri da tecnologia antes que ela ria da gente! 🤠
sim aqui tem um codigo aqui nao ta vendo???

Esta implementação de honeypot, baseada no exemplo dos resultados de pesquisa 5, cria um campo invisível para usuários humanos. Se um bot preencher este campo, ele é identificado como não-humano e o envio do formulário é bloqueado.


Implementando Bloqueios de IP e Rate Limiting

O relatório menciona possíveis bloqueios por IP e rate limiting como barreiras efetivas contra scrapers.

Exemplo de Código: Implementação de Verificações no Front-end

javascript
// Sistema de verificação de acesso document.addEventListener('DOMContentLoaded', function() { // Faz verificação inicial do acesso fetch('/api/access/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include' // Importante para autenticação }) .then(response => response.json()) .then(data => { if (data.status === 'blocked' || data.rateLimit === 'exceeded') { // Implementa medidas contra acesso bloqueado document.body.innerHTML = '<h1>Acesso temporariamente indisponível</h1>'; return; } // Inicia monitoramento contínuo initAccessMonitoring(); }) .catch(error => { console.error('Erro na verificação de acesso:', error); }); function initAccessMonitoring() { // Monitora padrões de requisição let requestCount = 0; const originalFetch = window.fetch; // Sobrescreve o método fetch window.fetch = function() { requestCount++; // Verifica se há muitas requisições em sequência if (requestCount > 15 && (requestCount / ((new Date().getTime() - window.pageLoadTime) / 1000)) > 2) { // Taxa de requisição suspeita (mais de 2 por segundo) reportSuspiciousActivity('excessive-requests'); } return originalFetch.apply(this, arguments); }; } }); function reportSuspiciousActivity(type) { // Implementa relatório de atividade suspeita const reportData = { type: type, timestamp: new Date().toISOString(), userAgent: navigator.userAgent, page: window.location.href }; // Envia relatório para o backend navigator.sendBeacon('/api/security/report-activity', JSON.stringify(reportData)); }

Esta implementação monitora padrões de requisição e comportamentos suspeitos, enviando relatórios para o backend que pode implementar bloqueios de IP ou rate limiting1.

Desafios de JavaScript e CAPTCHAs

Implementar desafios baseados em JavaScript e CAPTCHAs é uma estratégia eficaz mencionada no relatório.

Exemplo de Código: Desafio JavaScript Personalizado

javascript
// Implementa desafio JavaScript function implementJavaScriptChallenge() { // Gera valores aleatórios para o desafio const a = Math.floor(Math.random() * 10) + 1; const b = Math.floor(Math.random() * 10) + 1; const operation = Math.random() > 0.5 ? 'soma' : 'multiplicação'; // Cria desafio dinâmico const expectedResult = operation === 'soma' ? a + b : a * b; // Cria overlay na página const overlay = document.createElement('div'); overlay.style.position = 'fixed'; overlay.style.top = '0'; overlay.style.left = '0'; overlay.style.width = '100%'; overlay.style.height = '100%'; overlay.style.backgroundColor = 'rgba(0,0,0,0.8)'; overlay.style.zIndex = '9999'; overlay.style.display = 'flex'; overlay.style.justifyContent = 'center'; overlay.style.alignItems = 'center'; // Cria conteúdo do desafio overlay.innerHTML = ` <div style="background: white; padding: 20px; border-radius: 5px; max-width: 400px;"> <h2>Verificação de Segurança</h2> <p>Para continuar navegando, por favor resolva o seguinte desafio:</p> <p>Qual é o resultado da ${operation} de ${a} e ${b}?</p> <input type="number" id="challenge-answer" placeholder="Digite sua resposta"> <button id="challenge-submit">Verificar</button> </div> `; document.body.appendChild(overlay); // Monitora resposta document.getElementById('challenge-submit').addEventListener('click', function() { const userAnswer = parseInt(document.getElementById('challenge-answer').value); if (userAnswer === expectedResult) { // Resposta correta overlay.remove(); // Armazena sucesso do desafio localStorage.setItem('challenge_passed', new Date().getTime()); } else { // Resposta incorreta document.querySelector('#challenge-submit').insertAdjacentHTML('afterend', '<p style="color: red;">Resposta incorreta. Tente novamente.</p>'); // Incrementa contador de falhas const failCount = parseInt(localStorage.getItem('challenge_fails') || '0') + 1; localStorage.setItem('challenge_fails', failCount); // Se falhar muitas vezes, implementa bloqueio temporário if (failCount >= 3) { overlay.innerHTML = ` <div style="background: white; padding: 20px; border-radius: 5px;"> <h2>Acesso Temporariamente Bloqueado</h2> <p>Muitas tentativas incorretas foram detectadas.</p> <p>Por favor, tente novamente em 5 minutos.</p> </div> `; // Reporta atividade suspeita reportSuspiciousActivity('challenge-failed-multiple'); } } }); } // Verifica se precisa implementar o desafio if (!localStorage.getItem('challenge_passed') || (new Date().getTime() - parseInt(localStorage.getItem('challenge_passed'))) > 3600000) { // Implementa desafio se nunca passou ou se passou há mais de 1 hora implementJavaScriptChallenge(); }

Este código implementa um desafio matemático simples que bots teriam dificuldade em resolver automaticamente, especialmente quando combinado com alterações dinâmicas e aleatórias13.

Conclusão: Estratégia de Defesa em Profundidade

As técnicas apresentadas neste artigo demonstram como o site fsimobiliaria.com conseguiu frustrar tentativas de web scraping através de múltiplas camadas de proteção. Para uma defesa eficaz, recomenda-se implementar várias dessas técnicas simultaneamente, criando uma "defesa em profundidade".

As implementações descritas são particularmente eficazes porque não dependem de uma única barreira, mas sim de uma combinação de:

  1. Detecção de comportamentos não-humanos

  2. Identificação de navegadores headless

  3. Interferência em padrões de rolagem

  4. Técnicas de honeypot

  5. Ofuscação de código JavaScript

  6. Bloqueios de IP e rate limiting

  7. Desafios de JavaScript

Para sites que precisam proteger seu conteúdo contra scraping, a implementação dessas técnicas pode significar a diferença entre ter seu conteúdo extraído facilmente ou manter o controle sobre como suas informações são acessadas e utilizadas.

É importante ressaltar que estas técnicas devem ser implementadas com cuidado para não afetar a experiência de usuários legítimos, encontrando o equilíbrio entre segurança e usabilidade. O objetivo final é proteger seu conteúdo sem prejudicar a navegação de visitantes reais.

Agora se o seu intuito é que uma pagina seja encontrada pelo Perplexity.ai  por que você quer relevância, combinamos para outra hora, tem uns bizu que nem com carteirinha da area 51 voce tera acesso.

Anti-Web Scraping Ninja: Como Blindar Seu Site


Citações em:

  1. https://www.semanticscholar.org/paper/dc09954212dd9063b367a43387a5e01267bc8b96
  2. https://github.com/LouisKlimek/HeadlessDetectJS
  3. https://workos.com/blog/bot-detection-with-js-tagging
  4. https://digital.ai/catalyst-blog/obfuscate-javascript-code/
  5. https://github.com/Webflow-Examples/honeypot
  6. https://plainenglish.io/blog/how-to-detect-scroll-end-with-javascript
  7. https://www.akamai.com/blog/security/catch-me-if-you-can-javascript-obfuscation
  8. https://www.semanticscholar.org/paper/d141f626d6ddc4eb17cfb2219dcbeb7ecc69f2eb
  9. https://codepen.io/colinsteinmann/pen/FBrCd
  10. https://www.semanticscholar.org/paper/4137a5d49d416dc0028ed2e539cf90f02fc776c2
  11. https://www.semanticscholar.org/paper/c38269ffbdf95bacc79e53dc499418dc2858bc93
  12. https://www.semanticscholar.org/paper/1ac6e1426dc3f20a3a8fb37dbe832fa605a1f5f1
  13. https://www.semanticscholar.org/paper/933cf574a697abeac85621cd325b83cc4529c460
  14. https://www.semanticscholar.org/paper/eb9dc8133a1de54df73ad72ccc52e95213adbaab
  15. https://www.semanticscholar.org/paper/a70129bba493e3116a9a383f5d3eecea05f03de5
  16. https://scrapfly.io/blog/how-to-avoid-web-scraping-blocking-javascript/
  17. https://docs.apify.com/academy/anti-scraping/techniques
  18. https://dev.to/pragativerma18/understanding-javascript-deobfuscation-in-web-scraping-5c2f
  19. https://brightdata.com/blog/web-data/anti-scraping-techniques
  20. https://www.semanticscholar.org/paper/448dc652648d519f4fd3cc9df7d03f8bcf07e494
  21. https://www.semanticscholar.org/paper/a62ac866d32952fca3199a4b784653038c9e4006
  22. https://www.zenrows.com/blog/anti-scraping
  23. https://www.scrapeless.com/en/blog/anti-scraping-strategies
  24. https://piprogramming.org/articles/6-Ways-to-detect-a-headless-Browser-with-JavaScript--How-to-detect-a-Headless-Browser-0000000030.html
  25. https://blog.castle.io/bot-detection-101-how-to-detect-bots-in-2025-2/
  26. https://dev.to/brinobruno/how-to-use-shadow-dom-and-honeypots-to-deter-crawlers-5831
  27. https://www.devzery.com/post/obfuscate-js
  28. https://github.com/JonasCz/How-To-Prevent-Scraping
  29. https://github.com/infosimples/detect-headless
  30. https://www.zenrows.com/blog/selenium-avoid-bot-detection
  31. https://hackernoon.com/avoid-getting-caught-in-a-honeypot-trap-when-scraping-the-web
  32. https://www.akamai.com/blog/security/catch-me-if-you-can-javascript-obfuscation
  33. https://rayobyte.com/blog/anti-scraping/
  34. https://www.semanticscholar.org/paper/25ac2c5dddf2dcb266efb474f1b894193bd6e155
  35. https://www.semanticscholar.org/paper/70f7ad94863b4216c12251db4ce729a06fcbc037
  36. https://stackoverflow.com/questions/16861325/honeypot-implementation
  37. https://scrapfly.io/blog/what-are-honeypots-and-how-to-avoid-them/
  38. https://portswigger.net/web-security/essential-skills/obfuscating-attacks-using-encodings
  39. https://haacked.com/archive/2007/09/11/honeypot-captcha.aspx/
  40. https://www.youtube.com/watch?v=du7evpzsy_Y
  41. https://repositorio-aberto.up.pt/bitstream/10216/135504/2/487162.pdf
  42. https://ransomware.org/how-to-prevent-ransomware/threat-hunting/honeypots-and-honeyfiles/
  43. https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
  44. https://stackoverflow.com/questions/44397492/detect-chrome-running-in-headless-mode-from-javascript
  45. https://stackoverflow.com/questions/9977921/dynamic-javascript-obfuscation
  46. https://webflow.com/made-in-webflow/honeypot
  47. https://github.com/infosimples/detect-headless/blob/master/index.html
  48. https://github.com/vallafederico/hacking-webflow/blob/master/readme.md
  49. https://github.com/paralax/awesome-honeypots
  50. https://huggingface.co/datasets/hsultanbey/javascript/viewer
  51. https://github.com/infosimples/detect-headless/pulls
  52. https://stackoverflow.com/questions/tagged/headless?pagesize=50
  53. https://stackoverflow.com/questions/tagged/headless?tab=newest&page=5
  54. https://stackoverflow.com/questions/tagged/headless?tab=Active
  55. https://stackoverflow.com/questions/tagged/google-chrome-headless
  56. https://www.zenrows.com/blog/web-scraping-without-getting-blocked
  57. https://www.semanticscholar.org/paper/5dcb756d00a827b532319d352c2ffa5f3c4f29fb
  58. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10280413/
  59. https://www.semanticscholar.org/paper/e8116b9b471ad137a9fb7392a6c214341eb04931
  60. https://www.semanticscholar.org/paper/d820149a7a5497ac1cd84fd16badc668a70d4b19
  61. https://www.semanticscholar.org/paper/9effd0a22b530381a7cfc08415001cc38ea1940a
  62. https://www.semanticscholar.org/paper/53ed79cc7616c841c5888e218dc90727f16e71b6
  63. https://www.semanticscholar.org/paper/ce4d3383a3b55a6403684e6d210af8740e529cd4
  64. https://www.semanticscholar.org/paper/b77c3a804c24c75aa3303a450205245062366fe6
  65. https://dev.to/rohitnirban/honeypot-for-spam-prevention-react-tailwind-css-57lh
  66. https://github.com/hungluu/honeyjs
  67. https://stackoverflow.com/questions/7035896/detect-whether-scroll-event-was-created-by-user
  68. https://webflow.com/made-in-webflow/website/testing-honeypot
  69. https://github.com/Webflow-Examples/honeypot/actions
  70. https://github.com/Webflow-Examples/honeypot
  71. https://gist.github.com/rileyrichter/66e2495c5d4f2e47b317efb513a31ca3
  72. https://gist.github.com/rileyrichter/f9467fa903575a67cff92a7c009a2037
  73. https://github.com/LouisKlimek/HeadlessDetectJS
  74. https://github.com/orgs/Webflow-Examples/repositories
  75. https://github.com/LouisKlimek/HeadlessDetectJS/blob/main/example.html