Guía de Scrapy · 2 min de lectura

Cómo usar proxies con Scrapy

Scrapy enruta cada solicitud a través de un proxy de una de tres maneras: una clave meta por solicitud, una variable de entorno o un middleware de descargador rotativo. Aquí está cada uno, con código funcional para proxies autenticados de s4m.

Tres formas en que Scrapy se comunica con un proxy

Scrapy envía un HttpProxyMiddleware que está habilitado por defecto. Lee el proxy de uno de dos lugares: la clave proxy en el diccionario meta de una solicitud, o las variables de entorno estándar http_proxy / https_proxy. Para un proxy fijo a lo largo de todo el rastreo, la variable de entorno es el camino más rápido; para control y rotación por solicitud, establece request.meta["proxy"] tú mismo, generalmente desde un middleware de descargador personalizado.

La autenticación es la parte que la gente pasa por alto. Scrapy no lee USER:PASS@ de la URL del proxy como lo hace curl; espera un encabezado Proxy-Authorization. El enfoque limpio es construir ese encabezado una vez y adjuntarlo en tu middleware. Los proxies de s4m se autentican con USER:PASS contra proxy.s4m.online, HTTP en el puerto 3128 (la opción natural para el middleware de proxy HTTP de Scrapy). Para SOCKS5, deberías poner un puente local de SOCKS a HTTP al frente del rastreo, pero para la mayoría de los raspados, el punto final HTTP es más simple. Aprende más en la página de proxy, y consulta otras guías de raspado.

Un middleware de proxy rotativo

Coloca esto en middlewares.py, habilítalo en settings.py, y cada solicitud selecciona un proxy de tu grupo con el encabezado de autenticación correcto.

python
# middlewares.py
import base64
import random

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
PROXIES = [f"http://{HOST}:3128"]  # add more endpoints/ports to rotate

class S4mProxyMiddleware:
    def _auth_header(self):
        raw = f"{USER}:{PASS}".encode()
        return b"Basic " + base64.b64encode(raw)

    def process_request(self, request, spider):
        request.meta["proxy"] = random.choice(PROXIES)
        # Scrapy needs the Proxy-Authorization header explicitly:
        request.headers[b"Proxy-Authorization"] = self._auth_header()

# settings.py
DOWNLOADER_MIDDLEWARES = {
    # keep Scrapy's built-in proxy middleware after ours
    "myproject.middlewares.S4mProxyMiddleware": 350,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
CONCURRENT_REQUESTS = 8
DOWNLOAD_DELAY = 0.5
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]

Conéctalo

De un proyecto limpio a un rastreo a través de proxy.

Agregar el middleware

Pega la clase S4mProxyMiddleware en el middlewares.py de tu proyecto y reemplaza USER, PASS y HOST con tus credenciales y endpoint de s4m.

Actívalo en la configuración

Regístrelo en DOWNLOADER_MIDDLEWARES con una prioridad inferior a la de HttpProxyMiddleware de Scrapy (un número más pequeño se ejecuta primero), para que su proxy y encabezado se configuren antes de que se ejecute el middleware incorporado.

Ajusta la cortesía

Establece DOWNLOAD_DELAY y CONCURRENT_REQUESTS para mantenerte por debajo del límite de tasa del objetivo, y habilita RETRY_HTTP_CODES para 429 y 5xx para que los bloqueos transitorios se reintenten automáticamente.

Verifica la IP de salida

Agrega una primera solicitud a un punto final de eco de IP como https://api.ipify.org y registra la respuesta para confirmar que tu rastreo realmente está saliendo a través del proxy.

Rotación, reintentos y honestidad

Para una rotación real, coloca varios puntos finales en PROXIES y deja que process_request elija uno por solicitud; combina eso con el middleware de reintento incorporado de Scrapy para que un 429 o 503 se reintente con una nueva selección. Mantén DOWNLOAD_DELAY distinto de cero y la concurrencia moderada: un rastreador que se retira es mucho más difícil de bloquear que uno que corre.

Dos advertencias honestas. Primero, los proxies s4m son datacenter, no residenciales: excelentes para APIs, pruebas y sitios moderadamente defendidos, pero los sistemas anti-bot agresivos pueden marcar rangos de datacenter. Segundo, la rotación no es una licencia para ignorar las reglas de un sitio: lee robots.txt y sus términos. Cuando necesites una salida consistente para una lista blanca, añade una IP personal dedicada en lugar de rotar. Verifica salidas y puertos con las herramientas, y prototipa contra la lista de proxies gratuitos antes de comprometer tráfico.

FAQ

Preguntas, respondidas

¿Por qué Scrapy no recoge mi USER:PASS de la URL del proxy?

A diferencia de curl, HttpProxyMiddleware de Scrapy no analiza las credenciales de la URL. Debes establecer un encabezado Proxy-Authorization tú mismo: construye un encabezado de autenticación básica a partir de USER:PASS como se muestra en el ejemplo del middleware.

¿Puede Scrapy usar un proxy SOCKS5?

No de forma nativa a través de HttpProxyMiddleware, que está orientado a HTTP. Usa el punto final HTTP en el puerto 3128 para Scrapy, o ejecuta un puente local de SOCKS a HTTP si necesitas específicamente SOCKS5.

¿Cómo rotar proxies por solicitud?

Pon varios puntos de acceso proxy en una lista y elige uno en process_request, configurando request.meta["proxy"] cada vez. Combínalo con el middleware de reintento de Scrapy para que una solicitud bloqueada se reintente con una nueva elección.

¿Son estos proxies residenciales?

No. Los proxies s4m son proxies SOCKS5 y HTTP de centro de datos autenticados, con pago por uso. Son adecuados para la mayoría de scraping, aunque los objetivos muy defendidos pueden marcar rangos de IP de centro de datos.

Escala tus rastreos de Scrapy

Proxies de centro de datos autenticados en proxy.s4m.online, pagados por uso, listos para rotar a través de un middleware de Scrapy. Agrega una IP dedicada cuando un objetivo espera una salida consistente.

Las personas encontraron esta página buscando

Frases de búsqueda reales que esta página responde — los enlaces abren la página que las cubre en profundidad.