Puppeteer & Playwright
DocsPuppeteer & Playwright

Puppeteer & Playwright

Inicie navegadores headless a través de RaxyProxy con Puppeteer o Playwright.

Puppeteer

npm install puppeteer

puppeteer.mjs
import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
    args: [
        '--proxy-server=http://proxy.raxyproxy.com:823',
        '--no-sandbox',
    ],
});

const page = await browser.newPage();

// Authenticate with the proxy
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });

await page.goto('https://httpbin.org/ip');
const body = await page.evaluate(() => document.body.innerText);
console.log(JSON.parse(body));

await browser.close();

Geo-Targeting con Puppeteer

puppeteer-geo.mjs
import puppeteer from 'puppeteer';

// Country targeting — append to username
const USERNAME_GEO = 'USERNAME__cr.us';

const browser = await puppeteer.launch({
    args: ['--proxy-server=http://proxy.raxyproxy.com:823', '--no-sandbox'],
});

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

await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));

await browser.close();

Playwright

npm install playwright

playwright.mjs
import { chromium } from 'playwright';

const browser = await chromium.launch({
    proxy: {
        server:   'http://proxy.raxyproxy.com:823',
        username: 'USERNAME',
        password: 'PASSWORD',
    },
});

const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');

const text = await page.textContent('body');
console.log(JSON.parse(text));

await browser.close();

Geo-Targeting con Playwright

playwright-geo.mjs
import { chromium } from 'playwright';

// City-level targeting (uses 2× billing for residential/mobile/datacenter)
const browser = await chromium.launch({
    proxy: {
        server:   'http://proxy.raxyproxy.com:823',
        username: 'USERNAME__cr.us;city.newyork',
        password: 'PASSWORD',
    },
});

const context = await browser.newContext();
const page    = await context.newPage();

await page.goto('https://httpbin.org/ip');
console.log(await page.textContent('body'));

await browser.close();
playwright-multiple-contexts.mjs
import { chromium } from 'playwright';

// Multiple browser contexts, each with a different sticky port
const browser = await chromium.launch();

const contexts = await Promise.all(
    [10001, 10002, 10003].map(port =>
        browser.newContext({
            proxy: {
                server:   `http://proxy.raxyproxy.com:${port}`,
                username: 'USERNAME',
                password: 'PASSWORD',
            },
        })
    )
);

const results = await Promise.all(
    contexts.map(async (ctx, i) => {
        const page = await ctx.newPage();
        await page.goto('https://httpbin.org/ip');
        const text = await page.textContent('body');
        await ctx.close();
        return { slot: i + 1, ip: JSON.parse(text).origin };
    })
);

console.log(results);
await browser.close();

Notas sobre huellas digitales del navegador

El proxy solo no es suficiente

Los sitios con detección avanzada de bots verifican las huellas digitales del navegador más allá de la dirección IP: zona horaria, WebGL, Canvas, fuentes y propiedades del navegador. Usar un proxy residencial mejora su reputación de IP, pero también puede necesitar configurar la zona horaria y el idioma del navegador para que coincidan con su país objetivo.

playwright-locale.mjs
import { chromium } from 'playwright';

const browser = await chromium.launch({
    proxy: {
        server:   'http://proxy.raxyproxy.com:823',
        username: 'USERNAME__cr.us',
        password: 'PASSWORD',
    },
});

// Match locale, timezone, and viewport to look like a real US user
const context = await browser.newContext({
    locale:    'en-US',
    timezoneId: 'America/New_York',
    viewport:  { width: 1280, height: 800 },
});

const page = await context.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.textContent('body'));

await browser.close();