Playwright 프록시 통합: 브라우저, 컨텍스트 및 회전
Playwright는 인증된 프록시가 원활하게 작동하는 유일한 주요 브라우저 프레임워크입니다 — 자격 증명이 일급 구성 요소입니다. 레버리지는 컨텍스트에 있습니다: 하나의 브라우저, 작업별로 다른 종료 IP. 여기에 전체 패턴이 있습니다.
Playwright는 인증된 프록시가 일급 시민인 유일한 주요 브라우저 자동화 프레임워크입니다: 사용자 이름과 비밀번호가 명확한 구성 필드로, 확장 해킹, 인증 대화 상자, 래퍼 라이브러리가 필요 없습니다. 이는 기본 Playwright 프록시 설정을 Node 또는 Python에서 다섯 줄로 처리할 수 있게 합니다. 진정한 레버리지는 한 단계 더 깊이 있습니다 — 컨텍스트별 프록시는 단일 브라우저 프로세스에서 여러 개의 격리된 세션을 실행할 수 있게 하며, 각 세션은 자체 종료 IP를 가집니다. 이는 어떤 프레임워크에서도 가장 저렴한 회전 아키텍처입니다. 이 가이드는 두 계층, SOCKS5 및 localhost 문제, 프록시가 대역폭 요금에 미치는 영향, 스텔스가 실제로 끝나는 지점을 다룹니다.
브라우저 시작 시 Playwright 프록시
launch()에 proxy 객체를 전달하면 브라우저의 모든 페이지가 이를 통해 라우팅됩니다. 형태를 주목하세요: 서버 URL은 자격 증명을 포함하지 않으며 — 자격 증명은 별도의 username 및 password 필드에 입력됩니다. 이는 Playwright가 Selenium과 Puppeteer를 괴롭히는 인증 팝업 문제를 피하는 방법입니다:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.textContent('body')); // proxy exit IP
await browser.close();
})();
Python API도 정확히 이를 반영합니다:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER",
"password": "PASS",
})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body"))
browser.close()
자격 증명이 표준 http://user:pass@host:port 문자열에 포함되어 있다면, 문자열 조작 대신 URL 클래스(new URL()는 Node에서, urllib.parse는 Python에서)를 사용하여 분할하세요 — 특수 문자가 포함된 비밀번호도 이 방법으로 안전합니다. 테스트 실행기 주의 사항: playwright.config.ts의 use.proxy는 테스트를 다루지만, 혼합 설정에서 구성 수준의 프록시 설정이 무시된다는 오래된 보고가 있으므로 스크래핑 스크립트에서는 항상 launch() 또는 컨텍스트에서 직접 프록시를 설정하세요.
컨텍스트별 프록시: 새로운 브라우저 없이 회전
BrowserContext는 브라우저 내의 격리된 브라우저입니다: 별도의 쿠키, 저장소 및 캐시를 가지며, 프로세스만 공유합니다. 컨텍스트는 자체 proxy 옵션을 수용하며, 하나를 생성하는 데 몇 밀리초가 걸리는 반면 전체 시작에는 몇 초가 걸립니다 — 따라서 회전 패턴은 하나의 브라우저, 작업별 컨텍스트입니다:
const { chromium } = require('playwright');
const PROXY = {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
};
(async () => {
const browser = await chromium.launch();
const urls = ['https://example.com/a', 'https://example.com/b'];
for (const url of urls) {
const context = await browser.newContext({ proxy: PROXY });
const page = await context.newPage();
try {
await page.goto(url, { timeout: 30000 });
// ...extract...
} finally {
await context.close(); // frees cookies, cache, session
}
}
await browser.close();
})();
회전 게이트웨이에 지정되면, 모든 컨텍스트는 90M+ 주거용 풀에서 다른 IP로 종료되며, 목록 관리는 필요 없습니다 — 이는 서버 측에서 회전 프록시가 수행하는 작업입니다. 작업이 여러 페이지에 걸쳐 동일한 IP를 필요로 할 때(로그인 및 결제 포함), 사용자 이름 매개변수를 통해 고정 세션을 요청하면 세션 창 동안 종료가 유지됩니다. 컨텍스트는 실패도 격리합니다: 차단된 종료는 전체 브라우저를 오염시키는 대신 컨텍스트와 함께 종료됩니다.
같은 패턴은 무료로 지리적 타겟팅을 제공합니다. 프록시가 컨텍스트 옵션이기 때문에, 하나의 브라우저는 미국 컨텍스트, 독일 컨텍스트 및 일본 컨텍스트를 동시에 가질 수 있으며 — 각 컨텍스트는 로컬 종료 IP에서 로컬화된 가격, 검색 결과 및 동의 배너를 볼 수 있습니다. 가격 비교 및 광고 검증 작업의 경우, 이는 세 개의 클라우드 지역을 세 줄의 구성으로 대체합니다.

SOCKS5, 우회 규칙 및 localhost 함정
- SOCKS5는 작동하지만, SOCKS 인증은 작동하지 않습니다. Chromium은 SOCKS 자격 증명 지원이 없으므로,
server: 'socks5://...'는 인증되지 않은 엔드포인트에만 연결됩니다. 인증된 SOCKS5 프록시의 경우, 동일한 게이트웨이의 HTTP 포트로 전환하거나 기계의 IP를 화이트리스트에 추가하여 자격 증명이 필요 없도록 하세요. - 호스트 우회는
bypass: '*.internal.example.com, localhost'로 설정하세요 — 해당 호스트로의 트래픽은 직접 전송됩니다. 스크립트가 프록시를 통과해서는 안 되는 내부 서비스와도 통신할 때 유용합니다. - Localhost는 특별합니다. Chromium은 기본적으로 루프백 주소에 대해 프록시를 건너뛰므로, 로컬 모의 서버에 대한 테스트는 프록시를 '무시'하는 것처럼 보입니다. 이는 브라우저의 문제이지 Playwright의 문제가 아닙니다 — 대신 httpbin.org/ip와 같은 외부 엔드포인트에 대해 테스트하세요.
- 프록시 '작동하지 않음' 체크리스트: 필드에 자격 증명(서버 URL이 아님), 서버 값에 스킴이 있는지 확인하고, 대상 사이트를 비난하기 전에 IP 에코 페이지를 로드하여 종료를 확인하세요.
확장하기 전에 대역폭을 절감하세요
렌더링 브라우저는 모든 것을 다운로드합니다 — 이미지, 글꼴, 분석, 광고 스크립트 — 그리고 측정된 주거용 트래픽을 통해 모든 비용을 지불합니다. 비필수 리소스 유형을 차단하면 페이지당 전송량을 절반 이상 줄일 수 있으며, Playwright의 라우팅은 컨텍스트에서 이를 한 줄로 처리할 수 있습니다. 더 많은 패턴은 프록시 대역폭 비용 절감에 대한 가이드에서 확인하세요:
await context.route('**/*', (route) => {
const type = route.request().resourceType();
if (type === 'image' || type === 'font' || type === 'media') {
return route.abort();
}
return route.continue();
});
가정하지 말고 효과를 측정하세요: 컨텍스트의 응답 이벤트를 구독하고, 경로가 있는 페이지와 없는 페이지의 샘플에 대한 전송 크기를 합산하면 실제 페이지당 GB 비용을 얻을 수 있습니다 — 이는 백만 페이지 크롤링이 반올림 오류인지 예산 항목인지 결정하는 숫자입니다.
스텔스 한계: 프록시로 해결할 수 없는 것
한계를 솔직하게 인정하세요. 주거용 종료는 IP 평판을 해결합니다 — 첫 번째이자 가장 큰 필터 — 하지만 Playwright는 여전히 네트워크 계층 위에 자동화 흔적을 남깁니다: 헤드리스 렌더링의 특이점, CDP 아티팩트, 그리고 안티봇 벤더가 직접 탐색하는 지문 표면. 스텔스 플러그인은 일부 신호를 패치하고 다른 신호에서는 탐지 업데이트에 뒤처집니다; 이는 설정이 아닌 상속받는 무기 경쟁입니다. 실용적인 분할: Playwright를 주거용 프록시를 통해 일반 사이트의 긴 꼬리를 실행하고, 진정으로 적대적인 도메인은 Scraper API를 통해 라우팅하여 지문, 렌더링 및 재시도를 관리하고 HTML, markdown 또는 구조화된 JSON을 반환합니다. Playwright 코드는 고유하게 잘하는 상호작용 흐름을 계속 수행하며, 가져오기 및 파싱 작업은 API로 이동합니다. 같은 계산은 Puppeteer와 Selenium에도 적용됩니다; 어떤 프레임워크 전환도 지문 문제를 해결하지 않습니다.

자주 묻는 질문
Playwright Python에서 프록시를 어떻게 설정하나요?
launch()에 프록시 dict를 전달하세요: p.chromium.launch(proxy={"server": "http://host:port", "username": "USER", "password": "PASS"}). 같은 dict는 browser.new_context()에서 컨텍스트별 라우팅에 사용됩니다. 자격 증명은 항상 별도의 필드에 입력하고, 서버 URL 내부에 넣지 마세요.
Playwright는 컨텍스트별로 다른 프록시를 사용할 수 있나요?
네 — 각 newContext() 호출에 proxy 옵션을 전달하세요. 컨텍스트는 브라우저 프로세스를 제외하고 아무것도 공유하지 않으므로, 다른 프록시를 가진 두 컨텍스트는 대상 사이트에 두 개의 관련 없는 브라우저처럼 작동합니다. 이것이 표준 회전 패턴입니다: 하나의 시작, 그런 다음 작업별 또는 정체성별로 새로운 컨텍스트.
Playwright는 SOCKS5 프록시 인증을 지원하나요?
아니요. Playwright는 SOCKS5를 브라우저에 전달하며, Chromium에는 SOCKS 자격 증명에 대한 메커니즘이 없으므로 인증된 SOCKS5 엔드포인트는 실패합니다. 동일한 프록시 게이트웨이의 HTTP(S) 포트를 사용하여 사용자 이름과 비밀번호 필드를 사용하거나 IP 화이트리스트로 인증하세요.
Playwright 프록시의 올바른 형식은 무엇인가요?
server 필드(scheme://host:port — http, https 또는 socks5)와 선택적 username, password, bypass 필드가 있는 객체입니다. 자격 증명을 서버 URL 내부에 넣지 마세요; Playwright는 이를 별도로 기대하며, 특수 문자가 포함된 비밀번호는 전용 필드에서만 안전합니다.
왜 내 Playwright 프록시가 localhost에서 작동하지 않나요?
Chromium은 기본적으로 루프백 주소에 대해 프록시를 건너뛰므로, localhost 또는 127.0.0.1에 대한 요청은 직접 전송되어 구성 설정을 무시하는 것처럼 보입니다. 외부 URL(httpbin.org/ip 등)에 대해 프록시를 확인하세요. 테스트 설정에서는 구성 파일 옵션에 의존하기보다는 launch()에서 프록시를 설정하는 것을 선호하세요.
Playwright의 프록시 이야기는 생태계에서 가장 깔끔합니다: 구성으로서의 자격 증명, 회전 단위로서의 컨텍스트, 대역폭 밸브로서의 라우팅. 그 아래의 IP 품질을 올바르게 설정하면 프레임워크는 배경으로 사라집니다 — 이는 좋은 인프라가 해야 할 바로 그것입니다.