Ir para o conteúdo

403 Proibido: a ruína dos raspadores da web (e como evitá-lo)

Se você já tentou extrair dados de sites, quase certamente se deparou com o temido erro “403 Forbidden” em algum momento. Este código de status HTTP indica que o servidor entendeu sua solicitação, mas se recusa a atendê-la. Em outras palavras, você não tem permissão para acessar o recurso solicitado.

Para web scrapers, os erros 403 são uma dor de cabeça constante. Os sites os utilizam para impedir o acesso não autorizado às páginas e para bloquear o tráfego que parece vir de bots ou scrapers, e não de usuários humanos. Obter uma resposta 403 pode interromper bruscamente seu projeto de web scraping.

Mas não se desespere! Embora os erros 403 possam ser frustrantes, eles não são intransponíveis. Com as técnicas certas, é possível evitar o acionamento de 403s e manter seu web scraper funcionando perfeitamente. Neste guia, mergulharemos nas causas dos erros 403 e exploraremos estratégias para evitá-los. Vamos começar!

Por que Web Scrapers encontram erros 403

Existem alguns motivos principais pelos quais um web scraper pode receber uma resposta 403 Forbidden de um site:

  1. Solicitando um recurso restrito: algumas páginas estão simplesmente fora do alcance de usuários não autorizados. Por exemplo, tentar acessar uma página que requer login, como um painel de usuário, geralmente resultará em um erro 403 se você não tiver uma sessão válida.

  2. Autenticação ausente: muitos sites exigem alguma forma de autenticação, como fazer login com nome de usuário e senha, para acessar determinadas páginas. Se o seu web scraper não fornecer as credenciais de autenticação necessárias, provavelmente receberá uma resposta 403.

  3. Detecção de bot: os sites geralmente empregam diversas técnicas para detectar e bloquear tráfego que parece vir de bots ou scrapers. Se um site acreditar que seu web scraper é uma ferramenta automatizada e não um usuário humano, ele poderá responder com um erro 403.

  4. Sistemas anti-bot: alguns sites usam soluções anti-bot dedicadas, como Cloudflare, Imperva ou PerimeterX, para proteção contra scraping e outras ameaças automatizadas. Esses sistemas analisam padrões de tráfego e bloqueiam solicitações que parecem suspeitas, geralmente retornando erros 403.

Para raspar sites com sucesso, precisamos de maneiras de evitar esses problemas e convencer os sites de que nosso web scraper é um usuário legítimo e autorizado. Felizmente, existem várias abordagens que podemos adotar. Vejamos algumas das táticas mais eficazes.

Fornecendo autenticação

Se um site exigir login para acessar o conteúdo que você deseja copiar, você precisará incluir autenticação em seu processo de web scraping. Isso normalmente envolve duas etapas:

  1. Inspecionando o processo de login: use as ferramentas de desenvolvedor do seu navegador para observar o tráfego de rede ao fazer login no site manualmente. Procure a solicitação que envia as credenciais de login e anote o URL, o método de solicitação, os cabeçalhos e o corpo da solicitação. Você precisará replicar esta solicitação em seu web scraper.

  2. Fazendo login programaticamente: Use uma biblioteca como Requests do Python ou Axios do Node.js para enviar uma solicitação de login imitando aquela que você observou. Capture todos os cookies retornados pelo site, pois eles geralmente contêm tokens de sessão necessários para autenticar solicitações subsequentes. Inclua esses cookies nos cabeçalhos de suas solicitações de web scraping para manter uma sessão de login válida.

Aqui está um exemplo de login programaticamente em um site usando Python e solicitações:

import requests

# Start a new session
session = requests.Session() 

# Send a POST request to the login URL with the necessary credentials
login_data = {
    ‘username‘: ‘my_username‘,
    ‘password‘: ‘my_password‘,
}
response = session.post(‘https://example.com/login‘, data=login_data)

# The session now contains the cookies needed to authenticate future requests
response = session.get(‘https://example.com/restricted_page‘)

Ao autenticar seu web scraper e incluir os cookies e cabeçalhos necessários em suas solicitações, você pode evitar erros 403 causados ​​pela falta de permissões.

Técnicas furtivas

É claro que o login nem sempre é suficiente. Os sites estão envolvidos em um constante jogo de gato e rato com web scrapers, em busca de sinais que distingam os bots dos usuários humanos. Para evitar serem bloqueados, os web scrapers precisam se misturar, imitando o comportamento humano o mais fielmente possível.

Algumas técnicas furtivas importantes incluem:

  • Rotação de agentes de usuário: O agente do usuário é uma string que identifica o cliente que está fazendo uma solicitação. Usar o mesmo agente de usuário para todas as solicitações é uma indicação absoluta de que o tráfego vem de um bot. Em vez disso, mantenha um conjunto de strings de agente de usuário e selecione aleatoriamente um diferente para cada solicitação.

  • Rotação de endereços IP: enviar um grande volume de solicitações de um único endereço IP é outro sinal de alerta para sistemas de detecção de bots. Use um serviço de proxy para rotear solicitações por meio de vários endereços IP. Para obter melhores resultados, escolha um provedor que ofereça um grande conjunto de IPs residenciais.

  • Randomizando padrões de solicitação: Os humanos não navegam em sites de maneira perfeitamente regular. Eles pausam, mudam de página de forma irregular e variam o tempo entre as solicitações. Introduza atrasos aleatórios entre suas solicitações de web scraping e evite rastrear sites em um padrão perfeitamente previsível.

  • Lidando com CAPTCHAs: alguns sites apresentarão CAPTCHAs quando suspeitarem de atividade de bot. CAPTCHAs podem ser difíceis de serem resolvidos automaticamente pelos web scrapers. Se você os encontrar com frequência, pode ser necessário usar um serviço de solução CAPTCHA que utiliza trabalhadores humanos para completar os desafios em nome do seu scraper.

Aqui está um exemplo de solicitação mais furtiva em Python usando um agente de usuário aleatório e atrasos:

import requests
import random
import time

# List of user agent strings
user_agents = [    
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36‘,  
]

# Randomize user agent 
headers = {‘User-Agent‘: random.choice(user_agents)}

# Introduce a random delay of 1-5 seconds
time.sleep(random.randint(1, 5))

# Send the request
response = requests.get(‘https://example.com‘, headers=headers)

Ao tomar medidas para fazer com que o tráfego do seu web scraper pareça o mais “humano” possível, você pode reduzir significativamente o risco de encontrar erros 403 e outros obstáculos.

Automação Indetectável

Para obter o web scraping mais furtivo possível, você pode usar uma ferramenta completa de automação do navegador, como Puppeteer ou Playwright. Essas ferramentas executam um navegador real (Chrome ou Firefox) de forma programática, permitindo que você interaja com sites de uma forma que é muito difícil de distinguir de usuários humanos reais.

As ferramentas de automação do navegador podem ser configuradas para máxima discrição. Por exemplo, você pode configurá-los para bloquear o código de impressão digital JavaScript, mascarar os sinais reveladores de automação em objetos Navigator e tornar aleatórias as dimensões da janela de visualização. Ao controlar um navegador real, você também obtém tratamento automático de cookies, cabeçalhos, redirecionamentos e outros aspectos do HTTP que as bibliotecas básicas de web scraping não gerenciam para você.

A desvantagem da automação do navegador é que ela consome mais recursos e é mais lenta do que enviar solicitações HTTP simples com uma biblioteca como Requests ou Axios. A compensação no desempenho pode valer a pena, entretanto, para sites que são particularmente agressivos no bloqueio de scrapers.

Aqui está um exemplo básico de uso do Puppeteer em Node.js para visitar uma página no Chrome headless:

const puppeteer = require(‘puppeteer‘);

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Configure the browser for stealth (omitted for brevity)

  await page.goto(‘https://example.com‘);

  // Scrape data from the page...

  await browser.close();
})();

Com algumas configurações adicionais, ferramentas como o Puppeteer podem ser uma maneira poderosa de automatizar a raspagem, evitando a detecção.

Conclusão

Encontrar erros 403 é uma parte inevitável do web scraping, mas com a abordagem certa eles não precisam atrapalhar seus projetos. Ao entender por que os 403s acontecem e tomar medidas para evitar acioná-los – por meio de autenticação, técnicas furtivas e automação indetectável – você pode manter seu web scraper funcionando perfeitamente.

A abordagem mais eficaz irá variar dependendo dos sites específicos que você está almejando. Alguns podem exigir apenas cabeçalhos de solicitação simples para evitar erros 403, enquanto outros podem exigir uma configuração completa de automação do navegador. O segredo é começar com técnicas básicas e adicionar camadas mais sofisticadas de furtividade conforme necessário, com base nos obstáculos que encontrar.

Se o desafio em constante evolução de evitar 403s e outras medidas anti-scraping parecer assustador, você pode querer considerar a utilização de uma API de web scraping pronta para uso, em vez de construir e manter sua própria infraestrutura de scraping. Serviços como ScrapingBee e ScraperAPI oferecem scrapers testados em batalha com prevenção 403 integrada que pode economizar um tempo de desenvolvimento substancial.

Quer você opte por lançar seu próprio web scraper ou usar uma solução pré-construída, o importante é não permitir que erros 403 o impeçam de obter os dados necessários. Com um pouco de persistência e as ferramentas certas em seu kit, você pode manter seu web scraper funcionando mesmo diante de qualquer contramedida anti-bot. Boa raspagem!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *