Integração

Use a Shifter com Puppeteer

Execute uma instância real de Chromium através dos proxies residenciais do Shifter em minutos. Suporte nativo a --proxy-server, page.authenticate(), geo-targeting por aba e escalonamento completo de clusters, sem plugins extras necessários.

Início Rápido

Instalar

npm install puppeteer

Uso Básico

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

Recursos

Suporte nativo a --proxy-server, sem necessidade de extensões extras ou processos auxiliares
page.authenticate() lida com as credenciais do Shifter automaticamente, inclusive no modo headless: 'new'
Credenciais de proxy por aba permitem fazer scraping de vários países em paralelo a partir de um único navegador
Geo-direcionamento em 195+ países via parâmetros de nome de usuário: country, region, city, ASN
Compatível com puppeteer-cluster, puppeteer-extra-plugin-stealth e todo o ecossistema de plugins do Puppeteer
Rotação por requisição por padrão, com `sid` para sessões persistentes e `ttl-N` para fixações por tempo de N segundos

Exemplos

Proxy Autenticado + Sticky Session

Fixe um IP residencial para toda a sessão do navegador adicionando `sid-XXX` ao nome de usuário. Adicione `country-uk-city-london` para segmentação geográfica e `ttl-300` para manter esse IP por 300 segundos.

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

Segmentação Geográfica Por Aba

Cada nova página recebe suas próprias credenciais de proxy — deixe uma aba raspar um site dos EUA enquanto outra raspa um site japonês, tudo através de um único navegador.

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 (scraping paralelo)

Escale para dezenas de páginas em paralelo sem estourar a memória. Passe o proxy via puppeteerOptions e autentique por página na sua função de tarefa.

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

Modo Furtivo + Bloqueio de Recursos

Combine a Shifter com o plugin stealth do puppeteer-extra e bloqueie imagens / fontes / mídia para fazer scraping de 5 a 10 vezes mais rápido, evitando os sinalizadores de automação do Chrome.

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

Perguntas frequentes

Perguntas comuns sobre usar o Shifter com 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.

Sim, no Puppeteer moderno (com headless: 'new'). O modo legado `headless: true` também suporta isso. Se você estiver preso a versões do Chromium anteriores à 105, pode ser necessário recorrer a uma extensão do Chrome que injeta credenciais, mas em qualquer versão recente do Puppeteer, page.authenticate simplesmente funciona.

Adicione um ID de sessão ao nome de usuário do proxy, por exemplo, `customer-USERNAME-country-us-sid-123ABC`. Toda página que autenticar com esse nome de usuário compartilhará o mesmo IP residencial. Adicione `ttl-N` para fixar o IP por até N segundos.

Sim. Cada chamada de newPage() pode autenticar com um nome de usuário do Shifter diferente — `country-us` para uma aba, `country-jp` para outra. O estado em nível de navegador (cookies, cache) é compartilhado, mas o IP de saída muda por aba, o que é ideal para raspar conteúdo localizado em paralelo.

Sim. O plugin stealth corrige as impressões digitais de automação do Chrome; a Shifter cuida do IP residencial. Os dois se combinam perfeitamente: instale o puppeteer-extra e o plugin stealth, depois configure o proxy na inicialização como de costume.

Passe o argumento --proxy-server em puppeteerOptions ao chamar Cluster.launch, depois chame page.authenticate dentro do seu callback cluster.task. Combine isso com um sid único por tarefa para scraping paralelo que não compartilha IPs entre workers.

Começar

Comece a Usar o Shifter com Puppeteer

Execute Chromium headless através dos 205M+ proxies residenciais e de ISP do Shifter. --proxy-server nativo, geo-targeting por aba, sessões fixas e suporte completo ao Puppeteer-cluster.

Experimente o Shifter GratuitamenteConfigure em minutos. Cancele quando quiser.