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

Proxy en Scrapy-Splash para el renderizado de páginas JavaScript

Descubre cómo configurar y usar GProxy en tus proyectos de Scrapy-Splash para renderizar páginas con mucho JavaScript y extraer contenido web dinámico de forma fiable.

Python Парсинг
Proxy en Scrapy-Splash para el renderizado de páginas JavaScript

La integración de proxies en Scrapy-Splash permite que las solicitudes originadas desde el servicio de renderizado de Splash se enruten a través de un servidor intermediario, posibilitando la rotación de IP, el desbloqueo geográfico y el anonimato para páginas web renderizadas con JavaScript.

Entendiendo la Integración de Proxies con Scrapy-Splash

Scrapy-Splash combina el framework de scraping de Scrapy con las capacidades de renderizado de navegador sin cabeza de Splash. Cuando se configura un proxy dentro de esta configuración, significa que las solicitudes web realizadas por la instancia del navegador dentro de Splash se dirigen a través del servidor proxy especificado. Esto se aplica a la carga inicial de la página, las solicitudes AJAX subsiguientes y cualquier otra actividad de red iniciada por el JavaScript en la página.

¿Por qué usar Proxies con Scrapy-Splash?

Los proxies cumplen varias funciones críticas al hacer scraping de contenido dinámico con Scrapy-Splash:
* Evitar límites de tasa y bloqueos basados en IP: Los sitios web a menudo restringen el acceso basándose en la dirección IP de origen. Los proxies permiten distribuir las solicitudes a través de múltiples IPs, mitigando tales restricciones.
* Acceder a contenido geo-restringido: Los proxies ubicados en regiones geográficas específicas pueden acceder a contenido no disponible en la ubicación física del scraper.
* Mantener el anonimato: Los proxies ocultan la verdadera dirección IP del scraper, mejorando la seguridad operativa.
* Distribuir la carga: Para operaciones a gran escala, los proxies pueden ayudar a distribuir la carga de red y reducir la posibilidad de que una sola IP se sature o sea marcada.

Cómo Scrapy-Splash maneja las solicitudes de proxy

  1. Scrapy envía una SplashRequest al demonio de Splash.
  2. Splash recibe la solicitud y, si hay un argumento proxy presente, configura su instancia de navegador interna (por ejemplo, Chromium) para enrutar todo el tráfico de red a través de ese proxy.
  3. La instancia del navegador navega a la URL de destino, renderiza el JavaScript y realiza las llamadas de red necesarias (por ejemplo, XHRs, obtención de activos) a través del proxy configurado.
  4. Splash devuelve el HTML completamente renderizado, la captura de pantalla u otros datos solicitados a Scrapy.

Configurando Proxies en Scrapy-Splash

El método principal para la integración de proxies es a través del argumento proxy en SplashRequest.

Configuración básica de proxy

Para usar un proxy para una solicitud específica, pase el argumento proxy dentro del diccionario args de SplashRequest. El formato de la URL del proxy es [protocolo://][usuario:contraseña@]host:puerto.

import scrapy
from scrapy_splash import SplashRequest

class BasicProxySpider(scrapy.Spider):
    name = 'basic_proxy_spider'
    start_urls = ['http://quotes.toscrape.com/js/']

    def start_requests(self):
        # Ejemplo usando un proxy HTTP básico
        # Reemplace con su IP y puerto de proxy reales
        yield SplashRequest(
            url=self.start_urls[0],
            callback=self.parse,
            args={
                'wait': 0.5,
                'proxy': 'http://your_proxy_ip:port'
            }
        )

    def parse(self, response):
        title = response.css('title::text').get()
        yield {
            'title': title,
            'url': response.url,
            'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
        }

Proxies autenticados

Para proxies que requieren autenticación, incruste el nombre de usuario y la contraseña directamente en la cadena de URL del proxy.

import scrapy
from scrapy_splash import SplashRequest

class AuthenticatedProxySpider(scrapy.Spider):
    name = 'auth_proxy_spider'
    start_urls = ['http://quotes.toscrape.com/js/']

    def start_requests(self):
        # Reemplace con sus detalles de proxy reales
        proxy_user = 'your_username'
        proxy_pass = 'your_password'
        proxy_host = 'your_proxy_ip'
        proxy_port = 'port'

        authenticated_proxy_url = f'http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'

        yield SplashRequest(
            url=self.start_urls[0],
            callback=self.parse,
            args={
                'wait': 0.5,
                'proxy': authenticated_proxy_url
            }
        )

    def parse(self, response):
        title = response.css('title::text').get()
        yield {
            'title': title,
            'url': response.url,
            'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
        }

Selección y rotación dinámica de proxies

Para escenarios que requieren diferentes proxies por solicitud o un esquema de rotación, gestione una lista de proxies dentro de su spider y seleccione uno dinámicamente.

import scrapy
from scrapy_splash import SplashRequest
import random

class RotatingProxySpider(scrapy.Spider):
    name = 'rotating_proxy_spider'
    start_urls = ['http://quotes.toscrape.com/js/', 'http://toscrape.com/']

    # Defina una lista de proxies (reemplace con sus proxies reales)
    # Incluya proxies autenticados como 'http://user:pass@host:port'
    proxy_list = [
        'http://proxy1_ip:port1',
        'http://user:pass@proxy2_ip:port2',
        'http://proxy3_ip:port3',
    ]

    def start_requests(self):
        for url in self.start_urls:
            selected_proxy = random.choice(self.proxy_list)
            yield SplashRequest(
                url=url,
                callback=self.parse,
                args={
                    'wait': 0.5,
                    'proxy': selected_proxy
                },
                # También puede pasar meta personalizado para rastrear qué proxy se usó
                meta={'proxy_selected': selected_proxy} 
            )

    def parse(self, response):
        title = response.css('title::text').get()
        yield {
            'title': title,
            'url': response.url,
            'proxy_used': response.request.meta.get('proxy_selected') # Acceder a meta personalizado
        }

Configuración global de proxy (Demonio de Splash)

Splash puede configurarse para usar un proxy predeterminado para todas sus solicitudes salientes. Esto se logra típicamente configurando las variables de entorno HTTP_PROXY y HTTPS_PROXY antes de iniciar el demonio de Splash. Si bien esto proporciona un valor predeterminado global, ofrece menos control que la especificación de proxy por solicitud para tareas de scraping dinámico.

Tipos de Proxy y su Impacto

La elección del tipo de proxy afecta el anonimato, el rendimiento y el riesgo de detección.

Característica Proxies de Centros de Datos Proxies Residenciales
Fuente de IP Centros de datos comerciales ISPs residenciales reales
Anonimato Moderado (las IPs a menudo pertenecen a subredes conocidas) Alto (las IPs aparecen como usuarios de internet domésticos regulares)
Velocidad Generalmente más rápidos debido a la infraestructura dedicada Pueden ser más lentos debido al enrutamiento a través de redes residenciales
Costo Menor por IP Mayor por IP o ancho de banda
Detección Más propensos a la detección y bloqueo por anti-bots sofisticados Menos propensos a la detección; más difíciles de bloquear
Casos de Uso Scraping general, tareas de alto volumen en sitios menos protegidos Scraping altamente sensible, evitando sistemas anti-bot avanzados

Protocolos de Proxy

  • Proxies HTTP/HTTPS: Manejan el tráfico web estándar. Splash soporta completamente ambos protocolos.
  • Proxies SOCKS: Los proxies SOCKS (SOCKS4, SOCKS5) operan a un nivel inferior, capaces de manejar varios protocolos de red, no solo HTTP/HTTPS. Para usar un proxy SOCKS con Splash, especifique el protocolo en la URL del proxy (por ejemplo, socks5://usuario:contraseña@host:puerto).

Proxies Fijos vs. Rotatorios

  • Proxies Fijos: Mantienen la misma dirección IP durante una duración definida (por ejemplo, unos minutos a horas) o durante la vida útil de una sesión. Útiles para mantener el estado de la sesión en sitios web de destino que requieren direcciones IP consistentes.
  • Proxies Rotatorios: Asignan una nueva dirección IP con cada solicitud o a intervalos regulares y cortos. Ideales para scraping de alto volumen donde es crítico evitar prohibiciones de IP cambiando frecuentemente la IP de origen.

Solución de Problemas y Mejores Prácticas

Verificar la conectividad del proxy

Antes de una implementación a gran escala, pruebe su proxy de forma independiente. Un simple comando curl o un script de Python requests puede confirmar la funcionalidad y accesibilidad del proxy.

curl --proxy http://your_proxy_ip:port http://httpbin.org/ip

Revisar los registros de Splash

Los problemas relacionados con la conectividad o autenticación del proxy dentro de Splash suelen ser registrados por el demonio de Splash. Revise la salida de la consola de Splash o los archivos de registro en busca de errores al depurar.

Manejar los errores del proxy con elegancia

Implemente mecanismos de reintento o lógica de rotación de proxies para manejar solicitudes fallidas. Si un proxy falla constantemente, elimínelo del pool activo o márquelo como no saludable por un período. El middleware de reintento de Scrapy puede adaptarse, pero el manejo de fallas específicas del proxy a menudo requiere una lógica de spider personalizada.

Consideraciones de rendimiento

Los proxies introducen un salto de red adicional, aumentando la latencia.
* Gestión del Pool de Proxies: Implemente un sistema para rastrear la salud, los tiempos de respuesta y el uso del proxy. Priorice los proxies más rápidos y confiables.
* Uso de Recursos: Splash en sí mismo consume muchos recursos. El uso de proxies añade una sobrecarga. Asegúrese de que el demonio de Splash tenga suficiente CPU y RAM para manejar la carga combinada.

Medidas anti-bot específicas del sitio web

Los sistemas anti-bot avanzados detectan patrones más allá de las simples direcciones IP. Incluso con proxies residenciales, los sitios pueden identificar la navegación automatizada. Ajuste los argumentos de Splash como user-agent, viewport, browser_params y use scripts Lua personalizados para interacciones más parecidas a las humanas para contrarrestar estas medidas.

Fuga de IP

Confirme que el proxy enmascara eficazmente la verdadera IP del scraper. Utilice servicios como http://httpbin.org/ip o https://ipleak.net/ dentro de Splash para verificar la dirección IP visible.

# Script Lua para verificar la IP visible dentro de Splash
lua_script = """
function main(splash)
    splash:set_proxy_auto() -- Asegura que el proxy se use si se establece mediante el argumento 'proxy'
    splash:go("http://httpbin.org/ip")
    splash:wait(0.5)
    return splash:html()
end
"""

# Ejemplo de SplashRequest usando el script Lua
yield SplashRequest(
    url="about:blank", # La URL aquí no importa ya que Lua maneja la navegación
    callback=self.parse_ip_check,
    endpoint='execute',
    args={
        'lua_source': lua_script,
        'proxy': 'http://your_proxy_ip:port',
        'timeout': 90 # Aumentar el tiempo de espera para scripts Lua
    }
)

def parse_ip_check(self, response):
    # Analizar la respuesta HTML de httpbin.org/ip para extraer la IP
    ip_address = response.css('pre::text').get() # Ajustar el selector si httpbin cambia
    self.logger.info(f"IP visible desde Splash a través del proxy: {ip_address}")
    # Procesamiento adicional...
Actualizado: 04.03.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.