
1. middlewares.py
import itertools, random
class RotatingProxyMiddleware:
def __init__(self):
with open("proxies.txt") as handle:
self.proxies = [line.strip() for line in handle if line.strip()]
random.shuffle(self.proxies)
self.pool = itertools.cycle(self.proxies)
def process_request(self, request, spider):
request.meta["proxy"] = f"http://{next(self.pool)}"2. settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.RotatingProxyMiddleware": 350,
"scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
}
RETRY_TIMES = 5
DOWNLOAD_TIMEOUT = 10Notas que ahorran tiempo
El orden importa: el middleware de proxy debe ejecutarse antes que el de reintentos, así cada reintento elige un proxy nuevo en lugar de repetir el que falló. Mantén DOWNLOAD_TIMEOUT bajo —los proxies gratuitos son la parte más lenta del pipeline— y sube RETRY_TIMES para absorber la tasa de fallo.
Guías relacionadas
Límites de la instantánea pública
Los proxies públicos gratuitos son compartidos y los operan terceros desconocidos. Nunca envíes contraseñas, tokens ni datos personales a través de ellos. Cumple las políticas de uso aceptable de GitHub: nada de spam, ataques, elusión de controles de acceso ni scraping contrario a las políticas del sitio.
Los proxies públicos gratuitos son compartidos y los operan terceros desconocidos. Nunca envíes contraseñas, tokens ni datos personales a través de ellos. Cumple las políticas de uso aceptable de GitHub: nada de spam, ataques, elusión de controles de acceso ni scraping contrario a las políticas del sitio.