Causas de ocorrência
Por que o servidor bloqueia o acesso aos dados? No web scraping, o erro 403 ocorre devido a mecanismos de proteção de sites contra acesso não autorizado ou uso excessivo de recursos. Vamos analisar com mais detalhes as causas desse erro e suas soluções.
Restrição por endereço IP: os sites podem limitar o acesso por IP. Se muitas requisições forem feitas a partir de um único IP, o servidor pode bloqueá-lo para evitar sobrecarga e proteger contra possíveis ataques.
Modo headless: o uso de navegador headless em ferramentas de automação como Selenium também pode causar erros. Alguns sites conseguem detectar que as requisições vêm de um navegador em modo headless, onde não há interação do usuário (como cliques ou rolagem de página). Isso pode indicar acesso automatizado, que pode ser considerado atividade suspeita. No entanto, se você realmente precisar desse modo, configure o navegador para simular um navegador real com interface gráfica.
Ausência de cabeçalhos e cookies necessários. Alguns sites exigem cookies ou sessões específicas para acessar o conteúdo.
User-Agent incorreto: muitos sites verificam o cabeçalho User-Agent com informações do navegador e dispositivo. Se você não definir esse cabeçalho, defini-lo incorretamente ou não alterá-lo em requisições em larga escala, o servidor pode negar o acesso.
Como contornar o erro 403 no web scraping
Para que a coleta de dados ocorra sem falhas, vamos analisar alguns métodos eficazes para evitar bloqueios de acesso aos recursos necessários:
- Uso de proxies de qualidade: a troca periódica de endereço IP ajuda a evitar bloqueios. É importante usar proxies confiáveis para não cair em listas negras.
- Evitar requisições muito frequentes: reduzir a frequência das requisições e adicionar atrasos entre elas pode ajudar a evitar bloqueios. Se você estiver usando Python no seu scraper, a biblioteca time pode ser usada para adicionar atrasos entre requisições:
import time
time.sleep(5) # atraso de 5 segundos entre requisições
- Simulação de navegador real. Para isso, podem ser usadas várias opções, como no Selenium:
from selenium import webdriver
options = webdriver.ChromeOptions()
# Não adicionar --headless se for necessário um navegador com interface gráfica
options.add_argument("--headless")
# Simulação de tamanho de tela
options.add_argument("window-size=1920,1080")
# Este parâmetro ajuda a ocultar sinais de automação.
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
- Se o site exigir autenticação, é importante armazenar e usar cookies corretamente. Com a biblioteca requests, é possível enviar cookies junto com as requisições:
import requests
session = requests.Session()
response = session.get('https://example.com')
# uso de cookies em requisições subsequentes
response2 = session.get('https://example.com/another-page')
- Definição correta de User-Agent: usar User-Agents realistas pode ajudar a evitar bloqueios. O ideal é usar aqueles utilizados por navegadores populares (como Chrome e Firefox):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
- Também é possível usar rotação de User-Agent com a biblioteca Python random. Para isso, é necessário criar uma lista separada de User-Agents de diferentes navegadores e atualizá-la periodicamente.
Exemplo de código para escolher um User-Agent aleatório de uma lista pré-definida usando random:
import random
import requests
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.122 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/56.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15",
]
random_user_agent = random.choice(user_agents)
headers = {
"User-Agent": random_user_agent
}
response = requests.get("https://example.com", headers=headers)
print(f"Status code: {response.status_code}")
print(f"User-agent utilizado: {random_user_agent}")
Além de alterar o User-Agent, essa biblioteca também permite usar endereços IP aleatórios para cada requisição a partir de um pool de proxies, adicionar atrasos aleatórios entre requisições e rotacionar outros elementos para simular o comportamento de diferentes usuários e dispositivos.