Casi todos los frameworks de scraping permiten configurar un proxy. Muchos menos gestionan los proxies por ti: rotándolos, retirando los bloqueados y manteniendo una sesión en una IP. Si usas proxies residenciales, saber qué parte gestiona el framework y qué parte gestiona la puerta de enlace ahorra mucho código de conexión.
Esta guía compara seis herramientas comunes en tres preguntas: cómo se configura el proxy, si la herramienta rota los proxies por sí misma y si vincula una sesión a un único proxy. Después muestra la pequeña cantidad de código que necesita cada una detrás de una puerta de enlace rotatoria.
La respuesta corta
| Herramienta | Lenguaje | Cómo se configura el proxy | Rota por sí sola | Vincula una sesión a un proxy |
|---|---|---|---|---|
| Crawlee | Node.js | ProxyConfiguration | Sí: round robin, función personalizada, niveles | Sí, mediante su pool de sesiones |
| Scrapy | Python | request.meta["proxy"] o variables de entorno | No, necesita tu propio middleware | No |
| Colly | Go | SetProxy o SetProxyFunc | Sí: conmutador round-robin | No |
| Playwright | Node.js, Python, Java, .NET | Al iniciar o por contexto de navegador | No | Por contexto |
| Puppeteer | Node.js | Flag de lanzamiento o por contexto de navegador | No | Por contexto |
| Selenium | Muchos | Opción a nivel de navegador | No | No |
Crawlee es la única que trata los proxies como algo que gestionar en lugar de un simple ajuste. Las herramientas de navegador ofrecen aislamiento por contexto, que es la base de las sesiones, pero la lógica de rotación es cosa tuya.
Crawlee: proxies como un recurso gestionado
El ProxyConfiguration de Crawlee toma una lista de URLs de proxy y rota entre ellas “de forma round-robin”. En lugar de una lista, puedes pasar una función que elija el proxy para cada solicitud. Un tercer modo, los proxies por niveles, empieza con el nivel más barato (a menudo sin proxy en absoluto), sube de nivel cuando un sitio bloquea el crawler y vuelve a bajar cuando el nivel inferior vuelve a funcionar.
La parte que más importa son las sesiones. Cuando el crawler se ejecuta con su pool de sesiones, cada sesión mantiene el mismo proxy: en palabras de la documentación, las llamadas posteriores “con el mismo sessionId siempre devolverán la misma proxyUrl”. Cuando Crawlee decide que una sesión está bloqueada, la retira y la siguiente sesión recibe un proxy distinto. Las cookies siguen a la sesión, de modo que la IP y las cookies se mantienen juntas.
Scrapy: un proxy por solicitud, la rotación es cosa tuya
El HttpProxyMiddleware de Scrapy lee el proxy de request.meta["proxy"], y recurre a las variables de entorno http_proxy y https_proxy si no lo encuentra. Las credenciales pueden ir en la URL, como en http://username:password@host:port. Eso es todo lo que hace. Elegir un proxy distinto por solicitud, detectar bloqueos y dejar descansar los proxies caídos queda en tus manos o en las de una extensión como scrapy-rotating-proxies, que lee una lista de proxies y trata las respuestas que no son 200 o vacías como bloqueos por defecto.
Nuestra guía de integración de Scrapy cubre la configuración básica, y el artículo sobre rotación de proxies residenciales en Scrapy profundiza más en el middleware.
Colly: un conmutador round-robin sencillo
Colly, el framework de Go, tiene SetProxy para un único proxy y SetProxyFunc para una función que elige uno por solicitud. Su paquete proxy incluye RoundRobinProxySwitcher, que “rota las ProxyURLs en cada solicitud” y acepta URLs http, https y socks5. No existe un concepto de sesión: si dos solicitudes deben compartir una IP, lo decides en tu propia función.
Playwright y Puppeteer: aislamiento por contexto
Las herramientas de automatización de navegador no rotan nada, pero permiten que cada contexto de navegador use su propio proxy, que es la forma de ejecutar muchas sesiones separadas en un mismo navegador.
- Playwright toma una opción
proxyconserver,usernameypassword, ya sea al iniciar para todo el navegador o ennewContext()para un contexto concreto. Consulta nuestra guía de integración de Playwright para la configuración completa. - Puppeteer configura un proxy con el flag de lanzamiento
--proxy-server, o por contexto concreateBrowserContext({ proxyServer }). Ninguno de los dos admite credenciales: respondes al desafío de inicio de sesión del proxy conpage.authenticate().
Da a cada contexto su propia sesión y obtendrás una IP y un almacén de cookies por contexto, que es lo que necesita un flujo con inicio de sesión.
Selenium: a nivel de navegador, e incómodo con las contraseñas
Selenium configura el proxy mediante las opciones del navegador, por lo que se aplica a todo el navegador. Con Chrome, la vía habitual es el switch --proxy-server, que no tiene lugar para un nombre de usuario y una contraseña. Las soluciones habituales son una pequeña extensión de navegador que responde al desafío de inicio de sesión, o un proxy de reenvío local sin contraseña que pasa el tráfico a tu proveedor con credenciales. Selenium Wire, antes la solución popular, fue archivado en enero de 2024 y ya no recibe mantenimiento.
Qué cambia una puerta de enlace rotatoria
La rotación a nivel de framework se diseñó para listas de proxies: un centenar de pares IP:puerto que ciclas, pruebas y retiras. Una puerta de enlace residencial rotatoria funciona de otra forma. Te conectas a un único host y puerto, y la puerta de enlace elige la IP de salida. Eso saca la mayor parte del trabajo de tu código:
- La rotación ocurre en la puerta de enlace, así que basta con una única URL de proxy. Una lista round-robin de una sola entrada es solo un ajuste.
- Las sesiones se solicitan en el nombre de usuario. Con Shifter añades
sid-<id>para mantener una IP de salida yttl-<seconds>para indicar cuánto tiempo mantenerla, tal como se explica en sticky vs rotating proxies. - La ubicación también forma parte del nombre de usuario, de modo que un crawler puede apuntar a un país o ciudad por solicitud sin una segunda lista de proxies.
Así, la tarea del framework se reduce a una sola cosa: mapear su propia idea de sesión al ID de sesión en el nombre de usuario del proxy.
Configurándolo
Crawlee. Pasa una función que construya el nombre de usuario a partir del ID de sesión de Crawlee. Los IDs de sesión pueden contener caracteres como guiones bajos, así que conserva solo letras y dígitos:
import { CheerioCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
newUrlFunction: (sessionId) => {
const sid = sessionId
? `-sid-${String(sessionId).replace(/[^a-zA-Z0-9]/g, '')}-ttl-600`
: '';
return `http://customer-USERNAME${sid}:PASSWORD@p.shifter.io:443`;
},
});
const crawler = new CheerioCrawler({
proxyConfiguration,
useSessionPool: true,
persistCookiesPerSession: true,
async requestHandler({ request, $ }) {
console.log(request.url, $('title').text());
},
});
await crawler.run(['https://example.com/']);
Cuando Crawlee retira una sesión bloqueada, el siguiente ID de sesión da una nueva IP fija por sí solo.
Scrapy. Un pequeño middleware de descarga configura el proxy antes de que se ejecute el propio middleware de proxy de Scrapy. Las solicitudes que llevan un valor session en meta comparten una IP; el resto rotan:
# middlewares.py
class GatewayProxyMiddleware:
def process_request(self, request, spider):
sid = request.meta.get("session")
user = "customer-USERNAME"
if sid:
user += f"-sid-{sid}-ttl-600"
request.meta["proxy"] = f"http://{user}:PASSWORD@p.shifter.io:443"
# settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.GatewayProxyMiddleware": 350,
}
Playwright. Un contexto por sesión:
const context = await browser.newContext({
proxy: {
server: 'http://p.shifter.io:443',
username: 'customer-USERNAME-sid-cart1-ttl-600',
password: 'PASSWORD',
},
});
Cuál elegir
Elige el framework en función del sitio y del equipo, no de sus funciones de proxy. Crawlee es la opción más sólida cuando quieres que el bloqueo, las sesiones y los niveles de proxy se gestionen por ti en Node.js. Scrapy sigue siendo la forma más rápida de rastrear grandes cantidades de páginas HTML sencillas en Python, y su carencia de proxy se resuelve con un middleware de diez líneas. Playwright o Puppeteer son las herramientas adecuadas cuando las páginas necesitan un navegador real, y los contextos ofrecen sesiones limpias. Selenium también funciona, con más esfuerzo en torno a las credenciales.
Detrás de una puerta de enlace rotatoria, las seis se reducen al mismo patrón: una única URL de proxy, y un ID de sesión en el nombre de usuario allí donde las solicitudes deban compartir una IP. Para más información sobre cómo llevar esto a un crawler en producción, consulta nuestro caso de uso de web scraping.
Fuentes y referencias
- Crawlee, guía de gestión de proxies: crawlee.dev
- Scrapy, referencia de middleware de descarga (HttpProxyMiddleware): docs.scrapy.org
- scrapy-rotating-proxies: github.com
- Colly, paquete de proxy: pkg.go.dev
- Playwright, red y proxy HTTP: playwright.dev
- Puppeteer, BrowserContextOptions: pptr.dev
- Repositorio de Selenium Wire (archivado el 3 de enero de 2024): github.com