scrapy rotating proxies

Los rotating proxies en Scrapy son endpoints de IP por los que un spider de Scrapy va rotando, de modo que las solicitudes consecutivas salen desde direcciones distintas, lo que reduce la probabilidad de límites de tasa y bloqueos de IP. Este tutorial muestra cómo añadir rotating proxies a un proyecto real usando el middleware scrapy-rotating-proxies junto con un gateway residencial rotativo de DataImpulse, y luego verificar y solucionar problemas de la configuración.

Instalarás el middleware, configurarás settings.py, conectarás la detección de bloqueos y los reintentos, confirmarás que la IP de salida realmente cambia y decidirás entre un gateway rotativo y una lista estática de proxies. Cada bloque de código de abajo es ejecutable, y los límites honestos se tratan cerca del final.

DataImpulse es un proveedor de proxies ético que ofrece más de 90 millones de direcciones IP residenciales, móviles y de datacenter en 195 países. Utiliza un modelo de pago por uso desde 1 dólar por GB con tráfico que no caduca, y se usa para web scraping, verificación de anuncios, monitorización de precios, investigación de mercado y gestión de múltiples cuentas.

Datos clave

  • Configuración: los rotating proxies en Scrapy funcionan apuntando el middleware scrapy-rotating-proxies a una lista de endpoints de proxy o a un único gateway rotativo como gw.dataimpulse.com:823, de modo que cada solicitud puede salir desde una IP distinta.
  • Mejor tipo de proxy: rotating proxies residenciales, que usan IP reales de consumidores que superan la detección.
  • Precio: desde 1 dólar por GB, de pago por uso, con tráfico que no caduca y sin suscripción.
  • Cobertura: más de 90M de IP de origen ético en 195 países.
  • Fiabilidad: tasa de éxito del 99.51%, valorado con 4.8 sobre 5 en G2.
  • Protocolos y segmentación: HTTP, HTTPS y SOCKS5, con segmentación por país incluida.
Cómo Scrapy rota los proxies en cada solicitud

¿Qué necesitas antes de empezar con rotating proxies en Scrapy?

Necesitas un proyecto de Scrapy funcional, Python 3.8 o posterior, el paquete scrapy-rotating-proxies y acceso a un pool de endpoints de proxy. La lógica de rotación vive en un downloader middleware, así que no hace falta cambiar nada de tus spiders.

Reúne lo siguiente antes de escribir código:

  • Un proyecto de Scrapy creado con scrapy startproject.
  • El middleware scrapy-rotating-proxies, que es el paquete comunitario documentado en su flujo de trabajo de scraping y alojado en GitHub como scrapy-rotating-proxies.
  • Credenciales de proxy. Esta guía usa los proxies residenciales de DataImpulse, que exponen un único gateway rotativo además de soporte HTTP, HTTPS y SOCKS5 y segmentación por país.

Instala el middleware en el entorno de tu proyecto:

pip install scrapy-rotating-proxies

El paquete añade dos middlewares: RotatingProxyMiddleware, que asigna un proxy a cada solicitud, y BanDetectionMiddleware, que decide si una respuesta parece un bloqueo y rota alejándose de la IP que falla.

¿Cómo se usan los rotating proxies en Scrapy?

Añades scrapy-rotating-proxies declarando tus endpoints de proxy en settings.py y habilitando sus dos downloader middlewares. Hay dos formas de alimentar los proxies: una lista de Python en línea o un archivo de texto cargado desde una ruta.

El enfoque en línea usa ROTATING_PROXY_LIST. Habilita ambos middlewares con las prioridades mostradas para que se ejecuten en el orden correcto:

# settings.py
ROTATING_PROXY_LIST = [
    'http://user:[email protected]:823',
]

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

Para mantener las credenciales fuera del control de versiones, usa ROTATING_PROXY_LIST_PATH y apúntalo a un archivo con un proxy por línea:

# settings.py
ROTATING_PROXY_LIST_PATH = 'proxies.txt'
# proxies.txt (one endpoint per line)
http://user:[email protected]:823
http://user:[email protected]:824

El gateway de DataImpulse es una alternativa de un solo endpoint a mantener una lista larga. Como gw.dataimpulse.com:823 ya rota la IP de salida del lado del proveedor, puedes indicar esa única línea y dejar que ambas capas de rotación se sumen: el gateway elige una IP residencial nueva por solicitud, y el middleware reintenta con el mismo gateway cuando una respuesta se marca como bloqueo. Este es el patrón fiable más simple para la mayoría de los rastreos.

Si prefieres definir el proxy por solicitud en lugar de globalmente, asígnalo mediante el meta de la request en un spider. Así es también como se adjunta explícitamente la autenticación del proxy, lo que se cubre en la guía de DataImpulse sobre autenticación de proxy:

import scrapy

class GatewaySpider(scrapy.Spider):
    name = 'gateway'
    urls = ['https://httpbin.org/ip']

    def start_requests(self):
        proxy = 'http://user:[email protected]:823'
        for url in self.urls:
            yield scrapy.Request(url, meta={'proxy': proxy}, dont_filter=True)

¿Cómo verificas que los rotating proxies funcionan en Scrapy?

Verificas la rotación enviando varias solicitudes a un endpoint que devuelve la IP y confirmando que la IP de origen reportada cambia entre respuestas. httpbin.org/ip devuelve la IP de salida del cliente, lo que lo convierte en una comprobación rápida.

Añade un pequeño spider que golpee el endpoint de eco diez veces y registre cada IP de salida:

import scrapy

class IPCheckSpider(scrapy.Spider):
    name = 'ipcheck'
    start_urls = ['https://httpbin.org/ip'] * 10

    def parse(self, response):
        self.logger.info('Exit IP: %s', response.json()['origin'])

Ejecútalo desde la raíz del proyecto:

scrapy crawl ipcheck

En el log deberías ver varios valores distintos para Exit IP. Si cada línea muestra la misma dirección, la rotación no está activa: confirma que los middlewares están habilitados, que ROTATING_PROXY_LIST no está vacía y que las solicitudes no se sirven desde la caché HTTP. El middleware también registra la salud de los proxies, así que vigila las líneas sobre proxies good, dead y reanimated para confirmar que está gestionando el pool.

¿Cómo solucionas bloqueos y errores 407 con rotating proxies en Scrapy?

La mayoría de los problemas de rotación se reducen a dos preguntas: ¿está el middleware detectando correctamente los bloqueos y está configurada la autenticación del proxy? Una detección de bloqueos débil deja que una IP bloqueada siga sirviendo respuestas basura, mientras que un login mal configurado devuelve un HTTP 407.

Para que la detección de bloqueos sea deliberada en lugar de conjetura, esta guía propone el modelo de detección de bloqueos de cuatro señales para Scrapy. Puntúa cada respuesta según cuatro señales independientes para que un solo falso positivo no descarte un proxy sano:

  • Código de estado: trata 403, 429 y 503 como candidatos a bloqueo, y 200, 301 y 302 como sanos.
  • Destino de la redirección: una redirección 302 hacia un login, un captcha o una ruta de desafío es un bloqueo suave aunque el estado parezca correcto.
  • Huella del cuerpo: analiza el cuerpo en busca de marcadores como captcha, acceso denegado o una carga vacía que una página real nunca devolvería.
  • Latencia: una respuesta mucho más lenta que la media móvil suele indicar limitación antes de un bloqueo total.

Codifica esa política en una clase y regístrala para que BanDetectionMiddleware use tu lógica en lugar de la predeterminada:

# ban_policy.py
class DataImpulseBanPolicy:
    NOT_BAN_STATUSES = {200, 301, 302}

    def response_is_ban(self, request, response):
        if response.status in (403, 429, 503):
            return True
        if b'captcha' in response.body.lower():
            return True
        if not response.body:
            return True
        return False

    def exception_is_ban(self, request, exception):
        return True
# settings.py
ROTATING_PROXY_BAN_POLICY = 'myproject.ban_policy.DataImpulseBanPolicy'

Combina la detección con reintentos y backoff para que una solicitud marcada pase a una IP nueva en lugar de fallar. Scrapy gestiona los códigos de reintento, y el middleware gestiona los reintentos de proxy por página:

# settings.py
RETRY_ENABLED = True
RETRY_TIMES = 5
RETRY_HTTP_CODES = [403, 407, 429, 500, 502, 503, 504]
ROTATING_PROXY_PAGE_RETRY_TIMES = 5

Añade throttling para no agotar el pool. DOWNLOAD_DELAY espacia las solicitudes, y AUTOTHROTTLE adapta el retraso a la latencia del servidor:

# settings.py
DOWNLOAD_DELAY = 1.0
CONCURRENT_REQUESTS = 16
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1.0
AUTOTHROTTLE_MAX_DELAY = 10.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0

Si las solicitudes devuelven un HTTP 407, el proxy rechazó tus credenciales en lugar de que el sitio objetivo te bloqueara. Comprueba que el usuario y la contraseña están incrustados en la URL del proxy exactamente como se emitieron y codificados en URL si contienen caracteres especiales. El diagnóstico completo está en la guía de DataImpulse sobre el error HTTP 407. Los sitios que solo revelan contenido tras ejecutar JavaScript necesitan también una capa headless, cubierta en cómo hacer scraping de páginas web dinámicas.

¿Qué configuración de rotating proxy encaja con tu proyecto de Scrapy?

Usa un gateway rotativo para la mayoría de los rastreos, una lista estática de proxies cuando necesites controlar IP individuales, y middleware personalizado solo cuando tus reglas de rotación sean inusuales. La decisión se reduce a cuánto control necesitas frente a cuánta infraestructura quieres mantener.

La matriz de decisión de abajo lo deja concreto:

  • Usa el gateway rotativo cuando quieras variedad de IP por solicitud con un solo endpoint, cuando el objetivo imponga límites de tasa por IP y cuando prefieras no gestionar ningún archivo de proxies.
  • Usa una lista estática de proxies cuando necesites sesiones reproducibles, quieras fijar regiones concretas por spider o debas auditar exactamente qué endpoints se usaron.
  • Evita el middleware personalizado cuando scrapy-rotating-proxies ya cubra tus necesidades, ya que un middleware a medida añade mantenimiento y sus propios errores de detección de bloqueos.
  • Evita un gateway rotativo cuando un flujo necesite mantener la misma IP a lo largo de un login de varios pasos, donde una sesión sticky es la herramienta correcta en su lugar.

Así se comparan los tres enfoques:

Enfoque Control de rotación Esfuerzo de configuración Mejor uso
Gateway rotativo (un solo endpoint) El proveedor rota por solicitud El menor, una línea en settings Rastreos grandes, límites de tasa por IP
Archivo de lista de proxies El middleware cicla tus endpoints Medio, mantener un archivo de proxies Fijación de regiones, pools auditables
Middleware personalizado Total, tú escribes la lógica El mayor, código más pruebas Reglas de rotación no estándar

DataImpulse sirve la rotación desde su gateway y también admite sesiones sticky cuando necesitas continuidad, por lo que muchos equipos empiezan con el gateway y reservan los archivos de lista para los pocos spiders que deben fijar una región. Si el coste y la velocidad importan más que la confianza residencial, los proxies de datacenter y los proxies móviles son alternativas en la misma cuenta.

¿Cuáles son las limitaciones y los riesgos de los rotating proxies en Scrapy?

Los rotating proxies reducen los bloqueos por IP, pero no hacen invisible a un scraper y no pueden arreglar un spider mal diseñado. La rotación es una capa, no una garantía.

Ten presentes estos límites:

  • La rotación no vence al fingerprinting. Los sitios también perfilan cabeceras, firmas TLS y comportamiento, así que una IP nueva con un user agent de Scrapy por defecto todavía puede ser marcada.
  • Los captchas siguen apareciendo. Una IP rotativa reduce con qué frecuencia se disparan, pero no los resuelve; aún necesitas una estrategia de captcha o un rastreo más lento.
  • Un desajuste geográfico genera ruido. Si segmentas un país pero solicitas páginas localizadas esperando otra región, las respuestas pueden parecer erróneas aunque la rotación funcione.
  • La concurrencia agresiva sale mal. Demasiadas solicitudes en paralelo agotan el pool y elevan las tasas de bloqueo, por lo que AUTOTHROTTLE importa.
  • Se aplican límites legales y de términos. La rotación es una herramienta de fiabilidad, no un permiso; respeta las directivas de robots, los límites de tasa y la legislación aplicable.

Sobre el alcance, sé claro sobre qué es DataImpulse: una red de proxies ética y con consentimiento, con más de 90M de IP en 195 países, de pago por uso desde 1 dólar por GB y con una tasa de éxito del 99.51 por ciento. No es una API de scraping gestionada que devuelva datos parseados, no vende proxies ISP estáticos y no es un proxy web gratuito. Scrapy sigue haciendo el rastreo; los proxies solo cambian desde dónde salen las solicitudes.

Detección de bloqueos de cuatro señales en el middleware rotativo

Preguntas frecuentes

¿Cómo se usan los rotating proxies en Scrapy?

Instala scrapy-rotating-proxies, añade tus endpoints a ROTATING_PROXY_LIST o ROTATING_PROXY_LIST_PATH en settings.py y habilita los downloader middlewares RotatingProxyMiddleware y BanDetectionMiddleware. Cada solicitud sale entonces desde una IP rotada.

¿Cuál es la diferencia entre un gateway rotativo y una lista de proxies?

Un gateway rotativo es un solo endpoint que cambia la IP de salida del lado del proveedor por solicitud, así que configuras una única línea. Una lista de proxies te da muchos endpoints que el middleware cicla, lo cual es mejor cuando necesitas fijar regiones o auditar IP concretas.

¿Por qué obtengo un error HTTP 407 con rotating proxies en Scrapy?

Un HTTP 407 significa que el proxy rechazó tu autenticación, no que el sitio objetivo te bloqueara. Confirma que el usuario y la contraseña están incrustados en la URL del proxy y codificados en URL si contienen caracteres especiales.

¿Cómo puedo confirmar que mis proxies de Scrapy realmente rotan?

Envía varias solicitudes a un endpoint que devuelve la IP como httpbin.org/ip y registra el campo origin. Si la IP reportada cambia entre respuestas, la rotación está activa; si permanece igual, comprueba que los middlewares están habilitados y que la caché HTTP está desactivada.

¿Los rotating proxies detienen todos los bloqueos de scraping?

No. La rotación reduce los límites de tasa y los bloqueos por IP, pero los sitios también usan fingerprinting, captchas y comprobaciones de comportamiento. Combina la rotación con retrasos sensatos, cabeceras realistas y AUTOTHROTTLE para rastreos fiables.

¿Cuándo no es DataImpulse la opción adecuada?

Si necesitas proxies ISP estáticos, una API de scraping totalmente gestionada o acceso a sitios de banca y gobierno, DataImpulse no es la herramienta adecuada. Se centra en rotating proxies residenciales, móviles y de datacenter para recopilar datos públicos y acceder a contenido.

Empieza a rotar proxies en Scrapy

Apunta scrapy-rotating-proxies a un gateway rotativo de DataImpulse y deja que cada solicitud salga desde una IP residencial nueva. Puedes crear una cuenta de pago por uso desde 1 dólar por GB e insertar la línea del gateway directamente en tu settings.py.


Share article: