새소식

300x250
AI/Python

Browser Use 사용 방법 : LLM으로 브라우저 제어하기 - AI 브라우저 자동화 비교 분석 vs Selenium

  • -
728x90

안녕하세요! 갓대희 입니다.

"AI에게 웹 브라우저를 쥐어주면 어떤 일이 벌어질까?"
오늘은 AI 브라우저 자동화 분야에서 가장 핫한 오픈소스 프로젝트, Browser Use에 대해 알아보려고 한다. GitHub에서 77,000개 이상의 stars를 받으며 폭발적인 인기를 얻고 있는 이 라이브러리는, AI 에이전트가 마치 사람처럼 웹사이트를 탐색하고 작업을 수행할 수 있게 해준다.

 

오늘의 한 줄 요약
Browser Use는 자연어 명령만으로 웹 브라우저를 자동화할 수 있게 해주는 AI 에이전트 프레임워크다.
Browser Use는 "We ship every day"를 모토로 빠르게 업데이트되므로, 최신 정보는 공식 GitHub에서 확인하시기 바랍니다.

목차

  1. Browser Use란 무엇인가
    • 왜 AI 브라우저 자동화가 필요한가
    • 기존 자동화 도구와의 차이점
  2. 설치 및 환경 설정
    • 필수 요구사항
    • uv / pip 설치 방법
    • 환경 변수 설정
  3. 첫 번째 예제: 기본 사용법
    • 기본 예제 코드
    • ChatBrowserUse 사용하기
    • Google Gemini 사용하기
    • 브라우저 고급 설정
  4. 실전 예제: 웹 정보 수집 자동화
  5. 고급 기능 및 활용 팁
    • CLI 모드
    • 커스텀 도구 추가
    • 인증된 세션 유지
  6. 주의사항 및 한계점
  7. 자주 묻는 질문
  8. 마무리
Browser Use 완벽 가이드
이 글은 공식 GitHub 문서에 근거해, Browser Use의 핵심 개념과 설치/설정 흐름을 튜토리얼 형식으로 정리했다. 자체 최적화 모델 ChatBrowserUse()를 사용하면 3-5배 빠른 속도로 작업을 완료할 수 있다.

 

Browser Use란 무엇인가

공식 GitHub 문서에 따르면, Browser Use는 AI 에이전트가 웹 브라우저를 자율적으로 제어할 수 있게 해주는 오픈소스 Python 프레임워크다. 쉽게 말해, "웹사이트에서 이 정보를 찾아줘"라고 자연어로 명령하면, AI가 직접 브라우저를 열고, 페이지를 탐색하며, 클릭하고, 입력하여 작업을 완료한다.

공식 문서 출처
"Make websites accessible for AI agents"
Browser Use 공식 GitHub

 

1.1 왜 AI 브라우저 자동화가 필요한가

우리는 매일 브라우저에서 반복적인 작업을 수행한다:

  • 여러 사이트에서 정보 수집 및 비교
  • 폼 작성 및 데이터 입력
  • 웹 애플리케이션 모니터링
  • 경쟁사 가격 추적
  • SNS 게시물 확인 및 수집

기존에는 Selenium이나 Playwright 같은 도구로 이런 작업을 자동화했지만, 웹사이트 구조가 바뀌면 스크립트를 수정해야 했다. Browser Use는 이 문제를 AI로 해결한다.

 

1.2 기존 자동화 도구와의 차이점

구분 Selenium/Playwright Browser Use
작업 정의 방식 XPath/CSS 셀렉터 기반 코드 자연어 명령
웹 구조 변경 대응 스크립트 수정 필요 AI가 자동 적응
학습 곡선 HTML/CSS 지식 필요 자연어만 알면 됨
복잡한 판단 조건문으로 직접 구현 AI가 상황 판단
비용 무료 LLM API 비용 발생
💡 언제 Browser Use를 선택할까?

웹 구조가 자주 바뀌거나, 복잡한 판단이 필요한 작업이라면 Browser Use가 유리하다.
단순 반복 작업이고 비용을 최소화해야 한다면 기존 도구가 나을 수 있다.

 

설치 및 환경 설정

2.1 필수 요구사항

항목 요구사항
Python 3.11 이상 (필수)
패키지 매니저 uv (권장) 또는 pip
브라우저 Chromium (자동 설치 가능)
LLM API 키 OpenAI, Anthropic, 또는 Browser Use Cloud

 

2.2 설치하기

Browser Use는 uv 패키지 매니저 사용을 권장한다. uv가 없다면 먼저 설치하자:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

 

ex) curl -LsSf https://astral.sh/uv/install.sh | sh

downloading uv 0.9.26 aarch64-apple-darwin
no checksums to verify
installing to /Users/gdh/.local/bin
  uv
  uvx
everything's installed!


# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

 

이제 Browser Use를 설치한다:

# 프로젝트 디렉토리 생성 및 이동
mkdir browser-use-demo && cd browser-use-demo

# uv 초기화 및 browser-use 설치
uv init
uv add browser-use playwright langchain-google-genai
uv sync

ex) 

 

# Chromium 브라우저 설치
uv run python -m playwright install chromium

 

pip 사용자를 위한 대안

pip를 사용한다면 다음과 같이 설치할 수 있다 (공식 문서에서는 uv 권장):

pip install browser-use
playwright install chromium

 

2.3 환경 변수 설정

사용할 LLM 프로바이더의 API 키를 환경 변수로 설정한다:

# .env 파일 생성
# OpenAI 사용 시
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx

# Anthropic (Claude) 사용 시
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx

# Browser Use Cloud 사용 시 (권장, 최적화된 모델)
BROWSER_USE_API_KEY=bu-xxxxxxxxxxxxxxxx

# Google Gemini 사용 시
GOOGLE_API_KEY=AIxxxxxxxxxxxxxxxxxxxxxxxx
설치 확인

설치가 완료되었으면 Python에서 import가 되는지 확인하자:

uv run python -c "from browser_use import Agent; print('설치 완료!')"

 

첫 번째 예제: 기본 사용법

이제 Browser Use로 간단한 작업을 수행해보자. 먼저 GitHub에서 Browser Use 저장소의 stars 수를 자동으로 확인하는 예제다.

 

3.1 기본 예제 코드

# basic_example.py
from browser_use import Agent, Browser, ChatOpenAI
import asyncio

async def main():
    # 브라우저 인스턴스 생성
    browser = Browser()

    # LLM 모델 설정 (OpenAI GPT-5.2 Pro 사용)
    llm = ChatOpenAI(model="gpt-5.2-pro")

    # 에이전트 생성 - 자연어로 작업 지시
    agent = Agent(
        task="GitHub에서 browser-use 저장소를 찾아서 현재 stars 수를 알려줘",
        llm=llm,
        browser=browser,
    )

    # 작업 실행
    result = await agent.run()

    print(f"결과: {result}")

    # 브라우저 정리
    await browser.stop()

# 실행
asyncio.run(main())

위 코드를 실행하면, AI가 자동으로:

  1. 브라우저를 열고
  2. GitHub 웹사이트로 이동하여
  3. browser-use 저장소를 검색하고
  4. stars 수를 확인해서 알려준다

 

3.2 ChatBrowserUse 사용하기

Browser Use는 자체 최적화된 모델인 ChatBrowserUse()를 제공한다. 이 모델은 브라우저 자동화에 특화되어 있어 3-5배 빠른 속도와 높은 정확도를 보인다.

# optimized_example.py
from browser_use import Agent, Browser, ChatBrowserUse
import asyncio

async def main():
    browser = Browser()

    # 최적화된 ChatBrowserUse 모델 사용
    llm = ChatBrowserUse()

    agent = Agent(
        task="네이버에서 오늘의 날씨를 검색해서 알려줘",
        llm=llm,
        browser=browser,
    )

    await agent.run()
    await browser.stop()

asyncio.run(main())
⚠️ 주의
ChatBrowserUse()를 사용하려면 Browser Use Cloud API 키(BROWSER_USE_API_KEY)가 필요하다.
ChatBrowserUse 가격 정보 (2026년 1월 기준)
Input 토큰 $0.20 / 1M 토큰
Cached 토큰 $0.02 / 1M 토큰
Output 토큰 $2.00 / 1M 토큰

신규 가입 시 $10 무료 크레딧 제공 (출처: 공식 GitHub)

 

3.3 Google Gemini 사용하기

OpenAI 외에도 Google의 Gemini 모델을 사용할 수 있다. 무료 티어에서도 강력한 성능을 보여주며 설정이 간단하다.

# gemini_example.py
from browser_use import Agent, Browser, ChatGoogle
import asyncio
from dotenv import load_dotenv

load_dotenv()

async def main():
    browser = Browser()
    
    # Gemini 모델 설정 (Gemini 3.0 Flash 권장)
    llm = ChatGoogle(model="gemini-3-flash")
    
    agent = Agent(
        task="Google에서 '오늘의 명언'을 검색해서 하나 알려줘",
        llm=llm,
        browser=browser,
    )

    result = await agent.run()
    print(result)

    await browser.stop()

asyncio.run(main())

실행 방법:

uv run python gemini_example.py

 

ex) 브라우저 동작

 

ex) 결과 및 로그

uv run python gemini_example.py
INFO     [service] Using anonymized telemetry, see https://docs.browser-use.com/development/telemetry.
INFO     [Agent] 🎯 Task: Google에서 '오늘의 명언'을 검색해서 하나 알려줘
INFO     [Agent] Starting a browser-use agent with version 0.11.4, with provider=google and model=gemini-2.0-flash-exp
INFO     [Agent] 

INFO     [Agent] 📍 Step 1:
INFO     [Agent]   ❔ Eval: Agent initialized, no previous goal to evaluate.
INFO     [Agent]   🧠 Memory: No information stored yet.
INFO     [Agent]   🎯 Next goal: Search Google for '오늘의 명언'.
INFO     [Agent]   ▶️   search: query: 오늘의 명언, engine: google
WARNING  [BrowserSession] ⚠️ Page readiness timeout (4.0s, 4156ms) for https://www.google.com/search?q=%EC%98%A4%EB%8A%98%EC%9D%98+%EB%AA%85%EC%96%B8&udm=14
INFO     [tools] 🔍  Searched Google for '오늘의 명언'
INFO     [Agent] 

INFO     [Agent] 📍 Step 2:
INFO     [Agent]   👍 Eval: Successfully searched Google for '오늘의 명언'. Verdict: Success
INFO     [Agent]   🧠 Memory: Searched Google for '오늘의 명언' and found a quote in the search results.
INFO     [Agent]   🎯 Next goal: Provide the quote to the user and finish the task.
INFO     [Agent]   ▶️   done: text: 오늘의 명언: 세상에 끈기를 대신할 수 있는 것은 아무것도 없다. 재능은 끈기를 대신할 수 없다. 뛰어난 재능을 갖고도 실패하는 사람은 얼마든지 볼 수 있다., success: True, files_to_display: None
INFO     [Agent] 
📄  Final Result: 
오늘의 명언: 세상에 끈기를 대신할 수 있는 것은 아무것도 없다. 재능은 끈기를 대신할 수 없다. 뛰어난 재능을 갖고도 실패하는 사람은 얼마든지 볼 수 있다.


INFO     [Agent] ✅ Task completed successfully
INFO     [BrowserSession] 📢 on_BrowserStopEvent - Calling reset() (force=True, keep_alive=None)
INFO     [BrowserSession] [SessionManager] Cleared all owned data (targets, sessions, mappings)
INFO     [BrowserSession] ✅ Browser session reset complete
INFO     [BrowserSession] ✅ Browser session reset complete
AgentHistoryList(all_results=[ActionResult(is_done=False, success=None, judgement=None, error=None, attachments=None, images=None, long_term_memory="Searched Google for '오늘의 명언'", extracted_content="Searched Google for '오늘의 명언'", include_extracted_content_only_once=False, metadata=None, include_in_memory=False), ActionResult(is_done=True, success=True, judgement=JudgementResult(reasoning="The user asked the agent to search for 'today's quote' in Korean and provide one. The agent successfully searched on Google and extracted a quote from the search results. The agent then presented the quote in the final answer.", verdict=True, failure_reason='', impossible_task=False, reached_captcha=False), error=None, attachments=[], images=None, long_term_memory='Task completed: True - 오늘의 명언: 세상에 끈기를 대신할 수 있는 것은 아무것도 없다. 재능은 끈기를 대신할 수 없다. 뛰어난 재능을 갖고도 실패하는 사람은 얼마든지 볼 수 있다.', extracted_content='오늘의 명언: 세상에 끈기를 대신할 수 있는 것은 아무것도 없다. 재능은 끈기를 대신할 수 없다. 뛰어난 재능을 갖고도 실패하는 사람은 얼마든지 볼 수 있다.', include_extracted_content_only_once=False, metadata=None, include_in_memory=False)], all_model_outputs=[{'search': {'query': '오늘의 명언', 'engine': 'google'}, 'interacted_element': None}, {'done': {'text': '오늘의 명언: 세상에 끈기를 대신할 수 있는 것은 아무것도 없다. 재능은 끈기를 대신할 수 없다. 뛰어난 재능을 갖고도 실패하는 사람은 얼마든지 볼 수 있다.', 'success': True}, 'interacted_element': None}])
INFO     [BrowserSession] ✅ Browser session reset complete

 

 

3.4 브라우저 고급 설정

BrowserConfigBrowserContextConfig를 사용하면 브라우저 동작을 세밀하게 제어할 수 있다:

from browser_use import Agent, Browser, BrowserConfig, ChatOpenAI

# 브라우저 설정
browser_config = BrowserConfig(
    headless=False,        # 브라우저 창 표시 (디버깅용)
    disable_security=True  # 보안 정책 비활성화 (테스트용)
)

# 브라우저 컨텍스트 설정
context_config = BrowserContextConfig(
    wait_for_network_idle_page_load_time=3.0,  # 페이지 로드 대기 시간
    browser_window_size={'width': 1280, 'height': 1100},
    locale='ko-KR',              # 한국어 로케일
    highlight_elements=True,    # 클릭 대상 하이라이트
    viewport_expansion=500,      # 뷰포트 확장
)

# 설정 적용
browser = Browser(config=browser_config)
context = BrowserContext(browser=browser, config=context_config)
llm = ChatOpenAI(model="gpt-5.2-pro")

agent = Agent(
    task="작업 내용",
    llm=llm,
    browser=browser,
)
💡 Cloud 모드 사용하기

프로덕션 환경에서는 Browser Use Cloud를 사용하면 메모리 관리, 병렬 실행, Stealth 핑거프린팅 등의 기능을 활용할 수 있다:

browser = Browser(use_cloud=True)  # Cloud 모드 활성화

 

예제 : 웹 정보 수집 자동화

이번에는 좀 더 실용적인 예제를 살펴보자. 여러 뉴스 사이트에서 특정 키워드 관련 기사를 수집하는 자동화이다.

 

4.1 뉴스 헤드라인 수집

# news_collector.py
from browser_use import Agent, Browser, ChatOpenAI
import asyncio
import json

async def collect_news(keyword: str):
    browser = Browser()
    llm = ChatOpenAI(model="gpt-5.2-pro")

    task = f"""
    다음 작업을 수행해줘:
    1. Google 뉴스에서 '{keyword}' 키워드로 검색
    2. 상위 5개 뉴스 기사의 제목과 출처를 수집
    3. 결과를 JSON 형식으로 정리

    JSON 형식 예시:
    {{
        "keyword": "{keyword}",
        "articles": [
            {{"title": "제목", "source": "출처"}}
        ]
    }}
    """

    agent = Agent(
        task=task,
        llm=llm,
        browser=browser,
    )

    result = await agent.run()
    await browser.stop()

    return result

async def main():
    keywords = ["AI 에이전트", "LLM 트렌드"]

    for keyword in keywords:
        print(f"\n=== '{keyword}' 검색 중... ===")
        result = await collect_news(keyword)
        print(result)

asyncio.run(main())

 

4.2 가격 비교 자동화

여러 쇼핑몰에서 특정 상품의 가격을 비교하는 예제다:

# price_compare.py
from browser_use import Agent, Browser, ChatBrowserUse
import asyncio

async def compare_prices(product_name: str):
    browser = Browser()
    llm = ChatBrowserUse()

    task = f"""
    다음 쇼핑몰에서 '{product_name}'의 가격을 비교해줘:
    1. 쿠팡 (coupang.com)
    2. 11번가 (11st.co.kr)
    3. G마켓 (gmarket.co.kr)

    각 사이트에서 검색 후 최저가와 판매자를 찾아서
    가격이 낮은 순으로 정렬해서 알려줘.
    """

    agent = Agent(
        task=task,
        llm=llm,
        browser=browser,
    )

    result = await agent.run()
    await browser.stop()

    return result

asyncio.run(compare_prices("에어팟 프로 2"))

실행 방법:

uv run python price_compare.py

 

고급 기능 및 활용 팁

5.1 CLI 모드

Browser Use는 터미널에서 직접 브라우저를 제어할 수 있는 CLI를 제공한다:

# CLI 명령어 목록
browser-use open <url>       # URL로 이동
browser-use state            # 클릭 가능한 요소 표시
browser-use click <index>    # 특정 요소 클릭
browser-use type "텍스트"    # 텍스트 입력
browser-use screenshot file  # 스크린샷 저장
browser-use close            # 브라우저 종료

 

5.2 커스텀 도구 추가

Tools 클래스와 @tools.action 데코레이터를 사용하여 커스텀 기능을 추가할 수 있다:

from browser_use import Agent, Tools, Browser, ChatOpenAI

# Tools 인스턴스 생성
tools = Tools()

# 커스텀 도구 정의 - @tools.action 데코레이터 사용
@tools.action(description='수집한 내용을 파일로 저장합니다')
def save_to_file(content: str, filename: str) -> str:
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(content)
    return f"파일 저장 완료: {filename}"

# 에이전트에 Tools 인스턴스 전달
agent = Agent(
    task="뉴스를 수집하고 news.txt 파일로 저장해줘",
    llm=llm,
    browser=browser,
    tools=tools,  # Tools 인스턴스 전달
)

 

5.3 인증된 세션 유지

로그인이 필요한 사이트에서 작업하려면 여러 가지 인증 방법을 사용할 수 있다:

방법 1: 기존 Chrome 프로필 재사용

from browser_use import Browser

# 사용자 프로필 디렉토리 지정 (기존 Chrome 프로필 사용)
browser = Browser(
    user_data_dir="~/.browser-use/profiles/my-profile"
)

# 이제 해당 프로필의 로그인 상태가 유지됨

방법 2: 프로필 동기화 (Cloud 사용 시)

# 터미널에서 프로필 동기화
curl -fsSL https://browser-use.com/profile.sh | BROWSER_USE_API_KEY=your-key sh
인증 방법 비교
  • 로컬 프로필: 로컬 개발 시 간편, 수동 로그인 필요
  • 프로필 동기화: Cloud 환경에서 일관된 세션 유지
  • AgentMail: 임시 계정 + 이메일 인박스 제공 (테스트용)
활용 팁 모음
  • 작업이 복잡하면 단계별로 나눠서 지시하자
  • 결과 형식(JSON, Markdown 등)을 명시하면 파싱이 쉽다
  • 로컬 LLM(Ollama)과 연동하면 API 비용을 절약할 수 있다
  • Browser Use Cloud를 사용하면 인프라 관리 없이 확장 가능

 

주의사항 및 한계점

⚠️ 반드시 알아야 할 주의사항
  • 이용약관 준수: 자동화를 금지하는 사이트에서는 사용하지 말 것
  • 과도한 요청 금지: 서버에 부담을 주는 빈번한 자동화는 IP 차단 위험
  • 개인정보 주의: AI에 민감한 정보(비밀번호 등)를 노출하지 말 것
  • 비용 관리: LLM API 호출 비용이 누적될 수 있음

 

6.1 현재 한계점

한계점 설명
캡차(CAPTCHA) AI가 캡차를 완벽히 해결하지 못할 수 있음
복잡한 SPA 매우 동적인 웹앱에서 요소 인식이 어려울 수 있음
실시간 데이터 스트리밍/실시간 업데이트 페이지 처리 제한
API 비용 복잡한 작업은 많은 토큰 소비

 

자주 묻는 질문

Q1. Browser Use는 무료인가요?

A. Browser Use 라이브러리 자체는 오픈소스로 무료입니다. 다만 LLM API 호출 비용(OpenAI, Anthropic 등)은 별도로 발생합니다. ChatBrowserUse를 사용하면 자체 최적화된 모델을 이용할 수 있으며, 신규 가입 시 $10 무료 크레딧이 제공됩니다.

Q2. Selenium/Playwright를 완전히 대체할 수 있나요?

A. 완전한 대체보다는 상호 보완적입니다. 웹 구조가 자주 바뀌거나 복잡한 판단이 필요한 작업에는 Browser Use가 유리하고, 단순 반복 작업이나 비용을 최소화해야 하는 경우에는 기존 도구가 나을 수 있습니다.

Q3. 로컬 LLM(Ollama)과 함께 사용할 수 있나요?

A. 네, LangChain의 ChatOllama를 통해 로컬 LLM과 연동할 수 있습니다. DeepSeek-R1과 같은 모델을 사용하면 API 비용 없이 브라우저 자동화를 수행할 수 있습니다. 다만 로컬 모델의 성능에 따라 작업 정확도가 달라질 수 있습니다.

Q4. 캡차(CAPTCHA)를 자동으로 풀 수 있나요?

A. 현재 AI가 캡차를 완벽히 해결하지 못하는 경우가 있습니다. 단순한 이미지 인식 캡차는 처리될 수 있지만, reCAPTCHA v3 같은 고급 캡차는 한계가 있습니다. 캡차가 있는 사이트는 수동 개입이 필요할 수 있습니다.

Q5. 프로덕션 환경에서 사용해도 되나요?

A. 프로덕션 환경에서는 Browser Use Cloud를 권장합니다. Chrome의 높은 메모리 사용량과 병렬 처리 문제를 Cloud API가 해결해주며, Stealth 핑거프린팅 기능도 제공합니다. 로컬에서 대규모 자동화를 돌리면 메모리 부족 문제가 발생할 수 있습니다.

Q6. Google Gemini(제미나이)도 사용할 수 있나요?

A. 네, 가능합니다. langchain-google-genai 패키지를 설치한 후, from browser_use import ChatGoogle를 통해 Gemini 모델을 사용할 수 있습니다. 무료 티어에서도 충분히 테스트해 볼 수 있다는 장점이 있습니다.

 

마무리

Browser Use는 AI 브라우저 자동화의 새로운 패러다임을 제시하는 도구다.

기존의 셀렉터 기반 자동화에서 벗어나, 자연어로 지시하면 AI가 알아서 수행하는 방식은 자동화의 진입 장벽을 크게 낮춰준다.

물론 LLM API 비용이 발생하고, 모든 상황에서 완벽하지는 않지만, 웹 구조 변경에 강하고 복잡한 판단이 가능하다는 점에서 활용 가치가 충분하다.

다음 단계
  • 공식 문서에서 더 많은 예제 확인: GitHub Repository
  • 로컬 LLM(DeepSeek-R1)과 연동하여 비용 절감 시도
  • Browser Use Cloud로 확장 가능한 자동화 파이프라인 구축

참고 자료

 

300x250

'AI > Python' 카테고리의 다른 글

Python 개발자를 위한 Jupyter Notebook - 설치 및 사용방법  (2) 2025.12.05
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.

💡 AI 관련 질문이 있나요? 눌러보세요!