웹 스크래핑은 전환점에 서 있습니다. 기존 방식은 정교한 봇 방지 방어 체계에 막히고, 개발자들은 취약한 스크립트를 끊임없이 보완하고 있기 때문입니다. 여전히 작동하지만, 특히 복원력과 확장성을 제공하는 현대적인 AI 기반 스크래핑 인프라와 비교할 때 그 한계가 뚜렷합니다. AI 에이전트 시장이 2030년까지 78억 4천만 달러에서 526억 2천만 달러로 성장할 전망인 가운데, 데이터 접근의 미래는 지능형 자율 시스템에 달려 있습니다.
CrewAI의 자율 에이전트 프레임워크와 Bright Data의 강력한 인프라를 결합하면, 반봇 장벽을 분석하고 극복하는 스크래핑 스택을 구축할 수 있습니다. 본 튜토리얼에서는 신뢰할 수 있는 실시간 데이터를 제공하는 AI 기반 스크래핑 에이전트를 제작해 보겠습니다.
구식 스크래핑의 한계
기존 스크래핑은 취약합니다. 프론트엔드 변경 시 무너지는 정적 CSS 또는 XPath 선택기에 의존하기 때문입니다. 주요 문제점은 다음과 같습니다:
- 봇 방지 방어 체계. CAPTCHA, IP 속도 제한, 지문 인식 기술이 단순 크롤러를 차단합니다.
- 자바스크립트 중심 페이지. React, Angular, Vue는 브라우저 내에서 DOM을 생성하므로, 원시 HTTP 호출로는 대부분의 콘텐츠를 놓칩니다.
- 구조화되지 않은 HTML. 일관성 없는 HTML과 흩어진 인라인 데이터는 사용 전 복잡한 파싱과 후처리를 요구합니다.
- 확장성 병목 현상. 프록시, 재시도, 지속적인 패치 관리는 지칠 줄 모르는 끝없는 운영 부담으로 이어집니다.
CrewAI와 Bright Data가 스크래핑을 간소화하는 방법
자율적 스크레이퍼 구축은 두 가지 핵심 요소, 즉 적응형 “두뇌”와 탄력적인 “몸”에 달려 있습니다.
- CrewAI (두뇌). 오픈소스 멀티에이전트 런타임으로, 계획 수립, 추론, 엔드투엔드 스크래핑 작업 조정이 가능한 에이전트 “크루”를 생성합니다.
- Bright Data MCP (몸). 각 요청을 Bright Data의 Unlocker 스택(IP 로테이션, CAPTCHA 해결, 헤드리스 브라우저 실행)을 통해 라우팅하는 라이브 데이터 게이트웨이로, LLM이 한 번에 깨끗한 HTML 또는 JSON을 수신할 수 있게 합니다. Bright Data의 구현은 AI 에이전트를 위한 업계 최고의 신뢰할 수 있는 데이터 소스입니다.
이 두 가지 기능이 결합된 크루AI는 에이전트가 거의 모든 사이트에서 사고하고, 정보를 검색하고, 적응할 수 있도록 합니다.
CrewAI란 무엇인가요?
CrewAI는 협력적인 AI 에이전트를 오케스트레이션하기 위한 오픈 소스 프레임워크입니다. 각 에이전트의 역할, 목표 및 도구를 정의한 다음, 여러 단계의 워크플로를 실행하기 위해 크루로 그룹화합니다.
핵심 구성 요소:
- 에이전트: 역할, 목표, 선택적 배경 스토리를 가진 LLM 기반 작업자로, 모델에 도메인 컨텍스트를 제공합니다.
- 작업(Task). 단일 에이전트를 위한 명확히 정의된 작업과 품질 게이트 역할을 하는 예상 출력( expected_output ).
- 도구(Tool). 에이전트가 호출할 수 있는 모든 실행 가능 객체 – HTTP 요청, DB 쿼리, 또는 스크래핑을 위한 Bright Data의 MCP 엔드포인트 등.
- 크루(Crew). 하나의 목표를 위해 협력하는 에이전트와 그들의 작업 모음입니다.
- 프로세스. 작업 순서, 위임, 재시도를 제어하는 실행 계획( 순차적, 병렬적, 계층적).
이는 실제 팀을 반영합니다: 전문가들이 각자의 영역을 처리하고 결과를 전달하며, 필요할 때 에스컬레이션합니다.
모델 컨텍스트 프로토콜(MCP)이란 무엇인가요?
MCP는 AI 에이전트가 단일 구조화된 인터페이스를 통해 외부 도구 및 데이터 소스를 호출할 수 있게 하는 개방형 JSON-RPC 2.0 표준입니다. 모델용 USB-C 포트라고 생각하세요 – 하나의 플러그로 여러 장치를 연결합니다.
Bright Data의 MCP 서버는 에이전트를 Bright Data의 스크래핑 스택에 직접 연결하여 이 표준을 구현합니다. 이를 통해 MCP를 활용한 웹 스크래핑은 기존 스택보다 훨씬 강력할 뿐만 아니라 훨씬 간단해집니다:
- 봇 차단 우회. 요청은 웹 언락커와 195개국에 걸쳐 1억 5천만 개 이상의 회전하는 주거용 IP 풀을 통과합니다.
- 동적 사이트 지원. 전용 스크래핑 브라우저가 자바스크립트를 렌더링하므로 에이전트가 완전히 로드된 DOM을 확인합니다.
- 구조화된 결과. 다수의 도구가 깔끔한 JSON을 반환하여 맞춤형 파서 개발을 생략합니다.
서버는 일반 URL 가져오기부터 사이트별 스크레이퍼까지 50개 이상의 사전 제작 도구를 제공하므로, CrewAI 에이전트가 단일 호출로 제품 가격, SERP 데이터 또는 DOM 스냅샷을 수집할 수 있습니다.
첫 번째 AI 스크래핑 에이전트 구축하기
Amazon 제품 페이지에서 세부 정보를 추출하여 구조화된 JSON으로 반환하는 CrewAI 에이전트를 구축해 보겠습니다. 몇 줄만 수정하면 동일한 스택을 다른 사이트로 쉽게 전환할 수 있습니다.

필수 사항
- Python 3.11 – 안정성을 위해 권장됩니다.
- Node.js + npm – Bright Data Web MCP 서버 실행에 필요하며, 공식 사이트에서 다운로드하세요.
- Python 가상 환경 – 종속성을 분리하여 관리합니다.
venv문서를 참조하세요. - Bright Data 계정 – 가입 후 API 토큰 생성 (무료 체험 크레딧 제공).
- Google Gemini API 키 – Google AI Studio에서 키 생성( + Create API key 클릭). 무료 티어는 분당 15회, 일일 500회 요청 허용. 결제 프로필 불필요.
아키텍처 개요
환경 설정 → LLM 구성 → MCP 서버 초기화 →
에이전트 정의 → 작업 정의 → 크루 실행 → JSON 출력
1단계. 환경 설정 및 임포트
mkdir crewai-bd-scraper && cd crewai-bd-scraper
python -m venv venv
# macOS/Linux: source venv/bin/activate
# Windows: venvScriptsactivate
pip install "crewai-tools[mcp]" crewai mcp python-dotenv
from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
from crewai.llm import LLM
import os
from dotenv import load_dotenv
load_dotenv() # .env 파일에서 자격 증명 로드
2단계. API 키 및 존 구성
프로젝트 루트에 .env 파일을 생성합니다:
BRIGHT_DATA_API_TOKEN="…"
WEB_UNLOCKER_ZONE="…"
BROWSER_ZONE="…"
GEMINI_API_KEY="…"
필요한 항목:
- API 토큰. 새 API 토큰 생성.
- 웹 언락커 영역. 새 웹 언락커 영역을 생성하세요. 생략 시
mcp_unlocker라는기본 영역이 자동 생성됩니다. - 브라우저 API 영역. 새 브라우저 API 영역을 생성하세요. 자바스크립트 중심 대상에만 필요합니다. 영역의 개요 탭에 표시된 사용자 이름 문자열을 복사하세요.
- Google Gemini API 키. 필수 조건에서 이미 생성됨.
3단계. LLM 구성 (Gemini)
결정론적 출력을 위해 LLM(Gemini 1.5 Flash)을 구성합니다:
llm = LLM(
model="gemini/gemini-1.5-flash",
api_key=os.getenv("GEMINI_API_KEY"),
temperature=0.1,
)
4단계. Bright Data MCP 설정
Bright Data 웹 MCP 서버를 구성합니다. 이는 CrewAI가 서버를 실행하고 자격 증명을 전달하는 방법을 알려줍니다:
server_params = StdioServerParameters(
command="npx",
args=["@brightdata/mcp"],
env={
"API_TOKEN": os.getenv("BRIGHT_DATA_API_TOKEN"),
"WEB_UNLOCKER_ZONE": os.getenv("WEB_UNLOCKER_ZONE"),
"BROWSER_ZONE": os.getenv("BROWSER_ZONE"),
},
)
이 명령어는 *npx @brightdata/mcp*를 하위 프로세스로 실행하고 MCP 표준을 통해 50개 이상의 도구(작성 시점 기준 약 57개)를 노출합니다.
5단계. 에이전트 및 작업 정의
여기서 에이전트의 역할과 수행해야 할 구체적인 작업을 정의합니다. 효과적인 CrewAI 구현은 80/20 법칙을 따릅니다: 작업 설계에 80%의 노력을, 에이전트 정의에 20%의 노력을 투자하세요.
def build_scraper_agent(mcp_tools):
return Agent(
role="시니어 이커머스 데이터 추출 전문가",
goal=(
"snake_case 형식의 키를 가진 JSON 객체를 반환합니다: title, current_price, "
"original_price, discount, rating, review_count, last_month_bought, "
"availability, product_id, image_url, brand, and key_features for the "
"target product page. Ensure strict schema validation."
),
backstory=(
"Veteran web-scraping engineer with years of experience reverse-"
"engineering Amazon, Walmart, and Shopify layouts. "브라이트 데이터 MCP, 프록시 로테이션, CAPTCHA 회피 및 엄격한 JSON 스키마 검증에 숙련됨."
),
tools=mcp_tools,
llm=llm,
max_iter=3,
verbose=True,
)
def build_scraping_task(agent):
return Task(
description=(
"https://www.amazon.in/dp/B071Z8M4KX에서 제품 데이터를 추출하여
구조화된 JSON 형식으로 반환합니다."
),
expected_output="""{
"title": "제품명",
"current_price": "$99.99",
"original_price": "$199.99",
"discount": "50%",
"last_month_bought": 150,
"rating": 4.5,
"review_count": 1000,
"availability": "In Stock",
"product_id": "ABC123",
"image_url": "https://example.in/image.jpg",
"brand": "BrandName",
"key_features": ["Feature 1", "Feature 2"],
}""",
agent=agent,
)
각 매개변수의 역할은 다음과 같습니다:
- role – 짧은 작업 제목, CrewAI가 모든 시스템 프롬프트에 삽입합니다.
- goal – 북극성 목표; CrewAI는 각 루프 후 이를 비교하여 중단 여부를 결정합니다.
- backstory – 어조 지침 및 허상 감소에 활용되는 도메인 컨텍스트.
- tools –
BaseTool객체 목록 (예: MCPsearch_engine,scrape_as_markdown). - llm – 각 ‘생각 → 계획 → 실행 → 답변’ 사이클에 사용되는 모델.
- max_iter – 에이전트 내부 루프의 하드 캡 (v0.30+에서 기본값 20).
- verbose – 모든 프롬프트, 생각, 도구 호출을 stdout으로 스트리밍(디버깅에 유용).
- description – 매 턴마다 행동 지향적 지침을 주입합니다.
- expected_output – 유효한 답변에 대한 공식 계약 (엄격한 JSON 사용, 후행 콤마 없음).
- agent – 이 작업을 특정
에이전트인스턴스에 바인딩하여Crew.kickoff()를 호출합니다.
6단계. 크루 조립 및 실행
이 부분은 에이전트와 태스크를 크루로 조립하고 워크플로를 실행합니다.
def scrape_product_data():
"""스크래핑 크루를 조립하고 실행합니다."""
with MCPServerAdapter(server_params) as mcp_tools:
scraper_agent = build_scraper_agent(mcp_tools)
scraping_task = build_scraping_task(scraper_agent)
crew = Crew(
agents=[scraper_agent],
tasks=[scraping_task],
process=Process.sequential,
verbose=True
)
return crew.kickoff()
if __name__ == "__main__":
try:
result = scrape_product_data()
print("n[SUCCESS] 스크래핑 완료!")
print("추출된 제품 데이터:")
print(result)
except Exception as e:
print(f"n[ERROR] 스크래핑 실패: {str(e)}")
7단계. 스크레이퍼 실행
터미널에서 스크립트를 실행하세요. 에이전트가 작업을 계획하고 실행하는 사고 과정을 콘솔에서 확인할 수 있습니다.

최종 출력은 깔끔한 JSON 객체입니다:
{
"title": "Boat BassHeads 100 인이어 헤드폰 (블랙, 마이크 포함)",
"current_price": "₹349",
"original_price": "₹999",
"discount": "-65%",
"rating": 4.1,
"review_count": 419630,
"last_month_bought": 5000,
"availability": "In stock",
"product_id": "B071Z8M4KX",
"image_url": "https://m.media-amazon.com/images/I/513ugd16C6L._SL1500_.jpg",
"brand": "boAt",
"key_features": [
"10mm 다이나믹 드라이버",
"HD 마이크",
"1.2m 케이블",
"편안한 착용감",
"1년 보증"
]
}
다른 대상에 적용하기
에이전트 기반 설계의 진정한 강점은 유연성에 있습니다. 아마존 제품 대신 LinkedIn 게시물을 스크래핑하고 싶으신가요? 에이전트의 역할, 목표, 배경 이야기와 함께 작업 설명 및 expected_output만 업데이트하면 됩니다. 기본 코드와 인프라를 포함한 나머지 모든 요소는 그대로 유지됩니다.
role = "시니어 LinkedIn 게시물 추출기"
goal = (
"다음 정보를 포함한 JSON 객체를 반환: 작성자 이름, 작성자 직함, "
"작성자 프로필 URL, 게시물 내용, 게시일, 좋아요 수, "
"댓글 수"
)
배경 = (
"Bright Data MCP를 활용한 LinkedIn 데이터 추출 전문 경험 많은 소셜 데이터 엔지니어. 깔끔하고 구조화된 JSON 출력 생성."
)
description = (
"LinkedIn 게시물(ID: orlenchner_agents-"
"brightdata-activity-7336402761892122625-h5Oa)에서 게시물 데이터를 추출하고 "
"구조화된 JSON을 반환합니다.")
expected_output = """{
"author_name": "게시물 작성자의 전체 표시 이름",
"author_title": "작성자의 직함/헤드라인",
"author_profile_url": "작성자의 프로필 URL",
"post_content": "서식이 적용된 전체 게시물 텍스트",
"post_date": "ISO 8601 UTC 타임스탬프",
"likes_count": "게시물 좋아요 수",
"comments_count": "게시물 댓글 수",
}"""
출력 결과는 깔끔한 JSON 객체가 됩니다:
{
"author_name": "Or Lenchner",
"author_title": "Bright Data CEO - 공개 웹 데이터는 공개적으로 유지합니다.",
"author_profile_url": "https://il.linkedin.com/in/orlenchner",
"post_content": "신제품 출시! 미래의 인터넷은 자동화된 #에이전트 가 '그들의' 인간을 대신해 활동을 자동화하며 운영될 것이라는 데는 공감대가 형성되어 있습니다. AI는 자동화 부분을 해결했습니다(적어도 강력한 징후를 보이고 있습니다). 그러나 가장 큰 문제는 차단되지 않고 대규모로 모든 웹사이트에 원활하게 접근하는 것을 보장하는 것입니다. browser.ai가 그 해결책입니다 → 간단한 프롬프트만으로 당신의 에이전트는 항상 어떤 웹사이트에도 접근할 수 있습니다. 브라이트데이터를 사용하는 에이전트들은 이미 저희 브라우저 인프라에서 매일 수억 건의 웹 작업을 실행 중입니다. #BrightData는 주요 LLM 기업들이 오랫동안 선택해 온 파트너로, 이러한 기술을 훈련하고 배포하는 데 필요한 도구와 규모를 제공합니다. browser.ai를 통해 저희는 그 기반을 AI 에이전트에 특화하여 재구성하고, API, 프록시 네트워크, 서버리스 브라우저를 최적화하여 그들의 독특한 요구를 처리합니다. 웹은 아직 이 변화에 완전히 준비되지 않았지만, 우리는 준비되었습니다. browser.ai의 당면 목표는 모든 웹사이트에 *원활한* 접근을 보장하는 것이며(완료!), 2단계는 *빠른* 접근에 집중할 예정입니다(진행 중). https://browser.ai/,
"post_date": "2026-06-05T14:45:22.155Z",
"likes_count": 119,
"comments_count": 7
}
비용 최적화
Bright Data의 MCP는 사용량 기반이므로 추가 요청마다 요금이 부과됩니다. 비용을 관리하기 위한 몇 가지 설계 선택 사항:
- 표적 스크래핑. 전체 페이지나 데이터셋을 크롤링하지 말고 필요한 필드만 요청하세요.
- 캐싱. 콘텐츠가 변경되지 않았을 때 호출을 건너뛰도록 크루AI의 도구 수준 캐시(
cache_function)를 활성화하여 시간과 크레딧을 모두 절약하세요. - 효율적인 도구 선택. 기본적으로 Web Unlocker 영역을 사용하고, 자바스크립트 렌더링이 필수적인 경우에만 Browser API 영역으로 전환하세요.
-
max_iter설정. 모든 에이전트에 합리적인 상한값을 부여하여 오류 페이지에서 무한 루프에 빠지지 않도록 합니다. (max_rpm으로요청 속도 조절도 가능합니다.)
이러한 관행을 따르면 CrewAI 에이전트는 안전하고 안정적이며 비용 효율적으로 유지되어 Bright Data MCP의 프로덕션 워크로드에 즉시 투입할 수 있습니다.
다음 단계
MCP 생태계는 지속적으로 확장되고 있습니다: OpenAI의 Responses API와 Google DeepMind의 Gemini SDK가 이제 MCP를 기본적으로 지원하여 장기적인 호환성과 지속적인 투자를 보장합니다.
CrewAI는 다중 모드 에이전트, 향상된 디버깅 기능, 엔터프라이즈 RBAC를 출시하고 있으며, Bright Data의 MCP 서버는 60개 이상의 즉시 사용 가능한 도구를 제공하며 계속 확장 중입니다.
에이전트 프레임워크와 표준화된 데이터 접근 방식이 결합되어 AI 기반 애플리케이션을 위한 새로운 웹 인텔리전스 물결을 열었습니다. OpenAI 에이전트 SDK에 MCP를 연결하는 가이드에서는 견고한 데이터 파이프라인이 얼마나 필수적인지 강조합니다.
궁극적으로 여러분은 단순한 스크레이퍼를 구축하는 것이 아니라 미래 웹을 위해 설계된 적응형 데이터 워크플로를 조율하고 있는 것입니다.
더 큰 규모가 필요하신가요? 스크레이퍼 유지 관리와 차단 대응은 생략하세요. 구조화된 데이터만 요청하면 됩니다:
- 크롤 API – 대규모 사이트 전체 추출.
- 웹 스크레이퍼 API – 120개 이상의 도메인별 엔드포인트.
- SERP API – 번거로움 없는 검색 엔진 스크래핑.
- 데이터셋 마켓플레이스 – 수요에 맞춰 검증된 최신 데이터셋 제공.
차세대 AI 앱 구축 준비되셨나요? Bright Data의 전체 AI 제품군을 살펴보고 에이전트에게 원활한 실시간 웹 접근이 어떤 변화를 가져오는지 확인하세요. 심층 분석을 원하시면 Qwen-Agent 및 Google ADK용 MCP 가이드를 참조하세요.