Shifter verwenden mit Puppeteer
Steuern Sie eine echte Chromium-Instanz in wenigen Minuten über Shifters Residential-Proxys. Native --proxy-server-Unterstützung, page.authenticate(), geo-spezifisches Targeting pro Tab und vollständige Cluster-Skalierung - keine zusätzlichen Plugins erforderlich.
Schnellstart
Installieren
npm install puppeteer Grundlegende Nutzung
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=http://p.shifter.io:443"],
headless: "new",
});
const page = await browser.newPage();
await page.authenticate({
username: "customer-USERNAME-country-us-sid-123ABC",
password: "PASSWORD",
});
await page.goto("https://ipinfo.io/json");
console.log(await page.evaluate(() => document.body.textContent));
// {"ip": "154.16.xxx.xxx", "city": "New York", "country": "US", ...}
await browser.close(); Funktionen
Beispiele
Authentifizierter Proxy + Sticky Session
Fixieren Sie eine Residential IP für die gesamte Browser-Sitzung, indem Sie `sid-XXX` zum Benutzernamen hinzufügen. Fügen Sie `country-uk-city-london` für Geo-Targeting und `ttl-300` hinzu, um diese IP für 300 Sekunden beizubehalten.
import puppeteer from "puppeteer";
import { randomBytes } from "node:crypto";
const sid = randomBytes(4).toString("hex");
const browser = await puppeteer.launch({
args: [
"--proxy-server=http://p.shifter.io:443",
"--no-sandbox",
"--disable-blink-features=AutomationControlled",
],
headless: "new",
});
const page = await browser.newPage();
await page.authenticate({
username: `customer-USERNAME-country-uk-city-london-sid-${sid}-ttl-300`,
password: "PASSWORD",
});
await page.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
);
// Multi-step flow — every page load reuses the same residential IP.
await page.goto("https://example.co.uk/login", { waitUntil: "networkidle0" });
await page.type("#email", "user@example.com");
await page.type("#password", "secret");
await page.click('button[type="submit"]');
await page.waitForNavigation({ waitUntil: "networkidle0" });
await page.goto("https://example.co.uk/dashboard");
const html = await page.content();
console.log(html.length, "bytes from dashboard");
await browser.close(); Geo-Targeting pro Tab
Jede neue Seite erhält eigene Proxy-Zugangsdaten - lassen Sie einen Tab eine US-Website scrapen, während ein anderer eine japanische scrapt, alles über einen Browser.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=http://p.shifter.io:443"],
headless: "new",
});
async function scrape(country: string, url: string) {
const page = await browser.newPage();
await page.authenticate({
username: `customer-USERNAME-country-${country}-sid-${country}-001`,
password: "PASSWORD",
});
await page.goto(url, { waitUntil: "domcontentloaded" });
const data = await page.evaluate(() => ({
title: document.title,
text: document.body.innerText.slice(0, 200),
}));
await page.close();
return { country, ...data };
}
const results = await Promise.all([
scrape("us", "https://www.example.com"),
scrape("jp", "https://www.example.jp"),
scrape("de", "https://www.example.de"),
scrape("br", "https://www.example.com.br"),
]);
console.log(results);
await browser.close(); Puppeteer Cluster (paralleles Scraping)
Skalieren Sie auf Dutzende von Seiten parallel, ohne den Speicher zu überlasten. Übergeben Sie den Proxy über puppeteerOptions und authentifizieren Sie sich pro Seite in Ihrer Task-Funktion.
import { Cluster } from "puppeteer-cluster";
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_PAGE,
maxConcurrency: 10,
puppeteerOptions: {
args: ["--proxy-server=http://p.shifter.io:443"],
headless: "new",
},
monitor: true,
});
await cluster.task(async ({ page, data: url }) => {
await page.authenticate({
username: `customer-USERNAME-country-us-sid-${url.replace(/\W+/g, "").slice(0, 8)}`,
password: "PASSWORD",
});
await page.goto(url, { waitUntil: "networkidle0" });
const title = await page.title();
const html = await page.content();
return { url, title, length: html.length };
});
const urls = [
"https://example.com/category/laptops",
"https://example.com/category/phones",
"https://example.com/category/tablets",
// ... hundreds more
];
const results = await Promise.all(urls.map((url) => cluster.execute(url)));
console.log(results);
await cluster.idle();
await cluster.close(); Stealth-Modus + Ressourcen-Blockierung
Kombinieren Sie Shifter mit dem Stealth-Plugin von puppeteer-extra und blockieren Sie Bilder, Schriftarten und Medien, um 5–10x schneller zu scrapen und dabei Chromes Automatisierungserkennung zu umgehen.
import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
args: [
"--proxy-server=http://p.shifter.io:443",
"--disable-blink-features=AutomationControlled",
],
headless: "new",
});
const page = await browser.newPage();
await page.authenticate({
username: "customer-USERNAME-country-us-city-newyork-sid-789GHI",
password: "PASSWORD",
});
// Block images, fonts, and media for faster page loads
await page.setRequestInterception(true);
page.on("request", (req) => {
const blocked = ["image", "font", "media", "stylesheet"];
blocked.includes(req.resourceType()) ? req.abort() : req.continue();
});
await page.goto("https://example.com", { waitUntil: "domcontentloaded" });
const products = await page.$$eval(".product", (els) =>
els.map((el) => ({
title: el.querySelector("h2")?.textContent?.trim(),
price: el.querySelector(".price")?.textContent?.trim(),
})),
);
console.log(products);
await browser.close(); Häufig gestellte Fragen
Häufige Fragen zur Verwendung von Shifter mit Puppeteer.
Pass --proxy-server=http://p.shifter.io:443 to the browser launch args, then call page.authenticate({ username, password }) on each page before navigating. The same proxy applies to every tab and the credentials handle the basic-auth challenge transparently.
Ja, in modernem Puppeteer (mit headless: 'new'). Der ältere `headless: true`-Modus unterstützt es ebenfalls. Wenn Sie bei Chromium-Versionen älter als 105 feststecken, müssen Sie möglicherweise auf eine Chrome-Erweiterung zurückgreifen, die Anmeldedaten einfügt, aber in jeder aktuellen Puppeteer-Version funktioniert page.authenticate einfach.
Fügen Sie dem Proxy-Benutzernamen eine Sitzungs-ID hinzu - zum Beispiel `customer-USERNAME-country-us-sid-123ABC`. Jede Seite, die sich mit diesem Benutzernamen authentifiziert, teilt dieselbe Residential IP. Fügen Sie `ttl-N` hinzu, um die IP für bis zu N Sekunden zu fixieren.
Ja. Jeder newPage()-Aufruf kann sich mit einem anderen Shifter-Benutzernamen authentifizieren -- `country-us` für ein Tab, `country-jp` für ein anderes. Der Status auf Browser-Ebene (Cookies, Cache) wird geteilt, aber die ausgehende IP ändert sich pro Tab, was ideal für das parallele Scraping lokalisierter Inhalte ist.
Ja. Das Stealth-Plugin patcht die Automatisierungs-Fingerprints von Chrome; Shifter übernimmt die Residential IP. Beides lässt sich sauber kombinieren -- installieren Sie puppeteer-extra und das Stealth-Plugin und konfigurieren Sie den Proxy beim Start wie gewohnt.
Übergeben Sie das Argument --proxy-server in puppeteerOptions beim Aufruf von Cluster.launch und rufen Sie dann page.authenticate im Callback Ihrer cluster.task auf. Kombinieren Sie dies mit einer eindeutigen sid pro Task für paralleles Scraping, das keine IPs zwischen Workern teilt.
Shifter verwenden mit Puppeteer
Steuern Sie headless Chromium über Shifters 205M+ Residential- und ISP-Proxys. Nativer --proxy-server, Geo-Targeting pro Tab, Sticky Sessions und vollständige Puppeteer-cluster-Unterstützung.