Cómo usar proxies para web scraping: guía para principiantes
Descubre por qué las webs bloquean a los scrapers, cómo los proxies evitan los bloqueos de IP, las diferencias entre proxies residenciales y de datacenter, rotativos y fijos, y prácticas esenciales como configurar cabeceras y respetar robots.txt.
Por qué los sitios web bloquean los scrapers
Cuando envías una solicitud desde una única dirección IP con alta frecuencia, el servidor identifica fácilmente ese tráfico como no humano. La limitación de frecuencia, las listas negras de IP, los CAPTCHA e incluso las amenazas legales son defensas habituales. Sin una estrategia de proxies, tu scraper se topará con un muro tras unos cientos de solicitudes.
El problema de fondo es la limitación de frecuencia basada en IP: cada solicitud lleva tu IP pública y, si llegan demasiadas demasiado rápido, el servidor da por hecho que hay abuso. Los proxies lo resuelven distribuyendo las solicitudes entre muchas IP, lo que hace que el tráfico parezca orgánico.
Cómo ayudan los proxies a evitar bloqueos de IP
Un proxy se sitúa entre tu scraper y el servidor de destino. El servidor ve la IP del proxy, no la tuya. Si vas rotando por un grupo de proxies, te mantienes por debajo del límite de frecuencia por IP. Incluso con un scraping agresivo, ninguna IP individual recibe un volumen alto.
En esencia, los proxies actúan como un búfer que absorbe la culpa. El servidor ve muchos visitantes diferentes desde ubicaciones distintas, cada uno haciendo un número moderado de solicitudes. Eso es mucho más difícil de marcar como bot.
Proxies residenciales frente a proxies de centro de datos
No todos los proxies son iguales. La elección entre proxies residenciales y de centro de datos depende de la sensibilidad del sitio de destino y de tu presupuesto.
- Proxies residenciales: proceden de ISP reales y parecen usuarios domésticos genuinos. Son más difíciles de detectar y bloquear, pero cuestan más y son más lentos. Úsalos para grandes sitios de comercio electrónico o plataformas de redes sociales que bloquean de forma agresiva los rangos de IP de centros de datos.
- Proxies de centro de datos: están alojados en servidores en la nube. Son baratos, rápidos y abundantes, pero muchos sitios tienen sus rangos de IP marcados. Funcionan bien para sitios menos protegidos o cuando necesitas un alto rendimiento.
La lista de proxies por tipo de ProxyVerity te ayuda a encontrar ambos tipos de proxies verificados.
Proxies rotativos frente a proxies persistentes
La rotación determina con qué frecuencia cambia tu IP. Hay dos modos habituales:
- Rotativos: una IP nueva para cada solicitud (o cada pocas solicitudes). Son los mejores para hacer scraping de muchas páginas del mismo sitio, ya que reparten las solicitudes de forma dispersa.
- Persistentes: la misma IP se mantiene durante una sesión (por ejemplo, 10 minutos). Resultan útiles cuando necesitas mantener una sesión o un estado con la sesión iniciada, como al hacer scraping de un panel privado después de iniciar sesión.
La mayoría de los proveedores de proxies te permiten activar o desactivar la rotación. Para principiantes, la rotación es más segura: la solicitud A procede de la IP 1, la solicitud B de la IP 2, etc. El servidor nunca ve tráfico sostenido desde una única fuente.
Configurar cabeceras de solicitud y User-Agent
Los proxies resuelven el problema de la IP, pero los servidores también inspeccionan las cabeceras de solicitud. La biblioteca requests de Python, por defecto, envía un User-Agent revelador: python-requests/2.x. Solo eso ya puede hacer que te bloqueen.
Configura siempre cadenas de User-Agent realistas (por ejemplo, las de un navegador reciente) e imita cabeceras habituales como Accept, Accept-Language y Referer. Rota los User-Agent junto con las IP.
«Si tu solicitud no parece venir de un navegador real, ya partes en desventaja.»
Usa una lista rotativa de User-Agent, uno por solicitud. Muchas bibliotecas y servicios la ofrecen; incluso una simple lista de diez cadenas funciona muy bien.
Añadir retrasos y aleatoriedad
Incluso con proxies y encabezados, enviar solicitudes demasiado rápido activa la detección de comportamiento. El servidor ve que cada 0,5 segundos llega exactamente una solicitud. Los visitantes humanos no se comportan así.
Añade retrasos aleatorios entre solicitudes. Por ejemplo, después de cada página, espera entre 2 y 6 segundos, de forma aleatoria. Esto suaviza el patrón de tráfico y te mantiene por debajo de los límites de velocidad. Para trabajos de scraping más grandes, considera rastrear con cortesía: una solicitud por segundo por IP es segura para la mayoría de los sitios.
Ética, legalidad y robots.txt
Usar proxies no te exime de hacer un scraping ético. Comprueba siempre el robots.txt del sitio y sus términos de servicio. Si el sitio lo prohíbe, respétalo: ignorarlo puede acarrear acciones legales. Los proxies públicos son infraestructura de terceros, a menudo gratuita y sin cifrar; nunca envíes datos sensibles a través de ellos.
Nuestra lista de proxies gratuitos se revisa en cuanto a estado y velocidad, pero aun así debes usarlos de forma responsable. Haz scraping a un ritmo razonable, usa caché cuando sea posible y devuelve algo a cambio no saturando los servidores.
Un ejemplo práctico
Aquí tienes un fragmento breve de Python que usa requests con un proxy rotativo y un retraso aleatorio. Obtiene una página de producto de ejemplo con un User-Agent habitual.
import requests
import random
import time
proxies = [
{ 'http': 'http://proxy1:port', 'https': 'http://proxy1:port' },
{ 'http': 'http://proxy2:port', 'https': 'http://proxy2:port' },
# ... añade más de tu lista de proxies
]
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ...',
# ... más User-Agents
]
url = 'https://example.com/products'
for i in range(10):
proxy = random.choice(proxies)
headers = { 'User-Agent': random.choice(user_agents) }
try:
response = requests.get(url, proxies=proxy, headers=headers, timeout=10)
print(f'{i+1}: {response.status_code} de {proxy["http"]}')
except Exception as e:
print(f'{i+1}: Error - {e}')
time.sleep(random.uniform(2, 6))Sustituye las cadenas de proxy por IPs de tu proveedor o de nuestra lista verificada de proxies por ubicación. Para tener mejor anonimato, usa un comprobador de proxies para confirmar que tus proxies funcionan y no filtran DNS ni tu IP real.
Consideraciones finales
Los proxies son una pieza de un rompecabezas mayor: combina la rotación de IP con encabezados, retrasos y prácticas éticas. Empieza poco a poco, prueba a fondo y escala despacio. Con el enfoque adecuado, puedes hacer scraping a escala sin activar bloqueos, y sin dañar los sitios de los que dependes.