문제: 전통적인 크롤러는 죽었고, AI 시대에는 새로운 패러다임이 필요하다

멋진 크롤러 스크립트를 작성했는데 다음 날 웹사이트가 개편되어 모두 작동하지 않습니다. 선택기를 수정했는데 일주일 후 CDN 경로가 바뀌어 또 작동하지 않습니다. 예외 처리를 추가했지만 캡차가 나타나 완전히 멈춰 버립니다.

전통적인 웹 자동화에는 세 가지 치명적인 약점이 있습니다:

  1. 취약성 — 페이지 구조가 조금만 바뀌어도 스크립트가 모두 중단됩니다
  2. 정적성 — 예측된 흐름만 실행할 수 있고 예상치 못한 상황에 대응할 수 없습니다
  3. 수동성 — 캡차, 팝업, 로딩 실패에 막히면 속수무책입니다

인간처럼 웹을 탐색하는 자동화 방식이 필요합니다 — 페이지를 보고 의도를 이해하고 스스로 복구할 수 있는 방식입니다.

Browser Harness란 무엇인가?

Browser Harness자가 치유형 브라우저 제어 프레임워크로, LLM(대규모 언어 모델)이 인간처럼 자율적으로 모든 웹 작업을 완료할 수 있게 합니다.

  • GitHub에서 11,251+ Stars
  • 1,019+ Forks
  • Python으로 작성
  • PlaywrightSelenium 지원
  • browser-use 팀이 유지 관리

핵심 슬로건: “Self-healing harness that enables LLMs to complete any task.”

핵심 기능

1. 자가 치유(Self-Healing)

전통적인 자동화:

# 취약한 선택기, 페이지가 변경되면 작동하지 않음
button = driver.find_element(By.CSS_SELECTOR, "#submit-btn")
button.click()

Browser Harness:

# LLM이 페이지 의미를 이해하고 올바른 버튼을 자동으로 찾음
# ID가 변경되어도 맥락을 통해 이해 가능
result = harness.execute("제출 버튼 클릭")
# 버튼을 찾을 수 없으면 LLM이 페이지를 분석하고 대안을 제시

자가 치유 메커니즘:

  • 작업 실패 → 스크린샷 분석 → LLM 진단 → 새 전략 생성 → 재시도
  • 성공하거나 완료할 수 없음을 확인할 때까지 반복

2. 의미론적 이해(Semantic Understanding)

Browser Harness는 CSS 선택기에 의존하지 않고 LLM이 페이지 콘텐츠를 이해하도록 합니다:

# LLM에 목표를 알려주고 단계는 알려주지 않음
harness.execute("Amazon에서 무선 이어폰을 검색하고, 평점순으로 정렬한 후 첫 번째 결과를 장바구니에 담아줘")

# LLM이 자동으로:
# 1. 검색 상자 찾기
# 2. "wireless headphones" 입력
# 3. 정렬 드롭다운 메뉴 찾기
# 4. "Customer Reviews" 선택
# 5. 첫 번째 상품 찾기
# 6. "Add to Cart" 클릭

3. 다단계 작업 계획

from browser_harness import Harness

harness = Harness(model="gpt-4o")

# 복잡한 다단계 작업
task = """
다음 주 수요일 베이징에서 상하이로 가는 항공권을 예약해줘,
요구사항:
- 오전 출발
- 가격 1000위안 미만
- 중국동방항공 또는 중국국제항공
- 수하물 불필요
"""

result = harness.execute(task)
# LLM이 단계를 계획:
# 1. Ctrip/Qu哪儿 열기
# 2. 편도 선택
# 3. 베이징 → 상하이 입력
# 4. 다음 주 수요일 날짜 선택
# 5. 오전 항공편 필터링
# 6. 가격순 정렬
# 7. 중국동방항공/중국국제항공 필터링
# 8. 수하물 없는 운임 선택
# 9. 승객 정보 입력
# 10. 주문 제출

4. 시각적 인식(Visual Perception)

Browser Harness는 LLM에 페이지 스크린샷을 보내 웹페이지를 “보게” 합니다:

# 스크린샷 분석
screenshot = harness.screenshot()
analysis = harness.llm.analyze_image(screenshot, 
    "이 페이지에 어떤 양식이 있나요? 각 입력 상자의 레이블과 유형을 설명해주세요")

# LLM 반환:
# "페이지에 로그인 양식이 있습니다:
#  - 사용자 이름 입력 상자(type=text)
#  - 비밀번호 입력 상자(type=password)
#  - 나를 기억하기 체크박스
#  - 로그인 버튼"

5. 기존 도구와의 비교

기능Browser HarnessPlaywrightSeleniumScrapy
자가 치유✅ 자동 복구❌ 수동 유지보수❌ 수동 유지보수❌ 수동 유지보수
의미론적 이해✅ LLM 기반❌ 선택기❌ 선택기❌ XPath
다단계 계획✅ 자동 계획⚠️ 코딩 필요⚠️ 코딩 필요⚠️ 코딩 필요
캡차 처리✅ LLM으로 해결❌ 타사 필요❌ 타사 필요❌ 타사 필요
동적 콘텐츠✅ 자동 대기⚠️ 구성 필요⚠️ 구성 필요⚠️ 구성 필요
학습 곡선낮음(자연어)중간중간높음

아키텍처 설계

Browser Harness
├── LLM Core (GPT-4o / Claude / Local LLM)
├── Browser Controller (Playwright / Selenium)
├── Self-Healing Engine
│   ├── Error Detection
│   ├── Screenshot Analysis
│   ├── Strategy Regeneration
│   └── Retry Logic
├── Task Planner
│   ├── Goal Decomposition
│   ├── Step Sequencing
│   └── Dependency Resolution
└── Safety Guardrails
    ├── URL Whitelist
    ├── Action Limits
    └── Human-in-the-Loop

설치 및 사용

설치

pip install browser-harness

# 브라우저 의존성 설치
playwright install

기본 사용법

from browser_harness import Harness

# 초기화
harness = Harness(
    model="gpt-4o",  # 또는 "claude-3-5-sonnet"
    browser="chromium",
    headless=False   # 디버깅을 위해 가시 모드
)

# 간단한 작업 실행
result = harness.execute("Google을 열어 'Python tutorial' 검색")

# 복잡한 작업 실행
task = """
1. github.com 방문
2. 'browser-use/browser-harness' 검색
3. Star 버튼 클릭
4. star 수 반환
"""
result = harness.execute(task)
print(result)  # "현재 Stars: 11251"

고급 구성

from browser_harness import Harness, Config

config = Config(
    max_retries=3,           # 최대 재시도 횟수
    retry_delay=2,           # 재시도 간격(초)
    screenshot_on_error=True, # 오류 시 스크린샷
    human_in_the_loop=True,   # 중요 작업은 사람 확인
    url_whitelist=[           # URL 화이트리스트
        "*.github.com",
        "*.google.com"
    ]
)

harness = Harness(model="gpt-4o", config=config)

실제 응용 시나리오

시나리오 1: 자동화 테스트

# LLM이 웹사이트를 테스트하도록 하기
test_cases = [
    "새 사용자를 등록하고 확인 이메일을 수신했는지 검증",
    "상품을 장바구니에 추가하고 총액 계산이 정확한지 확인",
    "필수 항목을 비워두고 양식을 제출하면 오류 메시지가 표시되는지 검증"
]

for test in test_cases:
    result = harness.execute(test)
    assert result.success, f"테스트 실패: {test}"

시나리오 2: 데이터 수집

# 지능형 크롤러, 웹사이트 변경에 자동 적응
data = harness.execute("""
example.com/products를 방문하여
모든 제품의 다음 정보를 추출:
- 이름
- 가격
- 평점
- 재고 상태
JSON으로 저장
""")

시나리오 3: 업무 자동화

# 일상적인 웹 작업 자동 처리
harness.execute("""
1. 회사 비용 처리 시스템에 로그인
2. 지난달 출장 비용 신청서 제출
3. 영수증 PDF 업로드
4. 승인자 입력
5. 신청 제출
""")

시나리오 4: 경쟁사 모니터링

# 매일 경쟁사 가격 확인
harness.execute("""
amazon.com을 방문하여 우리 핵심 제품 키워드를 검색하고,
상위 10개 결과의 가격과 평점을 기록하고,
비교 보고서를 생성
""")

유사 프로젝트 비교

프로젝트Stars특징적용 시나리오
Browser Harness11K+자가 치유, LLM 기반일반 웹 작업
Playwright66K+고성능, 다중 브라우저자동화 테스트
Selenium30K+성숙하고 안정적전통적 자동화
Scrapy52K+대규모 크롤링데이터 수집
Crawl4AI8K+AI 크롤러콘텐츠 추출

한계

  • 비용 — LLM API 호출에 비용이 발생합니다(로컬 모델 사용 가능)
  • 속도 — 전통적인 자동화보다 느립니다(생각하는 데 시간이 필요)
  • 보안 — 오동작을 방지하기 위해 엄격한 보안 정책이 필요합니다
  • 복잡한 캡차 — 일부 캡차는 여전히 사람의 개입이 필요합니다

결론

Browser Harness는 웹 자동화의 새로운 패러다임을 대표합니다 — “하드코딩된 선택기"에서 “이해하는 에이전트"로.

  • 자가 치유 기능으로 유지보수 비용을 크게 절감합니다
  • 자연어 인터페이스로 사용 문턱을 낮춥니다
  • LLM의 추론 능력으로 복잡한 흐름을 처리합니다
  • 시각적 인식으로 전통적 자동화의 사각지대를 해결합니다

매주 충돌하는 크롤러 스크립트를 수정하는 것에 지쳤다면 Browser Harness를 시도해 볼 가치가 있습니다.

GitHub: browser-use/browser-harness
Stars: 11,251+ | 언어: Python | 라이선스: 오픈소스

관련 기사