Navegadores Headless + Proxies: Guia Completo de Configuracao para Puppeteer e Playwright

Guia passo a passo para configurar Puppeteer e Playwright com rotação proxy, plugins furtivos, emulação de dispositivo e padrões de raspagem concomitantes usando proxies residenciais.

Navegadores Headless + Proxies: Guia Completo de Configuracao para Puppeteer e Playwright
Neste artigo

Por que os navegadores sem cabeça precisam de proxies

Navegadores sem cabeça — instâncias de navegador rodando sem uma GUI visível — são essenciais para raspar sites pesados em JavaScript. No entanto, executar várias sessões de navegador sem cabeça a partir de um único endereço IP é um sinal de automação óbvio. Combinando navegadores sem cabeça com rotação proxy resolve isso distribuindo pedidos em milhares de IPs residenciais.

Este guia cobre a configuração proxy Puppeteer e Playwright, plugins furtivos e estratégias de rotação. Para mais informações sobre como funciona a detecção, consulte guia para sistemas de detecção antibots.

Configuração do Proxy do Marioneta

Configuração Básica

// Puppeteer: Basic proxy configuration
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--no-sandbox',
    '--disable-setuid-sandbox'
  ]
});
const page = await browser.newPage();
// Authenticate with the proxy
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
await page.goto('https://example.com', {
  waitUntil: 'networkidle2',
  timeout: 30000
});
const content = await page.content();
console.log(content.substring(0, 200));
await browser.close();

SOCKS5 com Puppeteer

// Puppeteer: SOCKS5 proxy configuration
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=socks5://gate.proxyhat.com:1080'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});

'Plugin' de Furto de Marionetas

A configuração padrão do Puppeteer expõe dezenas de marcadores de automação que sistemas anti-bots detectam. A puppeteer-extra-plugin-stealth 'plugins' altera automaticamente estes marcadores.

// Install: npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
// Apply stealth plugin
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--disable-blink-features=AutomationControlled',
    '--window-size=1920,1080',
    '--disable-dev-shm-usage'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
// Set realistic viewport
await page.setViewport({ width: 1920, height: 1080 });
// Set extra headers for consistency
await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-US,en;q=0.9'
});
await page.goto('https://example.com');

Os patches de plug- in furtivos:

  • navigator.webdriver — definido como indefinido em vez de verdadeiro
  • chrome.runtime — adiciona objetos específicos do Chrome em falta
  • WebGL fornecedor/renderer — strings GPU realistas
  • Arrays de plug-in e permissão — corresponder ao Chrome real
  • Consistência da linguagem e da plataforma

Para uma compreensão mais profunda do que esses patches abordam, consulte nosso artigo sobre impressão digital do navegador.

Configuração do Proxy do dramaturgo

O Playwright oferece uma configuração proxy mais elegante do que o Puppeteer, suportando proxies por contexto e emulação de dispositivos embutidos.

Configuração Básica

// Playwright: Basic proxy setup
const { chromium } = require('playwright');
const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
const title = await page.title();
console.log(`Page title: ${title}`);
await browser.close();

Proxy por Contexto (diferentes IPs por aba)

// Playwright: Different proxy per context
const { chromium } = require('playwright');
const browser = await chromium.launch();
// Context 1: US proxy session
const ctx1 = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-us-session-abc1',
    password: 'PASSWORD'
  },
  locale: 'en-US',
  timezoneId: 'America/New_York'
});
// Context 2: UK proxy session
const ctx2 = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-gb-session-abc2',
    password: 'PASSWORD'
  },
  locale: 'en-GB',
  timezoneId: 'Europe/London'
});
const page1 = await ctx1.newPage();
const page2 = await ctx2.newPage();
// Each page uses a different IP and locale
await page1.goto('https://example.com');
await page2.goto('https://example.com');

Emulação do dispositivo com o Proxy

// Playwright: Realistic device emulation + proxy
const { chromium, devices } = require('playwright');
const browser = await chromium.launch({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
// Emulate a specific device with matching settings
const context = await browser.newContext({
  ...devices['Desktop Chrome'],
  locale: 'en-US',
  timezoneId: 'America/Chicago',
  geolocation: { latitude: 41.8781, longitude: -87.6298 },
  permissions: ['geolocation'],
  colorScheme: 'light'
});
const page = await context.newPage();
await page.goto('https://example.com');

Rotação de proxy com navegadores sem cabeça

Estratégia 1: Novo Contexto por Pedido

Criar um novo contexto de navegador para cada URL. Isso dá um novo IP e limpar cookies por pedido.

// Playwright: Rotate proxy per request via new contexts
async function scrapeWithRotation(urls) {
  const browser = await chromium.launch();
  const results = [];
  for (const url of urls) {
    const sessionId = `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
    const context = await browser.newContext({
      proxy: {
        server: 'http://gate.proxyhat.com:8080',
        username: `USERNAME-session-${sessionId}`,
        password: 'PASSWORD'
      }
    });
    const page = await context.newPage();
    try {
      await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
      const data = await page.evaluate(() => document.title);
      results.push({ url, data });
    } catch (error) {
      console.error(`Failed: ${url} — ${error.message}`);
    } finally {
      await context.close();
    }
    // Natural delay between requests
    await new Promise(r => setTimeout(r, 1000 + Math.random() * 2000));
  }
  await browser.close();
  return results;
}

Estratégia 2: Sessões pegajosas para Fluxos Multi-Página

Use sessões pegajosas quando você precisa manter o mesmo IP em várias páginas (paginação, fluxos de login).

// Playwright: Sticky session for multi-page scraping
async function scrapeWithStickySession(baseUrl, pageCount) {
  const sessionId = `sticky-${Date.now()}`;
  const browser = await chromium.launch({
    proxy: {
      server: 'http://gate.proxyhat.com:8080',
      username: `USERNAME-session-${sessionId}`,
      password: 'PASSWORD'
    }
  });
  const context = await browser.newContext();
  const page = await context.newPage();
  const results = [];
  for (let i = 1; i <= pageCount; i++) {
    await page.goto(`${baseUrl}?page=${i}`, { waitUntil: 'networkidle' });
    const items = await page.$$eval('.item', els =>
      els.map(el => el.textContent.trim())
    );
    results.push(...items);
    // Natural delay between pages
    await new Promise(r => setTimeout(r, 1500 + Math.random() * 1500));
  }
  await browser.close();
  return results;
}

Estratégia 3: Raspa concomitante com piscina

// Playwright: Concurrent scraping with proxy pool
async function concurrentScrape(urls, concurrency = 5) {
  const browser = await chromium.launch();
  const results = [];
  // Process URLs in batches
  for (let i = 0; i < urls.length; i += concurrency) {
    const batch = urls.slice(i, i + concurrency);
    const promises = batch.map(async (url) => {
      const sessionId = `conc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
      const context = await browser.newContext({
        proxy: {
          server: 'http://gate.proxyhat.com:8080',
          username: `USERNAME-session-${sessionId}`,
          password: 'PASSWORD'
        }
      });
      const page = await context.newPage();
      try {
        await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' });
        return { url, title: await page.title(), status: 'ok' };
      } catch (e) {
        return { url, error: e.message, status: 'error' };
      } finally {
        await context.close();
      }
    });
    const batchResults = await Promise.all(promises);
    results.push(...batchResults);
    // Delay between batches
    await new Promise(r => setTimeout(r, 2000));
  }
  await browser.close();
  return results;
}

Puppeteer com Python (Alternativa Pippeteer)

Para desenvolvedores Python, playwright para Python fornece as mesmas capacidades com sintaxe mais limpa.

# Python: Playwright with proxy and stealth settings
# pip install playwright
# playwright install chromium
from playwright.async_api import async_playwright
import asyncio
async def scrape_with_proxy():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            proxy={
                "server": "http://gate.proxyhat.com:8080",
                "username": "USERNAME",
                "password": "PASSWORD"
            }
        )
        context = await browser.new_context(
            viewport={"width": 1920, "height": 1080},
            locale="en-US",
            timezone_id="America/New_York",
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        )
        page = await context.new_page()
        await page.goto("https://example.com")
        title = await page.title()
        print(f"Title: {title}")
        await browser.close()
asyncio.run(scrape_with_proxy())

Otimização dos Recursos

Navegadores sem cabeça consomem memória significativa e CPU. Otimizar para cargas de trabalho de produção:

Bloquear recursos desnecessários

// Playwright: Block images, fonts, and CSS to save bandwidth
const context = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME',
    password: 'PASSWORD'
  }
});
const page = await context.newPage();
// Block non-essential resources
await page.route('**/*.{png,jpg,jpeg,gif,svg,webp,woff,woff2,ttf,css}', route =>
  route.abort()
);
// Block tracking and analytics
await page.route('**/{google-analytics,gtag,facebook}**', route =>
  route.abort()
);
await page.goto('https://example.com');

Gestão de Memórias

  • Fechar contextos após o uso: Cada contexto aberto consome 50-150MB. Sempre fechar contextos quando feito.
  • Limitar contextos concorrentes: Mantenha 3-10 contextos por instância de navegador com base na RAM disponível.
  • Reiniciar o navegador periodicamente: Após 100-200 ciclos de contexto, reinicie o navegador para evitar vazamentos de memória.
  • Usar sem cabeça: 'new' (Puppeteer): O novo modo sem cabeça usa menos memória do que o antigo.

Lidar com Questões Comuns

Falhas na autenticação do proxy

// Handle proxy auth errors gracefully
try {
  const response = await page.goto(url, { timeout: 30000 });
  if (response.status() === 407) {
    console.error('Proxy authentication failed — check credentials');
  }
} catch (error) {
  if (error.message.includes('net::ERR_PROXY_CONNECTION_FAILED')) {
    console.error('Proxy connection failed — check proxy server availability');
  }
}

Tratamento de Tempo- limite

// Retry with exponential backoff
async function gotoWithRetry(page, url, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await page.goto(url, {
        waitUntil: 'domcontentloaded',
        timeout: 30000
      });
    } catch (error) {
      if (attempt === maxRetries) throw error;
      const delay = 1000 * Math.pow(2, attempt) + Math.random() * 1000;
      console.log(`Retry ${attempt}/${maxRetries} after ${delay}ms`);
      await new Promise(r => setTimeout(r, delay));
    }
  }
}

Lista de Verificação de Melhores Práticas

Lista de Verificação de Melhores Práticas
PráticaPuppeteerdramaturgo
Proxy por contextoSomente por args de lançamentoSuporte a proxy por contexto
Correções furtivasTiterieer-extra-plugin-stealthEmulação incorporada do dispositivo
Bloqueamento de recursospage.setRequestInterceptionpage.route
Multi- navegadorApenas crómioChromium, Firefox, WebKit
Isolamento da sessãoNovo navegador por sessãoNovo contexto por sessão
Para a maioria das tarefas de raspagem, Playwright é a escolha recomendada sobre o Puppeteer devido ao seu suporte proxy superior (por contexto), emulação de dispositivo embutido, e suporte multi-browser. Combina-o com Proxies residenciais do ProxyHat para os melhores resultados.

Para configuração do proxy específico do idioma sem navegadores sem cabeça, consulte nossos guias para Python, Node.js, e Vai.. Para estratégias antidetecção abrangentes, leia Guia de redução de detecçãoSempre siga práticas éticas de raspagem e respeito políticas de acesso ao site.

Perguntas Frequentes

Perguntas frequentes

Devo usar Puppeteer ou Playwright para scraping com proxy?

Playwright e geralmente a melhor escolha porque suporta configuracao de proxy por contexto, emulacao de dispositivo integrada e multiplos motores de navegador (Chromium, Firefox, WebKit). Puppeteer requer reiniciar o navegador inteiro para mudar configuracoes de proxy, o que e menos eficiente para rotacao.

Quantas sessoes de navegador headless concorrentes posso executar?

Cada contexto de navegador usa 50-150MB de RAM. Em um servidor com 8GB de RAM, voce pode executar aproximadamente 20-40 contextos concorrentes. Use bloqueio de recursos (imagens, CSS, fontes) para reduzir o uso de memoria por contexto. Monitore a memoria e reinicie navegadores periodicamente para prevenir vazamentos.

Preciso de plugins stealth com Playwright?

Playwright requer menos patches stealth que Puppeteer porque sua emulacao de dispositivo e mais abrangente. No entanto, para sites altamente protegidos, medidas stealth adicionais como fingerprints personalizados, correspondencia de timezone e consistencia de idioma ainda sao necessarias.

Navegadores headless podem usar proxies SOCKS5?

Sim. Tanto Puppeteer quanto Playwright suportam proxies SOCKS5. No Puppeteer, use --proxy-server=socks5://gate.proxyhat.com:1080 como argumento de lancamento. No Playwright, defina o campo server na configuracao de proxy como socks5://gate.proxyhat.com:1080.

Como rotaciono proxies entre requisicoes em um navegador headless?

Com Playwright, crie um novo contexto de navegador para cada requisicao ou sessao, especificando um ID de sessao diferente nas credenciais do proxy. Cada contexto recebe um IP novo e cookies limpos. Com Puppeteer, voce precisa lancar uma nova instancia de navegador para cada proxy, ou usar o proxy no nivel do navegador com parametros de sessao.

Pronto para começar?

Proxies residenciais, ISP e móveis em mais de 148 países. Crie uma conta grátis.

Criar conta grátis
← Voltar ao Blog