Socks5Proxy

Configuración de proxy en Puppeteer, conexión con --proxy-server y page.authenticate

Esta guía explica cómo conectar el proxy HTTP de Socks5Proxy con el argumento --proxy-server y la autenticación page.authenticate al ejecutar Chrome con Puppeteer, cómo conectar SOCKS5 y cómo dividir el navegador en varias IP.

¿Cómo funciona el proxy en Puppeteer?

Puppeteer configura el proxy con un argumento que se pasa al iniciar Chrome. Si colocas la dirección en --proxy-server, todas las páginas de ese navegador usarán el mismo proxy. No puedes pasar el nombre de usuario y la contraseña del proxy HTTP como argumento, por lo que debes pasarlos con page.authenticate después de abrir la página. Así, Puppeteer responde automáticamente cuando el proxy solicita autenticación.

El ejemplo usa IP 198.51.100.23, puerto HTTP 8000, puerto SOCKS5 1080, usuario spx_user, contraseña spx_pass.

npm install puppeteer

¿Cómo conecto un proxy HTTP con autenticación?

En los args de launch, añade --proxy-server=198.51.100.23:8000, y justo después de crear la página con newPage, pasa el nombre de usuario y la contraseña a page.authenticate. La autenticación debe hacerse por página, así que añade la misma llamada cada vez que crees una nueva página.

Los sitios HTTPS también se abren normalmente. El navegador crea un túnel CONNECT y se comunica cifrado dentro de él.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

¿Cómo usar proxies SOCKS5?

Pon la dirección socks5:// en --proxy-server. Sin embargo, Chrome no admite autenticación de usuario y contraseña para proxies SOCKS, por lo que page.authenticate no funciona con SOCKS5. Para conectarte con SOCKS5, usa la autorización IP registrando la IPv4 del servidor donde se ejecuta el código en el dashboard.

Si necesitas autenticación por usuario/contraseña, usa el puerto HTTP de la misma IP. La ubicación visible para el sitio objetivo será idéntica.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

¿Cómo abrir varios navegadores con diferentes IP?

Chrome solo permite un proxy por navegador ejecutado, por lo que si necesitas diferentes IPs, debes ejecutar navegadores por separado. El siguiente código recibe una lista de ip:port:user:pass desde la API, abre un navegador para cada uno de los primeros 3, e imprime la IP visible en cada página.

Abrir muchos navegadores consume mucha memoria. Recomendamos usar colas de trabajo con límites de ejecución concurrente.

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

¿Cómo cargar páginas más rápido?

Los proxies procesan imágenes, fuentes y videos, consumiendo más ancho de banda. Para solo texto/data, bloquea estos recursos con page.setRequestInterception para ahorrar tráfico en planes compartidos.

El valor de waitUntil también es importante. networkidle0 espera hasta que todas las solicitudes terminan, lo que puede ser lento. Es mejor usar page.waitForSelector para avanzar tan pronto como aparezca el elemento necesario.

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

¿Puedo usar diferentes IPs por pestaña en un mismo navegador?

El --proxy-server de Chrome se aplica a todo el navegador, lo que dificulta el uso de diferentes IPs por página. Puppeteer 22 y superior permite usar diferentes proxies por contexto con la opción proxyServer en browser.createBrowserContext. Los contextos tienen cookies y almacenamiento separados, lo que los hace ideales para tareas por cuenta.

Las páginas creadas en el contexto también pueden autenticarse con page.authenticate usando usuario y contraseña. Consume menos memoria que abrir múltiples navegadores.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

¿Qué ajustar para parecer un usuario de ese país?

Configura Accept-Language con page.setExtraHTTPHeaders y la zona horaria con page.emulateTimezone según el país de la IP. Si el idioma y la zona horaria no coinciden con el país de la IP, las páginas pueden mostrar un idioma incorrecto o fechas diferentes.

Establece el tamaño de pantalla con page.setViewport, y para emular móviles, pasa configuraciones de dispositivos de KnownDevices en Puppeteer a page.emulate.

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

¿Cómo mantener estable el navegador en tareas largas?

Para tareas que se ejecutan todo el día, es más estable cerrar y reiniciar el navegador después de procesar un cierto número de páginas, en lugar de mantenerlo abierto. Los navegadores abiertos mucho tiempo consumen más memoria y un error puede detener todas las tareas posteriores.

Asegúrate de llamar a page.close en bloques try/finally, y usa timeouts en goto para evitar bloqueos. Reintenta fallos con otro proxy y navegador nuevo.

Registrar tiempos de respuesta y errores por proxy ayuda a identificar líneas lentas para contactar soporte o ajustar tus tareas.

¿Cómo soluciono errores comunes?

net::ERR_INVALID_AUTH_CREDENTIALS o 407 ocurren si los valores de page.authenticate son incorrectos o si no se llama después de newPage. Asegúrate de llamarlo antes de goto en cada página.

net::ERR_PROXY_CONNECTION_FAILED ocurre si la dirección o el puerto son incorrectos. Asegúrate de usar el puerto HTTP para direcciones HTTP y el puerto SOCKS5 para direcciones SOCKS5. Si la conexión SOCKS5 es rechazada, verifica si la IP saliente está registrada en la autorización IP.

Configuración de proxy en Puppeteer, autenticación con page.authenticate | Socks5Proxy