Puppeteer-Proxy-Einstellungen, Verbinden mit --proxy-server und page.authenticate
Diese Anleitung erklärt für Puppeteer die Verbindung von Socks5Proxy-HTTP-Proxys über --proxy-server und page.authenticate, SOCKS5-Verbindungen und das Starten von Browsern mit verschiedenen IPs.
Wie funktionieren Proxys in Puppeteer?
Puppeteer legt den Proxy über Argumente fest, die beim Starten von Chrome übergeben werden. Wenn Sie die Adresse in --proxy-server eingeben, verwenden alle Seiten des Browsers den gleichen Proxy. Die Authentifizierungsinformationen für HTTP-Proxys können nicht als Argumente übergeben werden, daher verwenden Sie page.authenticate, nachdem die Seite geöffnet wurde. Puppeteer antwortet dann automatisch auf die Authentifizierungsanfrage des Proxys.
Beispiel mit IP 198.51.100.23, HTTP-Port 8000, SOCKS5-Port 1080, Benutzername spx_user, Passwort spx_pass.
npm install puppeteerWie verbinde ich einen HTTP-Proxy mit Authentifizierung?
Fügen Sie --proxy-server=198.51.100.23:8000 zu launch-args hinzu. Nach newPage authentifizieren Sie mit page.authenticate (Benutzername/Passwort). Wiederholen Sie dies für jede neue Seite.
HTTPS-Seiten öffnen sich normal. Der Browser erstellt einen CONNECT-Tunnel und kommuniziert darin verschlüsselt.
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();Wie verwende ich einen SOCKS5-Proxy?
Geben Sie die socks5:// Adresse in --proxy-server ein. Chrome unterstützt jedoch keine Benutzername- und Passwort-Authentifizierung für SOCKS-Proxys, sodass page.authenticate nicht für SOCKS5 gilt. Verwenden Sie die IP-Autorisierung, indem Sie die IPv4 des Servers, auf dem dieser Code ausgeführt wird, im Dashboard registrieren.
Wenn Benutzername/Passwort erforderlich sind, ist die einfachste Lösung die Verwendung des HTTP-Ports derselben IP. Die Zielseite sieht dieselbe Position, da es sich um dieselbe IP handelt.
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();Wie kann ich Browser mit mehreren IPs öffnen?
Chrome verwendet einen Proxy pro geöffnetem Browser. Wenn Sie unterschiedliche IPs benötigen, müssen Sie separate Browser öffnen. Der folgende Code empfängt eine ip:port:user:pass-Liste über die API, öffnet drei Browser mit den ersten drei Einträgen und gibt die auf jeder Seite angezeigte IP aus.
Viele Browserinstanzen verbrauchen viel RAM. Begrenzen Sie parallele Instanzen mit einer Warteschlange.
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();
}
}));Wie kann ich Seiten schneller laden?
Über Proxys geladene Bilder, Schriftarten und Videos erhöhen Bandbreitenverbrauch. Bei reinen Text-/Datenanfragen kann page.setRequestInterception Bild-/Schriftartenanfragen blockieren - das spart Geschwindigkeit und Bandbreite in Shared-Plänen.
waitUntil-Einstellungen beachten: networkidle0 wartet auf alle Anfragen (langsam). page.waitForSelector ist oft effizienter.
await page.setRequestInterception(true);
page.on("request", (req) => {
const type = req.resourceType();
if (type === "image" || type === "font" || type === "media") req.abort();
else req.continue();
});Kann ein Browser pro Seite unterschiedliche IPs nutzen?
Der --proxy-server von Chrome gilt für den gesamten Browser, was es schwierig macht, für jede Seite eine andere IP zu verwenden. Puppeteer 22+ unterstützt die proxyServer-Option in browser.createBrowserContext, um für jeden Kontext einen anderen Proxy zu verwenden. Kontexte haben getrennte Cookies und Speicher, was sie ideal für kontospezifische Aufgaben macht.
Seiten, die im Kontext erstellt wurden, können auch mit page.authenticate Benutzername und Passwort übergeben. Dies verbraucht weniger Speicher als das Öffnen mehrerer Browser.
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();Was muss angepasst werden, um wie ein Nutzer aus diesem Land auszusehen?
Stellen Sie Accept-Language mit page.setExtraHTTPHeaders und die Zeitzone mit page.emulateTimezone entsprechend dem IP-Land ein. Wenn Sprache und Zeitzone nicht mit dem IP-Land übereinstimmen, kann die Seite in der falschen Sprache angezeigt werden oder das Datumsformat kann sich ändern.
Die Bildschirmgröße wird mit page.setViewport festgelegt. Für Mobilansichten können KnownDevices-Konfigurationen aus Puppeteer an page.emulate übergeben werden.
await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });Wie hält man Browser bei langlaufenden Aufgaben stabil?
Für Aufgaben, die den ganzen Tag laufen, ist es stabiler, den Browser nach einer bestimmten Anzahl von Seiten zu schließen und neu zu starten, anstatt ihn lange geöffnet zu lassen. Ein lange geöffneter Browser verbraucht immer mehr Speicher, und ein Fehler kann alle nachfolgenden Aufgaben stoppen.
Verwenden Sie try und finally mit page.close, und fügen Sie timeouts zu goto hinzu, um hängende Seiten zu vermeiden. Fehlgeschlagene Aufgaben können mit einem neuen Proxy und Browser wiederholt werden.
Das Aufzeichnen von Antwortzeiten und Fehlern pro Proxy hilft, langsame Verbindungen zu identifizieren - entweder für Support-Anfragen oder um Aufgabenverteilungen anzupassen.
Wie behebe ich häufige Fehler?
net::ERR_INVALID_AUTH_CREDENTIALS oder 407: Falsche page.authenticate-Werte oder Aufruf nach newPage vergessen. Prüfen Sie die Authentifizierung vor jedem goto.
net::ERR_PROXY_CONNECTION_FAILED: Falsche Adresse/Port. Verwenden Sie HTTP-Ports für HTTP und SOCKS5-Ports für SOCKS5. Bei SOCKS5-Verbindungsproblemen prüfen Sie die IP-Autorisierungsliste.