v1.10.90-0e025b8
Skip to main content
Back to Hex Proxies

Advanced Puppeteer Proxy Patterns

Last updated: April 2026

By Hex Proxies Engineering Team

Learn advanced proxy integration patterns for Puppeteer including per-page proxy rotation, stealth plugins, connection pooling, and production-grade scraping architecture.

advanced22 minutesdeveloper-qa

Prerequisites

  • Node.js 18+
  • Puppeteer installed
  • Understanding of browser automation
  • Hex Proxies account

Steps

1

Set up browser pool

Create a pool of Puppeteer browser instances, each configured with a different proxy session.

2

Add stealth plugins

Install puppeteer-extra-plugin-stealth to reduce browser automation fingerprinting.

3

Implement request interception

Block unnecessary resources (images, analytics, fonts) to reduce bandwidth and improve speed.

4

Build retry logic

Add exponential backoff with proxy session rotation on failures for production reliability.

5

Monitor and scale

Track success rates, page load times, and proxy consumption to optimize your scraping system.

Advanced Proxy Patterns for Puppeteer

Basic Puppeteer proxy setup is straightforward — pass --proxy-server to the browser args. Advanced patterns involve per-page proxy rotation, stealth integration, connection pooling, and production-grade error handling that turns Puppeteer from a script into a reliable scraping system.

Per-Page Proxy Rotation

Puppeteer sets proxy at the browser level, but you can achieve per-page rotation using browser contexts:

const puppeteer = require('puppeteer');

class ProxyBrowserPool { constructor(username, password, poolSize = 5) { this.username = username; this.password = password; this.poolSize = poolSize; this.browsers = []; }

async initialize() { for (let i = 0; i < this.poolSize; i++) { const sessionId = pool-${i}-${Date.now()}; const browser = await puppeteer.launch({ headless: 'new', args: [ --proxy-server=http://gate.hexproxies.com:8080, '--no-sandbox', '--disable-setuid-sandbox', ], }); this.browsers.push({ browser, sessionId, inUse: false }); } }

async getPage() { const slot = this.browsers.find(b => !b.inUse); if (!slot) throw new Error('No available browser in pool'); slot.inUse = true;

const page = await slot.browser.newPage(); await page.authenticate({ username: ${this.username}-session-${slot.sessionId}, password: this.password, });

return { page, release: () => { slot.inUse = false; } }; }

async close() { await Promise.all(this.browsers.map(b => b.browser.close())); } } ```

Stealth Integration

Combine proxies with stealth plugins to avoid detection:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function stealthScrape(url, username, password) { const browser = await puppeteer.launch({ headless: 'new', args: ['--proxy-server=http://gate.hexproxies.com:8080'], });

const page = await browser.newPage(); await page.authenticate({ username, password });

// Set realistic viewport await page.setViewport({ width: 1920, height: 1080 });

// Navigate with realistic timing await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });

// Random delay to mimic human behavior await page.waitForTimeout(1000 + Math.random() * 2000);

const content = await page.content(); await browser.close(); return content; } ```

Request Interception for Performance

Block unnecessary resources to speed up proxied page loads:

async function fastScrape(url, page) {
  await page.setRequestInterception(true);

const blockedTypes = new Set(['image', 'stylesheet', 'font', 'media']); const blockedDomains = new Set([ 'google-analytics.com', 'googletagmanager.com', 'facebook.net', 'doubleclick.net', ]);

page.on('request', (req) => { const url = new URL(req.url()); if (blockedTypes.has(req.resourceType()) || blockedDomains.has(url.hostname)) { req.abort(); } else { req.continue(); } });

await page.goto(url, { waitUntil: 'domcontentloaded' }); return await page.content(); } ```

Error Handling and Retry Logic

async function scrapeWithRetry(url, username, password, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const sessionId = `retry-${attempt}-${Date.now()}`;
    let browser;
    try {
      browser = await puppeteer.launch({
        headless: 'new',
        args: ['--proxy-server=http://gate.hexproxies.com:8080'],
      });
      const page = await browser.newPage();
      await page.authenticate({
        username: `${username}-session-${sessionId}`,
        password,
      });
      await page.setDefaultTimeout(30000);
      const response = await page.goto(url, { waitUntil: 'networkidle2' });

if (response && response.status() === 200) { const content = await page.content(); await browser.close(); return { success: true, content, attempts: attempt + 1 }; }

if (response && response.status() === 403) { // Likely blocked — rotate proxy and retry await browser.close(); continue; } } catch (error) { if (browser) await browser.close(); if (attempt === maxRetries - 1) { return { success: false, error: error.message, attempts: maxRetries }; } } } return { success: false, error: 'Max retries exceeded', attempts: maxRetries }; } ```

Production Architecture

For production scraping systems, combine browser pooling, proxy rotation, and error handling into a managed scraping service. The proxy layer is the critical component — Hex Proxies ISP proxies deliver sub-50ms latency that keeps page load times fast, while residential proxies provide the IP diversity needed for heavily protected targets.

Hex Proxies' multi-Gbps capacity scales with your Puppeteer automation needs.

Tips

  • Use browser contexts for per-page proxy sessions instead of launching new browsers.
  • Combine puppeteer-extra-plugin-stealth with residential proxies for maximum anti-detection.
  • Block analytics, tracking, and media resources to reduce page load time by 40-60%.
  • Rotate proxy sessions on 403 responses — same IP retries rarely succeed on protected sites.
  • Use ISP proxies for speed-sensitive scraping and residential for heavily protected targets.

Ready to Get Started?

Put this guide into practice with Hex Proxies.