Why Headless Browsers Need Proxies
Headless tarayıcılar - görünür bir GUI olmadan çalışan tarayıcı örnekleri - JavaScript-heavy weblerini kazımak için önemlidir. Bununla birlikte, tek bir IP adresinden birden fazla başsız tarayıcı seansı çalıştırın belirgin bir otomasyon sinyalidir. Başsız tarayıcıları rotasyonla birleştirerek bunu binlerce konut IP'leri dağıtarak çözer.
Bu kılavuz, Puppeteer ve Playwright proxy konfigürasyonunu, çalma eklentilerini ve rotasyon stratejilerini kapsar. Tespit nasıl işlediğine dair arka plan için, algılamanın nasıl çalıştığını görün Anti-bot algılama sistemlerine kılavuzluk.
Puppeteer Proxy Build
Temel Kurulum
// 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();
Courtyard5 ile 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'
});
Puppeteer Stealth Plugin
Varsayılan Puppeteer konfigürasyonu, anti-bot sistemlerinin tespit ettiği düzinelerce otomasyon işaretini ortaya koyuyor. The The The The The The The The puppeteer-extra-plugin-stealth Eklentiler bu işaretler otomatik olarak.
// 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');
Stealth eklentisi:
navigator.webdriver- gerçek yerine tanımlanmamış olarak ayarlayınchrome.runtime- eksik Chrome-özel nesneler ekleyin- WebGL satıcı/renderer – gerçekçi GPU dizeleri
- Plugin ve izin dizileri – gerçek Chrome
- Dil ve platform tutarlılığı
Bu yamaların adresinin ne hakkında daha derin bir anlayış için makalemizi bakınız tarayıcı parmak izi.
Playwright Proxy Ayarları
Playwright, Puppeteer'den daha zarif proxy yapılandırmasını sağlar, per-context proxy'leri destekler ve yerleşik cihaz emulation.
Temel Kurulum
// 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();
Per-Context Proxy (Different IPs per Tab)
// 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');
Proxy with 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');
Headless Browsers ile Proxy Rotation
Strateji 1: İstek başına Yeni Context
Her URL için yeni bir tarayıcı bağlamı oluşturun. Bu, istek başına taze bir IP ve temiz bir kurabiye verir.
// 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;
}
Strateji 2: Multi-Page Flows için Sticky Sessions
Aynı IP'yi birden çok sayfada tutmanız gerektiğinde yapışkan seanslar kullanın (pagination, login flows).
// 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;
}
Strateji 3: Pool ile avcılık
// 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;
}
Python ile Puppeteer (Pyppeteer Alternative)
Python geliştiricileri için, playwright Python için aynı yetenekleri daha temiz sözcülerle sağlar.
# 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())
Kaynak Optimizasyonu
Headless tarayıcılar önemli hafıza ve CPU tüketiyor. Üretim iş yükleri için optimize edin:
Gereksiz Kaynaklar
// 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');
Memory Management
- Kullanıldıktan sonra yakın bağlamlar: Her açık bağlam 50-150MB tüketiyor. Her zaman yapıldığında yakın bağlamlar.
- Limit eşzamanlı bağlamlar: Mevcut RAM'a göre 3-10 bağlamı tutun.
- Yeniden başlatma tarayıcı periyodik olarak: 100-200 bağlam döngüsünden sonra, hafıza sızıntılarını önlemek için tarayıcıyı yeniden başlatın.
- Başsız kullanın: 'yeni' (Puppeteer): Yeni kafasız mod eskisinden daha az hafıza kullanır.
Common Issues
Proxy Authentication Başarısızlıkları
// 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');
}
}
Timeout
// 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));
}
}
}
En İyi Uygulamalar Checklist
| Uygulama Uygulaması | Puppeteer | Playwright |
|---|---|---|
| Per-context proxy | Via start args sadece | Per-context proxy desteği |
| Stealth yamalar | puppeteer-extra | yerleşik cihaz emulation |
| Kaynak bloke edici | Sayfa.setRequestInterception | Sayfa.route |
| Multi-Message | Kromyum sadece | Kromium, Firefox, WebKit |
| Oturum izolasyonu | Oturumda Yeni tarayıcı | Oturumda Yeni bağlam |
Çoğu hurda görevi için, Playwright, üstün proxy desteği nedeniyle Puppeteer üzerinde önerilen bir seçimdir (per-context), yerleşik cihaz emulation ve çok sayıda tarayıcı desteği. Onu bir araya getirin ProxyHat'ın konut temsilcileri En iyi sonuçlar için.
Dile özel proxy kurulumu için kafasız tarayıcılar olmadan, rehberlerimizi göz önünde bulundurun Python Python, HayırVe Go Go Go Go. Kapsamlı anti-deteksiyon stratejileri için, okuyun algılama kılavuzuHer zaman etik kazı uygulamaları takip edin ve saygı web sitesi erişim politikaları.






