Por qué Puppeteer necesita un proxy
Los proxies para Puppeteer permiten que la herramienta se conecte a través de una dirección IP diferente, en lugar de utilizar siempre la IP del equipo en el que se ejecuta. Esto resulta útil para tareas basadas en la ubicación, pruebas, supervisión y otras actividades en las que la fuente de la conexión es importante.
Puppeteer sigue encargándose de la tarea principal. El proxy se encarga de gestionar el origen de la conexión.
Qué ocurre sin uno: bloqueos de IP, límites de frecuencia y restricciones geográficas
Sin un proxy, los sitios web siguen viendo la misma dirección IP. A medida que aumenta la actividad, esa IP puede alcanzar un límite de frecuencia o quedar bloqueada.
La ubicación también puede ser importante. Es posible que una página abierta desde Alemania no muestre el mismo contenido que otra abierta desde EE. UU.
Un proxy para Puppeteer permite conectarse desde diferentes direcciones IP y ubicaciones cuando sea necesario.
Qué tipo de proxy utilizar con Puppeteer
El tipo de proxy adecuado depende de la tarea.
| Tipo de proxy | Extracción de datos | Gestión de cuentas | Pruebas | Supervisión |
|---|
| Residencial | Ideal cuando la ubicación y la fuente de la IP son importantes | Útil cuando las cuentas necesitan IP residenciales | Ideal para pruebas basadas en la ubicación | Útil para comprobar contenidos desde diferentes ubicaciones |
| ISP | Ideal cuando se necesita una IP estable | Útil para sesiones más largas con una misma IP | Ideal para pruebas con una IP constante | Útil para comprobaciones continuas desde la misma IP |
| Centro de datos | Ideal para velocidad y grandes volúmenes de solicitudes | Mejor cuando no se requieren IP residenciales | Ideal para pruebas generales | Ideal para comprobaciones automatizadas frecuentes |
Los proxies residenciales son útiles cuando la dirección IP de origen y la ubicación son importantes. Los proxies de ISP funcionan bien cuando es necesario que la misma dirección IP permanezca activa durante más tiempo. Los proxies de centro de datos son la opción más adecuada cuando lo principal es la velocidad y la escala.
La mejor opción también depende de si la tarea requiere segmentación geográfica, una conexión estable o acceso a un conjunto más amplio de direcciones IP.
Cómo configurar un proxy en Puppeteer
Para configurar el proxy en Puppeteer se necesitan el host Geonode, el puerto, el nombre de usuario y la contraseña. Guarda las credenciales en variables de entorno y, a continuación, cárgalas al configurar el proxy en el código.
¿Utilizas Geonode? Obtén el nombre de usuario y la contraseña en Credenciales de acceso y el host, el puerto y el protocolo en Información del servidor proxy.
Ruta de configuración o código
En el caso de Puppeteer, pasa el servidor y el puerto del proxy mediante ``--proxy-server`
` al iniciar el navegador:
import puppeteer from "puppeteer";
import "dotenv/config";
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
A continuación, crea la página e introduce las credenciales del proxy:
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Mantén el nombre de usuario y la contraseña reales en variables de entorno, en lugar de incluirlos directamente en el archivo fuente. En nuestra prueba, esta configuración devolvió correctamente un código de estado HTTP 200 a través del proxy.
El formato de autenticación «host:port:user:pass»
Geonode
te proporciona cuatro valores:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Para Puppeteer, mantén los valores separados. Guárdalos en variables de entorno:
GEONODE_PROXY_HOST=proxy.geonode.io
GEONODE_PROXY_PORT=9000
GEONODE_PROXY_USER=USERNAME
GEONODE_PROXY_PASS=PASSWORD
Carga el host y el puerto a través de --proxy-server
y, a continuación, autentifica la página:
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
. Lo hemos probado con credenciales válidas y hemos recibido un código de estado HTTP 200. Con una contraseña incorrecta, el proxy devolvió un código de estado HTTP 407 y:
Authentication error. Please check your authentication settings.
Rotación frente a sesión persistente en Puppeteer
Si las solicitudes no necesitan mantener la misma IP, utiliza la rotación.
Para nuestra prueba, ejecutamos Puppeteer con el puerto HTTP rotativo:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Realizamos cinco solicitudes utilizando sesiones de navegador nuevas:
Request 1: 108.31.182.167
Request 2: 45.186.93.125
Request 3: 109.254.131.42
Request 4: 109.153.11.141
Request 5: 37.113.173.139
IP únicas: 5
Rotación: Sí
Las cinco solicitudes devolvieron direcciones IP diferentes en esta prueba. Esto confirma que la rotación funcionó durante la ejecución, pero no garantiza una nueva dirección IP para cada solicitud futura.
Si las solicitudes relacionadas deben mantenerse en la misma dirección IP, utiliza una sesión fija en su lugar. Utiliza el puerto fijo y añade los detalles de la sesión al nombre de usuario:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:10000"],
});
const page = await browser.newPage();
await page.authenticate({
username:
`${process.env.GEONODE_PROXY_USER}-session-blogpuppeteer01-lifetime-10`,
password: process.env.GEONODE_PROXY_PASS,
});
Realizamos tres solicitudes utilizando la misma sesión:
Request 1: 178.64.64.40
Request 2: 178.64.64.40
Request 3: 178.64.64.40
Misma IP: Sí
Las tres solicitudes utilizaron la misma IP.
Consulta las guías de Geonode
sobre proxies rotativos y sesiones fijas para conocer la configuración disponible.
Errores comunes relacionados con el proxy en Puppeteer y cómo solucionarlos
Si el proxy no funciona, empieza por comprobar los datos de conexión. Comprueba el nombre de usuario y la contraseña, y después el servidor, el puerto y el protocolo. El error que devuelve Puppeteer suele ayudar a identificar el problema.
407 Se requiere autenticación del proxy
Un código 407 suele indicar un problema de autenticación.
Cuando probamos Puppeteer con una contraseña incorrecta, el proxy devolvió:
HTTP status: 407
Authentication error. Please check your authentication settings.
Comprueba primero el nombre de usuario y la contraseña. Si son correctos, asegúrate de que se llama a page.authenticate() después de crear la página.
ERR_TUNNEL_CONNECTION_FAILED / conexión rechazada
Un error de conexión suele significar que Puppeteer no ha podido conectarse al proxy.
Comprueba primero el host y el puerto. A continuación, asegúrate de que el protocolo coincide con el del servidor proxy que se está utilizando.
En nuestra prueba de conexión fallida, Puppeteer no devolvió el error «ERR_TUNNEL_CONNECTION_FAILED
». Al utilizar un puerto de proxy inaccesible, se devolvió el error: «
net::ERR_CONNECTION_RESET at http://ip-api.com/json
». Por lo tanto, el error exacto de Chromium puede variar en función de cómo falle la conexión.
Tiempos de espera y respuestas vacías
Un tiempo de espera significa que la página no ha recibido una respuesta en el plazo configurado.
En primer lugar, comprueba si la URL de destino funciona y si el proxy puede conectarse. Si ambos funcionan, comprueba el tiempo de espera pasado a ``page.goto()`
`.
Para nuestra prueba, utilizamos un proxy no enrutable con un tiempo de espera de cinco segundos:
await page.goto(url, {
timeout: 5000,
});
. Puppeteer devolvió:
TimeoutError: Navigation timeout of 5000 ms exceeded
. Establecer un tiempo de espera explícito puede ayudar a que un script falle rápidamente cuando la conexión al proxy se cuelga.
ERR_NO_SUPPORTED_PROXIES
Un problema específico de Puppeteer que detectamos fue introducir el nombre de usuario y la contraseña directamente en --proxy-server
.
Esta configuración falló:
--proxy-server=http://USERNAME:PASSWORD@proxy.geonode.io:9000
Puppeteer devolvió:
net::ERR_NO_SUPPORTED_PROXIES
La solución consiste en pasar únicamente el servidor proxy a través del argumento de ejecución:
args: ["--proxy-server=http://proxy.geonode.io:9000"]
A continuación, hay que autenticarse por separado:
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Tras modificar la configuración, la solicitud se completó con éxito con un código HTTP 200.
Puppeteer + Geonode: qué te ofrece
Puppeteer se encarga de las solicitudes o conexiones en la aplicación. Geonode gestiona la conexión proxy.
Puedes elegir entre proxies residenciales, de ISP o de centros de datos en función del trabajo, y luego utilizar la rotación, las sesiones persistentes y la segmentación geográfica cuando sea necesario. De este modo, la configuración del proxy se mantiene separada del resto del código de la aplicación.
Los planes varían según el tipo de proxy, y algunas opciones tienen un precio por GB.
¿Puppeteer es compatible con los proxies de tipo «SOCKS5»?
SOCKS5 con autenticación no funcionó con la configuración de Puppeteer que probamos.
Probamos el puerto rotativo SOCKS5 de Geonode con page.authenticate(), pero Puppeteer devolvió el siguiente mensaje:
net::ERR_SOCKS_CONNECTION_FAILED
También intentamos incorporar las credenciales en --proxy-server, lo que devolvió el siguiente mensaje:
net::ERR_NO_SUPPORTED_PROXIES
Dado que ninguna de las configuraciones probadas de SOCKS5 con autenticación funcionó, la configuración HTTP verificada con --proxy-server y page.authenticate() es la opción más segura para esta configuración.
¿Puedo rotar las direcciones IP por solicitud en Puppeteer?
Sí, Puppeteer puede utilizar un proxy rotativo cuando el navegador se inicia mediante la configuración de proxy rotativo.
En nuestra prueba, cinco sesiones nuevas del navegador devolvieron cinco direcciones IP diferentes. Esto confirma que se produjo la rotación durante la prueba, pero no se garantiza una dirección IP diferente para cada solicitud o sesión del navegador.
¿Hay una prueba gratuita?
Sí. Geonode ofrece una prueba gratuita, por lo que se puede probar el proxy con Puppeteer antes de pasarse a un plan de pago. Consulta la prueba gratuita actual y los planes.
¿Dónde debo configurar el proxy en Puppeteer?
Configura el servidor y el puerto del proxy en puppeteer.launch()
utilizando --proxy-server
.
A continuación, llama a page.authenticate()
después de crear cada página para proporcionar el nombre de usuario y la contraseña:
const browser = await puppeteer.launch({
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
Esta fue la configuración que funcionó en nuestras pruebas.
¿Debo introducir el nombre de usuario y la contraseña del proxy en --proxy-server?
No. Mantén las credenciales por separado cuando utilices esta configuración de Puppeteer.
Al incluir USERNAME:PASSWORD@ directamente en --proxy-server, en nuestra prueba se devolvió ERR_NO_SUPPORTED_PROXIES. Al pasar allí solo el host y el puerto, y utilizar luego page.authenticate() para las credenciales, funcionó correctamente.