이 Playwright Stealth 튜토리얼에서는 다음을 다룹니다:
- 봇 탐지가 무엇이며 Playwright에 문제가 되는 이유.
- Playwright Stealth란 무엇인가.
- 차단되지 않도록 Python과 JavaScript에서 사용하는 방법.
자, 시작해 보겠습니다!
Playwright의 가장 큰 한계인 봇 탐지
Playwright는 브라우저 자동화를 위한 가장 인기 있는 Python 라이브러리 중 하나입니다. 구체적으로, Microsoft가 직접 개발 및 유지 관리하기 때문에 신뢰할 수 있고 널리 사용됩니다. 고수준의 직관적인 API 덕분에 다양한 프로그래밍 언어로 헤드리스 또는 헤드드 브라우저를 쉽게 제어할 수 있습니다. 즉, Playwright는 크로스 브라우저 및 크로스 플랫폼 봇 개발, 자동화된 테스트, 웹 스크래핑에 탁월한 도구입니다.
Playwright는 브라우저 자동화를 위한 가장 인기 있는 Python 라이브러리 중 하나입니다. 구체적으로, Microsoft가 직접 개발하고 유지 관리하기 때문에 신뢰할 수 있고 널리 사용됩니다. 고수준의 직관적인 API 덕분에 다양한 프로그래밍 언어로 헤드리스 또는 헤드드 브라우저를 쉽게 제어할 수 있습니다. 이는 Playwright가 크로스 브라우저 및 크로스 플랫폼 봇 개발, 자동화 테스트, 웹 스크래핑에 탁월한 도구임을 의미합니다.
이 라이브러리의 주요 문제점은 특히 헤드리스 모드에서 브라우저를 사용할 때 봇 방지 기술에 쉽게 탐지되어 차단될 수 있다는 점입니다. 어떻게 가능한 걸까요? Playwright는 헤드리스 브라우저를 제어할 때 특수 속성과 헤더의 값을 자동으로 변경합니다. 예를 들어, navigator.webdriver Chrome 설정을 true로 설정합니다.
봇 탐지 솔루션은 이러한 설정들을 인지하고 분석하여 현재 사용자가 인간인지 봇인지 확인합니다. 이러한 메커니즘이 의심스러운 설정을 감지하면 사용자를 봇으로 분류하고 즉시 차단합니다.
헤드리스 모드용 봇 탐지 테스트를 예로 들어 보겠습니다. 브라우저에서 해당 페이지를 방문하면 다음과 같은 결과를 확인할 수 있습니다:

완벽합니다! 바로 예상했던 결과입니다!
이제 Playwright vanilla에서 동일한 페이지를 방문하고 페이지에서 답을 추출해 보세요:
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
# 브라우저 실행
browser = await p.chromium.launch()
# 새 페이지 열기
page = await browser.new_page()
# 대상 페이지 방문
await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")
# 페이지에 포함된 답변 추출
answer_element = page.locator("#res")
answer = await answer_element.text_content()
# 결과 답변 출력
print(f'결과는: "{answer}"')
# 브라우저 닫기 및 리소스 해제
await browser.close()
asyncio.run(main())
Python 프로그램을 실행하면 다음과 같이 출력됩니다:
결과는: "You are Chrome headless"
이는 봇 자동화 테스트 페이지가 자동화된 스크립트의 요청을 헤드리스 브라우저에서 온 것으로 감지했음을 의미합니다.
다시 말해, Playwright는 봇 탐지 기술에 의해 쉽게 차단될 수 있는 제한적인 도구입니다. 이를 피하려면 기본 설정을 수동으로 재정의하고 성공을 기대할 수 있습니다. 그렇지 않다면 Playwright Stealth 플러그인을 설치하세요!
Playwright Stealth 플러그인: 정의와 작동 방식
playwright-stealth는 봇 탐지를 피하기 위해 특정 설정을 재정의하여 Playwright를 확장하는 Python 패키지입니다. Playwright Stealth는 내장된 회피 모듈을 사용하여 정보 유출을 방지하고 자동화된 브라우저를 봇으로 노출시키는 속성을 변경하는 npm 패키지인 puppeteer-extra-plugin-stealth의 포팅 버전입니다. 예를 들어, navigator.webdriver 속성을 삭제하고 Chrome이 헤드리스 모드에서 기본적으로 설정하는 User-Agent 헤더에서 “HeadlessChrome”을 제거합니다.
Stealth 플러그인의 목표는 자동화된 헤드리스 브라우저 인스턴스가 sannysoft.com의 모든 봇 탐지 테스트를 성공적으로 통과하도록 하는 것입니다. 작성 시점 기준 이 목표는 달성되었습니다. 그러나 공식 문서에서 언급된 바와 같이 헤드리스 브라우저를 탐지하는 방법은 여전히 존재합니다. 따라서 오늘 작동하는 것이 내일도 작동한다는 보장은 없습니다. 모든 봇 탐지 메커니즘을 우회하는 것은 완전히 달성 가능한 목표는 아니지만, 이 라이브러리는 이 과정을 최대한 어렵게 만드는 것을 목표로 합니다.
봇 탐지를 피하기 위한 Playwright Stealth 사용 방법
차단되지 않도록 Playwright Python 스크립트에 Playwright Stealth를 통합하는 방법을 알아보려면 아래 단계를 따르세요.
1단계: Playwright Python 프로젝트 설정
참고: 이미 Playwright Python 프로젝트가 구축된 경우 이 단계를 건너뛸 수 있습니다.
먼저, 컴퓨터에 Python 3이 설치되어 있는지 확인하십시오. 설치되어 있지 않다면 설치 프로그램을 다운로드하여 실행하고 설치 마법사를 따르십시오.
다음으로 아래 명령어를 사용하여 playwright-demo라는 Python 프로젝트를 설정하세요:
mkdir playwright-demo
cd playwright-demo
이 명령어는 playwright-demo 폴더를 생성하고 터미널에서 해당 폴더로 이동합니다.
Python 가상 환경을 초기화하고 활성화합니다:
python -m venv env
env/Scripts/activate
다음 명령어를 실행하여 Playwright를 설치합니다:
pip install playwright
시간이 다소 소요될 수 있으니 기다려 주세요.
그 후 필요한 브라우저를 설치합니다:
playwright install
선택한 Python IDE에서 프로젝트 폴더를 열고 index.py 파일을 생성하세요. 다음 줄로 초기화합니다:
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
# 브라우저 자동화 로직...
await browser.close()
asyncio.run(main())
위 스크립트는 헤드리스 모드로 크로미움 인스턴스를 실행하고 새 페이지를 연 후 브라우저를 닫습니다. 이것이 기본적인 Playwright Python 스크립트의 모습입니다.
실행하려면 다음을 실행하세요:
python index.py
이제 Stealth 플러그인으로 확장할 준비가 된 Playwright 프로젝트가 완성되었습니다!
2단계: Stealth 플러그인 설치 및 사용
다음 명령어로 Playwright Stealth 플러그인을 설치하세요:
pip install playwright-stealth
index.py 파일을 열고 Playwright 스크립트에 아래 import 문장을 추가하세요:
from playwright_stealth import stealth_async
또는 sync API를 사용하는 경우:
from playwright_stealth import stealth_sync
Playwright에 등록하려면 페이지 객체를 다음과 같이 임포트된 함수에 전달하세요:
await stealth_async(page)
또는 동기식 API를 사용하는 경우:
stealth_async(page)
stealth_async() 함수는 봇 탐지를 피하기 위해 일부 기본 설정을 재정의하여 페이지를 확장합니다.
훌륭합니다! 이제 대상 페이지를 방문하고 테스트를 반복하기만 하면 됩니다.
3단계: 통합하기
본문 초반에 소개된 Playwright 스크립트에 Stealth 플러그인을 통합합니다:
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
async def main():
async with async_playwright() as p:
# 브라우저 실행
browser = await p.chromium.launch()
# 새 페이지 열기
page = await browser.new_page()
# Playwright Stealth 플러그인 등록
await stealth_async(page)
# 대상 페이지 방문
await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")
# 페이지에 포함된 메시지 추출
message_element = page.locator("#res")
message = await message_element.text_content()
# 결과 메시지 출력
print(f'결과는: "{message}"')
# 브라우저 닫기 및 리소스 해제
await browser.close()
asyncio.run(main())
다시 실행하면 이번에는 다음과 같이 출력됩니다:
결과는: "You are not Chrome headless"
자, 이제 보세요! 봇 탐지 기능을 갖춘 대상 페이지가 더 이상 Playwright 자동화 스크립트를 봇으로 표시하지 못합니다.
잘하셨습니다! 이제 Playwright 스텔스 기술을 완벽히 숙달하셨으며, 어떤 봇 탐지 기술도 더 이상 당신을 위협할 수 없습니다.
추가: JavaScript에서의 Playwright 스텔스
Playwright JavaScript 사용자로 동일한 결과를 얻으려면 puppeteer-extra-plugin-stealth npm 패키지를 사용해야 합니다. 이 패키지는 Puppeteer Extra 와 Playwright Extra 모두에서 작동합니다. 해당 프로젝트에 익숙하지 않다면, 이들은 기본적으로 두 브라우저 자동화 라이브러리의 향상된 버전입니다. 구체적으로, 각각 Puppeteer와 Playwright에 플러그인을 통해 확장 기능을 추가합니다.
따라서 다음과 같은 Playwright JavaScript 스크립트를 가지고 있고 이를 Stealth 플러그인과 통합하고 싶다면:
import { chromium } from "playwright"
(async () => {
// 브라우저 설정 및 실행
const browser = await chromium.launch()
// 새 빈 페이지 열기
const page = await browser.newPage()
// 대상 페이지로 이동
await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")
// 페이지에 포함된 메시지 추출
const messageElement = page.locator('#res')
const message = await messageElement.textContent()
// 결과 메시지 출력
console.log(`결과는: "${message}"`)
// 브라우저 닫기 및 리소스 해제
await browser.close()
})()
먼저 playwright-extra 와 puppeteer-extra-plugin-stealth를 설치합니다:
npm install playwright-extra puppeteer-extra-plugin-stealth
다음으로, playwright 대신 playwright-extra 에서 chromium을 임포트하고 puppeteer-extra-plugin-stealth에서 StealthPlugin을 임포트합니다:
import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"
그런 다음 Stealth 플러그인을 다음과 같이 등록합니다:
chromium.use(StealthPlugin())
모든 것을 합치면 다음과 같습니다:
import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"
(async () => {
// Stealth 플러그인 구성
chromium.use(StealthPlugin())
// 브라우저 설정 및 실행
const browser = await chromium.launch()
// 새 빈 페이지 열기
const page = await browser.newPage()
// 대상 페이지로 이동
await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")
// 페이지에 포함된 메시지 추출
const messageElement = page.locator('#res')
const message = await messageElement.textContent()
// 결과 메시지 출력
console.log(`결과는: "${message}"`)
// 브라우저 닫기 및 리소스 해제
await browser.close()
})()
대단하네요! 방금 JavaScript로 Playwright에 Stealth 플러그인을 통합했습니다.
결론
이 가이드에서는 Playwright에서 봇 탐지가 문제가 되는 이유와 해결 방법을 이해하셨습니다. Python 라이브러리인 Playwright Stealth를 사용하면 기본 브라우저 설정을 개선하여 봇 탐지를 우회할 수 있습니다. 여기서 입증된 바와 같이, 유사한 접근 방식은 JavaScript에서도 적용 가능합니다.
Playwright에서 작성한 브라우저 자동화 스크립트가 아무리 정교해도, 고급 봇 탐지 시스템은 여전히 문제로 남을 것입니다. 다른 브라우저 자동화 패키지 사용을 고려할 수도 있지만, 탐지의 근본 원인은 라이브러리 자체가 아닌 브라우저 자체에 있습니다. 해결책은 모든 브라우저 자동화 라이브러리와 원활하게 통합되는 확장 가능한 브라우저에 있으며, 봇 탐지를 우회하는 기능을 갖추고 있어야 합니다. 바로 Scraping Browser가 그런 브라우저입니다!
Bright Data의 Scraping Browser는 Playwright, Puppeteer, Selenium과 호환되는 고도로 확장 가능한 클라우드 기반 브라우저입니다. 요청마다 출구 IP를 자동으로 회전시키며, 브라우저 지문 인식, 자동 재시도, CAPTCHA 해결을 처리해 줍니다. 이러한 기능은 프록시 기반 잠금 해제 기능을 통해 가능해집니다.
Bright Data의 프록시는 포춘 500대 기업 및 20,000명 이상의 고객이 사용합니다. 이 신뢰할 수 있는 글로벌 프록시 네트워크는 다음과 같습니다: