Ir al contenido
GProxy
Registro
Гайды 7 min de lectura 97 vistas

Configuración de Proxy en Scrapy

Configura Scrapy con middleware de proxy para un web scraping eficiente. Rota los proxies para evitar bloqueos de IP y mantener el anonim

Python Парсинг
Configuración de Proxy en Scrapy

Un servidor proxy HTTP actúa como intermediario entre su script de web scraping y el sitio web de destino. En lugar de que su araña Scrapy se conecte directamente al destino, se conecta al servidor proxy, que luego reenvía la solicitud al destino. Esto le permite enmascarar su dirección IP, evitar restricciones geográficas y evitar ser bloqueado por sitios web que emplean medidas anti-scraping. Este artículo proporciona una guía práctica para configurar y rotar proxies utilizando el middleware de Scrapy.

Configuración de Proxies en Scrapy con Middleware

El sistema de middleware de Scrapy proporciona una forma flexible de manejar solicitudes y respuestas. Podemos aprovechar este sistema para implementar soporte de proxy. El proceso implica crear un middleware personalizado que intercepte las solicitudes y les asigne un servidor proxy.

Creación de un Middleware de Proxy Personalizado

Primero, cree un nuevo archivo Python (por ejemplo, proxy_middleware.py) en su proyecto Scrapy. Este archivo contendrá el código para su middleware de proxy personalizado.

import random

class ProxyMiddleware:
    def __init__(self, proxies):
        self.proxies = proxies

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('PROXIES'))

    def process_request(self, request, spider):
        proxy = random.choice(self.proxies)
        request.meta['proxy'] = proxy
        print(f"Using proxy: {proxy}")

    def process_response(self, request, response, spider):
         # Optional: Handle response codes to retry with a different proxy
        if response.status in [403, 429]:
            print(f"Proxy {request.meta['proxy']} blocked, retrying with another proxy.")
            return self._retry_request(request, spider)
        return response

    def _retry_request(self, request, spider):
        proxy = random.choice(self.proxies)
        request.meta['proxy'] = proxy
        new_request = request.copy()
        return new_request

Explicación:

  • __init__(self, proxies): El constructor toma una lista de proxies como entrada.
  • from_crawler(cls, crawler): Este método de clase es utilizado por Scrapy para crear una instancia del middleware. Recupera la lista de proxies de la configuración de Scrapy.
  • process_request(self, request, spider): Este método se llama antes de que Scrapy envíe una solicitud. Selecciona aleatoriamente un proxy de la lista y lo asigna al atributo meta['proxy'] de la solicitud. Esto le dice a Scrapy que use el proxy especificado para esta solicitud.
  • process_response(self, request, response, spider): Este método le permite manejar la respuesta recibida del servidor. Aquí, verifica códigos de estado como 403 (Prohibido) o 429 (Demasiadas solicitudes), que a menudo indican que el proxy está bloqueado. Si se encuentra un código de bloqueo, reintenta la solicitud con un proxy diferente.
  • _retry_request(self, request, spider): Este método crea una nueva solicitud con un proxy diferente asignado.

Configuración de los Ajustes de Scrapy

A continuación, debe configurar sus ajustes de Scrapy para habilitar el middleware y proporcionar una lista de proxies. Abra su archivo settings.py y agregue lo siguiente:

# settings.py

# Enable the ProxyMiddleware
DOWNLOADER_MIDDLEWARES = {
    'your_project_name.proxy_middleware.ProxyMiddleware': 350,  # Adjust priority as needed
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, # Disable the default HttpProxyMiddleware
}

# List of proxies
PROXIES = [
    'http://user1:pass1@proxy1.example.com:8080',
    'http://user2:pass2@proxy2.example.com:8080',
    'http://user3:pass3@proxy3.example.com:8080',
    'https://user4:pass4@proxy4.example.com:8080',
]

# Retry many times since proxies often fail
RETRY_TIMES = 10

# Retry on most error codes since proxies fail a lot
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408]

# Disable default user agent middleware and use a custom one
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

Explicación:

  • DOWNLOADER_MIDDLEWARES: Este diccionario habilita y configura los middlewares de descarga. La clave es la ruta a su clase de middleware, y el valor es la prioridad del middleware. Los números más bajos indican una prioridad más alta (el middleware se ejecuta antes). El HttpProxyMiddleware predeterminado está deshabilitado para evitar conflictos con el middleware personalizado.
  • PROXIES: Esta lista contiene los servidores proxy que desea utilizar. El formato es protocolo://usuario:contraseña@host:puerto. Se pueden usar proxies HTTP y HTTPS. Si no se requieren nombre de usuario y contraseña, el formato es simplemente protocolo://host:puerto.
  • RETRY_TIMES y RETRY_HTTP_CODES: Estos ajustes configuran el middleware de reintento de Scrapy. Dado que los proxies pueden ser poco confiables, es una buena práctica aumentar el número de reintentos e incluir códigos de error HTTP comunes que podrían indicar un problema de proxy.
  • DOWNLOADER_MIDDLEWARES.update(...): Esta sección deshabilita el middleware de User Agent predeterminado y habilita scrapy_user_agents para rotar los User Agents. Esto ayuda a evitar que su scraper sea fácilmente identificado. Deberá instalar scrapy_user_agents usando pip install scrapy-user-agents.

Ejecución de la Araña

Ahora puede ejecutar su araña Scrapy como de costumbre. El middleware asignará automáticamente un proxy a cada solicitud.

scrapy crawl your_spider_name

Estrategias de Rotación de Proxies

La rotación de proxies es crucial para evitar que su scraper sea bloqueado. Aquí hay algunas estrategias comunes:

  • Selección Aleatoria: Como se implementa en el ejemplo anterior, seleccionar aleatoriamente un proxy de la lista para cada solicitud. Este es el enfoque más simple, pero puede no ser el más efectivo.
  • Rotación Secuencial: Recorrer la lista de proxies de manera secuencial. Esto puede ser útil si desea asegurarse de que cada proxy se use un número igual de veces.
  • Rotación Inteligente: Implementar lógica para rastrear el rendimiento de cada proxy y priorizar los proxies que funcionan bien. Esto puede implicar monitorear los tiempos de respuesta, las tasas de error y otras métricas.
  • Uso de una API de Proxy: Utilizar una API de servicio de proxy que maneje automáticamente la rotación y administración de proxies. Estos servicios a menudo proporcionan características como la geolocalización y la gestión de la reputación de la dirección IP.

Rotación Secuencial de Proxies

Aquí hay un ejemplo de cómo implementar la rotación secuencial de proxies en su middleware:

import itertools

class SequentialProxyMiddleware:
    def __init__(self, proxies):
        self.proxies = itertools.cycle(proxies) # Use cycle to rotate proxies

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('PROXIES'))

    def process_request(self, request, spider):
        proxy = next(self.proxies) # Get the next proxy from the cycle
        request.meta['proxy'] = proxy
        print(f"Using proxy: {proxy}")

    def process_response(self, request, response, spider):
        if response.status in [403, 429]:
            print(f"Proxy {request.meta['proxy']} blocked, rotating to the next proxy.")
            return self._retry_request(request, spider)
        return response

    def _retry_request(self, request, spider):
        proxy = next(self.proxies)
        request.meta['proxy'] = proxy
        new_request = request.copy()
        return new_request

Cambio Clave:

  • itertools.cycle(proxies): Esto crea un iterador que recorre indefinidamente la lista de proxies. La función next() se utiliza para obtener el siguiente proxy en la secuencia.

Recuerde actualizar su configuración DOWNLOADER_MIDDLEWARES para que apunte a SequentialProxyMiddleware.

Integración de API de Proxy

La integración con una API de proxy generalmente implica realizar solicitudes a la API para recuperar un proxy y manejar la autenticación y las respuestas de error de la API. Los detalles específicos dependerán de la API que elija. Muchos proveedores de proxy ofrecen SDK de Python para simplificar este proceso.

Tipos de Proxy

Aquí hay una comparación de diferentes tipos de proxy:

Característica Proxy HTTP Proxy HTTPS Proxy SOCKS
Protocolo HTTP HTTPS SOCKS (varias versiones)
Cifrado Sin cifrado entre cliente y proxy Cifrado entre cliente y proxy El cifrado depende de la versión de SOCKS
Casos de Uso Navegación web, scraping de sitios HTTP Navegación web, scraping de sitios HTTPS Propósito general, soporta varios protocolos
Anonimato Puede ser menos anónimo Puede ser más anónimo Puede ser altamente anónimo
Configuración Típicamente configurado en navegadores web Típicamente configurado en navegadores web Requiere cliente SOCKS o soporte de biblioteca
URL de Ejemplo http://host:port https://host:port socks5://host:port o socks4://host:port
Autenticación Autenticación básica (usuario/contraseña) Autenticación básica (usuario/contraseña) Autenticación de usuario/contraseña soportada

Problemas Comunes y Solución de Problemas

  • Proxies que no funcionan: Verifique que el servidor proxy esté en línea y accesible. Revise las credenciales de autenticación del proxy (nombre de usuario y contraseña). Asegúrese de que el formato del proxy en settings.py sea correcto.
  • Proxies bloqueados: Implemente la rotación de proxies y considere usar un servicio de proxy con un gran grupo de direcciones IP. Monitoree los códigos de respuesta (403, 429) y reintente automáticamente las solicitudes con diferentes proxies.
  • Rendimiento lento: Elija proxies que estén geográficamente cerca del servidor de destino. Pruebe diferentes proveedores de proxy para encontrar uno con un rendimiento confiable.
  • Errores HTTPS: Asegúrese de que su proxy admita conexiones HTTPS. Algunos proxies HTTP solo admiten tráfico HTTP.
  • Fugas de DNS: Use un proxy SOCKS o configure su sistema para usar el servidor DNS del proxy para evitar fugas de DNS.

Conclusión

Configurar y rotar proxies en Scrapy es esencial para construir scrapers web robustos y confiables. Al usar middleware personalizado, implementar estrategias de rotación efectivas y comprender los diferentes tipos de proxies, puede reducir significativamente el riesgo de ser bloqueado y mejorar el rendimiento de sus proyectos de scraping. Recuerde monitorear continuamente sus proxies y adaptar su estrategia según sea necesario para mantener una eficiencia de scraping óptima.

Recuerde probar sus proxies regularmente y monitorear su rendimiento para asegurarse de que su scraper siga funcionando de manera efectiva. Considere usar un servicio de administración de proxies para funciones más avanzadas y una gestión más sencilla.

Actualizado: 26.01.2026
Volver a la categoría

Pruebe nuestros proxies

20,000+ proxies en 100+ países del mundo

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.