Socks5Proxy

Configuration du proxy dans Puppeteer, connexion avec --proxy-server et page.authenticate

Ce guide explique comment connecter les proxies HTTP de Socks5Proxy avec l'argument --proxy-server et l'authentification page.authenticate dans Puppeteer, la connexion SOCKS5, et le code pour lancer plusieurs navigateurs avec des IP différentes.

Comment fonctionne le proxy dans Puppeteer?

Puppeteer définit le proxy via les arguments passés lors du lancement de Chrome. Ajoutez l'adresse à --proxy-server et toutes les pages du navigateur utiliseront le même proxy. L'identifiant et le mot de passe du proxy HTTP ne peuvent pas être passés comme arguments, donc vous devez les passer via page.authenticate après avoir ouvert la page. Puppeteer répondra automatiquement lorsque le proxy demandera l'authentification.

L'exemple utilise l'IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, identifiant spx_user et mot de passe spx_pass.

npm install puppeteer

Comment se connecter à un proxy HTTP avec authentification ?

Ajoutez --proxy-server=198.51.100.23:8000 aux arguments de launch, et passez le nom d'utilisateur et le mot de passe à page.authenticate juste après avoir créé la page avec newPage. L'authentification doit être faite pour chaque page, donc répétez l'appel chaque fois que vous créez une nouvelle page.

Les sites HTTPS s'ouvrent également. Le navigateur établit un tunnel CONNECT et communique de manière chiffrée à l'intérieur.

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();

Comment utiliser un proxy SOCKS5 ?

Il suffit de mettre l'adresse socks5:// dans --proxy-server. Cependant, Chrome ne prend pas en charge l'authentification par nom d'utilisateur/mot de passe pour les proxies SOCKS, donc page.authenticate ne s'applique pas à SOCKS5. Pour vous connecter via SOCKS5, utilisez l'autorisation IP en enregistrant l'IPv4 du serveur exécutant ce code dans le tableau de bord.

Si votre environnement impose une connexion par identifiant/mot de passe, utilisez le port HTTP de la même IP. La localisation vue par le site cible sera identique.

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();

Comment ouvrir plusieurs navigateurs avec des IP différentes ?

Chrome ne permet qu'un seul proxy par navigateur lancé. Si vous avez besoin d'IP différentes, vous devez lancer des navigateurs séparément. Le code ci-dessous récupère une liste ip:port:user:pass via l'API, lance trois navigateurs avec les trois premières adresses, et affiche l'IP visible sur chaque page.

L'ouverture de nombreux navigateurs consomme beaucoup de mémoire. Nous recommandons une file de tâches avec limite de navigateurs simultanés.

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();
  }
}));

Comment accélérer le chargement des pages ?

Passer par un proxy pour les images, polices et vidéos consomme plus de bande passante et de temps. Si vous ne collectez que du texte, bloquez ces requêtes avec page.setRequestInterception pour gagner en vitesse et économiser la bande passante mensuelle des plans partagés.

La valeur de waitUntil est également importante. networkidle0 attend la fin de toutes les requêtes, ce qui peut être lent. Utilisez plutôt page.waitForSelector pour passer à l'étape suivante dès que l'élément nécessaire est visible.

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

Est-il possible d'utiliser différentes IP par page dans un même navigateur ?

Le --proxy-server de Chrome s'applique à l'ensemble du navigateur, ce qui rend difficile l'utilisation d'IP différentes par page. Puppeteer 22+ permet d'utiliser des proxies différents par contexte via l'option proxyServer de browser.createBrowserContext. Les contextes sont isolés en termes de cookies et de stockage, ce qui convient bien aux tâches par compte.

Utilisez page.authenticate pour passer les identifiants proxy aux pages créées dans un contexte. Plus économe en mémoire que l'ouverture de multiples navigateurs.

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();

Que faut-il configurer pour apparaître comme un utilisateur local ?

Pour adapter Playwright au pays de l'IP, utilisez page.setExtraHTTPHeaders pour définir Accept-Language et page.emulateTimezone pour le fuseau horaire. Si la langue ou le fuseau horaire diffère de celui du pays de l'IP, la page peut s'afficher dans une langue incorrecte ou avec des dates mal formatées.

Définissez la taille de l'écran avec page.setViewport. Pour un affichage mobile, passez les configurations d'appareils de KnownDevices de Puppeteer à 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 });

Comment maintenir un navigateur stable pour des tâches longues ?

Pour des tâches tournant toute la journée, il est plus stable de fermer et rouvrir le navigateur après un certain nombre de pages traitées, plutôt que de le laisser ouvert. Un navigateur laissé ouvert trop longtemps consomme de plus en plus de mémoire, et une erreur peut interrompre toutes les tâches suivantes.

Toujours appeler page.close dans des blocs try/finally, et ajouter un timeout aux goto pour éviter les blocages. En cas d'échec, réessayez avec un nouveau navigateur via un autre proxy.

Enregistrer les temps de réponse et erreurs par proxy vous aide à identifier les lignes lentes pour contacter le support ou ajuster vos batchs de tâches.

Comment résoudre les erreurs courantes ?

net::ERR_INVALID_AUTH_CREDENTIALS ou 407 signifie que les valeurs de page.authenticate sont incorrectes ou que l'appel n'a pas été fait après newPage. Assurez-vous de l'appeler avant goto pour chaque page.

net::ERR_PROXY_CONNECTION_FAILED signifie que l'adresse ou le port est incorrect. Assurez-vous d'utiliser le port HTTP pour les adresses HTTP et le port SOCKS5 pour les adresses SOCKS5. Si la connexion SOCKS5 est refusée, vérifiez que l'IP sortante est enregistrée pour l'authentification IP.

Configuration du proxy dans Puppeteer, authentification avec page.authenticate | Socks5Proxy