Puppeteer & Playwright
Inicie navegadores headless pelo RaxyProxy com Puppeteer ou 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 com 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 com 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 impressões digitais do navegador
O proxy sozinho não é suficiente
Sites com detecção avançada de bots verificam impressões digitais do navegador além do endereço IP: fuso horário, WebGL, Canvas, fontes e propriedades do navigator. Usar um proxy residencial melhora sua reputação de IP, mas pode ser necessário também configurar o fuso horário e o idioma do navegador para corresponder ao seu país alvo.
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();