Integraciones · Intermedio

Proxies rotativos y sesiones persistentes en Scrapy con un middleware de descarga

HttpProxyMiddleware de Scrapy admite proxies HTTP autenticados mediante request.meta["proxy"]. Configura el gateway realmente entregado, conserva el ajuste en las solicitudes siguientes y verifica el modo de sesión antes de aumentar la concurrencia.

2 minutos de lectura 4 secciones Revisado Equipo editorial Proxy Cyber

La versión más simple#

Identifica la causa antes de reintentar. Un 403 puede responder a una regla de acceso que no se resuelve cambiando de IP. Ante un 429, respeta Retry-After y reduce la frecuencia; aplica esperas progresivas y límites a fallos temporales de red o servidor. Evita duplicar operaciones que modifican datos.

araña.py
import scrapy

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"

class PricesSpider(scrapy.Spider):
    name = "prices"
    start_urls = ["https://example.com/catalog"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, meta={"proxy": PROXY})

    def parse(self, response):
        for href in response.css("a.product::attr(href)").getall():
            yield response.follow(href, callback=self.parse_product, meta={"proxy": PROXY})

    def parse_product(self, response):
        yield {"url": response.url, "price": response.css(".price::text").get()}

Un middleware para sesiones fijas por elemento#

middlewares.py
import hashlib

class Proxy CyberMiddleware:
    GATEWAY = "res.proxy-cyber.com:9000"

    def __init__(self, user, password, country):
        self.user, self.password, self.country = user, password, country

    @classmethod
    def from_crawler(cls, crawler):
        s = crawler.settings
        return cls(s.get("KEY_PROXY_USER"), s.get("KEY_PROXY_PASS"), s.get("KEY_PROXY_COUNTRY", "us"))

    def process_request(self, request, spider):
        # Sticky when the request carries a session key (e.g. one per product flow), rotating otherwise
        key = request.meta.get("session_key")
        user = f"{self.user}-cc-{self.country}"
        if key:
            sid = hashlib.sha1(key.encode()).hexdigest()[:12]
            user += f"-sid-{sid}-ttl-10m"
        request.meta["proxy"] = f"http://{user}:{self.password}@{self.GATEWAY}"
configuración.py
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.Proxy CyberMiddleware": 350,   # before HttpProxyMiddleware (750)
}
KEY_PROXY_USER = "USER"
KEY_PROXY_PASS = "PASS"
KEY_PROXY_COUNTRY = "de"

CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 8
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
DOWNLOAD_TIMEOUT = 45
RETRY_ENABLED = True
RETRY_TIMES = 2
RETRY_HTTP_CODES = [408, 429, 500, 502, 503, 504, 522, 524]
COMPRESSION_ENABLED = True

Reutilizar conexiones y asignar IP son mecanismos distintos. La sesión del cliente conserva sockets; el gateway entregado determina la rotación y las sesiones persistentes. Usa los parámetros facilitados con tu servicio y comprueba la salida con varias solicitudes. Cerrar un socket o enviar Connection: close no garantiza otra IP.

Manteniendo la factura baja#

  • Scrapy no carga imágenes ni scripts; Solo HTML y JSON, por lo que una página cuesta su tamaño HTML.
  • Habilite la compresión (predeterminada) y evite Splash o representación del navegador a menos que los datos lo necesiten.
  • caché con HTTPCACHE_ENABLED = True durante el desarrollo, por lo que no paga para volver a buscar las mismas páginas mientras depura los selectores.

Cortesía por dominio#

Una pool es una forma de tener muchos visitantes educados, no uno descortés. CONCURRENT_REQUESTS_PER_DOMAIN y AutoThrottle mantienen cada objetivo a una velocidad humanamente plausible por salida; el política de uso aceptable prohíbe cualquier cosa que parezca un ataque.

Preguntas que hace la gente#

¿Necesito proxies rotativos?

No con una puerta de enlace: la rotación se produce en el lado del Proxy Cyber para cada nueva conexión. Ese paquete gestiona listas de servidores proxy estáticos; con res.proxy-cyber.com hay un proxy para configurar.

¿Cómo uso un país diferente por solicitud?

Configure request.meta["country"] en la araña y léalo en el middleware para crear el parámetro -cc-; el ejemplo utiliza una única configuración por motivos de brevedad.

tu cuenta

Gestiona tus proxies en una sola cuenta

Compare redes, realice pedidos y siga su saldo y solicitudes de soporte desde un solo panel. Nuestro equipo revisa los pagos y proporciona detalles de conexión después de la entrega.

Crear cuenta