Firecrawl 내부 동작 원리와 아키텍처 (Under the Hood)
Firecrawl이 어떻게 복잡한 웹사이트에서 깔끔한 마크다운과 구조화된 데이터를 추출해 내는지 내부 원리를 단계별로 살펴보겠습니다.
1. 동적 JavaScript 렌더링 및 브라우저 세션 제어
Firecrawl은 요청이 들어오면 내부적으로 격리된 Headless 브라우저(Playwright 기반) 환경을 띄웁니다. 수집 대상 사이트의 자바스크립트를 완벽히 실행하고 비동기 네트워크 요청(XHR/Fetch)이 완료되어 최종 DOM 트리 구축이 끝날 때까지 대기합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
sequenceDiagram
autonumber
actor Agent as AI 에디터 및 클라이언트
participant API as Firecrawl Gateway
participant Queue as Redis BullMQ Queue
participant Worker as Browser Worker
participant Page as 대상 웹사이트
Agent->>API: POST /scrape 요청
API->>Queue: 스크래핑 작업 등록
Queue->>Worker: 작업 할당
Worker->>Page: 브라우저 페이지 로드 및 JS 실행
Page-->>Worker: 최종 동적 DOM 반환
Worker->>Worker: HTML 세척 및 마크다운 변환
Worker-->>API: 정제된 결과 반환
API-->>Agent: JSON response 반환
2. DOM 세척과 메인 컨텍스트 추출 알고리즘
페이지가 로드된 후, Firecrawl은 HTML 문서 내부에서 본문과 상관없는 레이어들을 지워냅니다. <script>, <style>, <iframe>, <nav>, <footer>, 광고 블록 및 팝업 레이어를 레이아웃 및 의미론적(Semantic) 분석을 통해 차단합니다. 그 후 본문(Main Article) 영역을 추적하여 시각적 위계 구조를 표준 마크다운 헤더(#, ##, ###)와 목록, 표로 재구성합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
pie title 웹페이지 DOM 구성 요소와 Firecrawl의 정제 비중
"유효 본문 데이터 (마크다운 전환)" : 25
"광고 및 트래킹 스크립트 (제거)" : 35
"내비게이션 및 푸터 (제거)" : 20
"인라인 CSS 및 HTML 태그 (제거)" : 20
Firecrawl의 파워풀한 기능 중 하나는 Pydantic 스키마나 JSON 스키마를 지정하면, 스크래핑과 동시에 원본 웹페이지에서 원하는 데이터 구조를 직접 추출해 준다는 점입니다. LLM 파서가 텍스트를 읽고 해당 스키마 형태의 정형 JSON으로 맞춰 출력합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
erDiagram
ENTITY_SCRAPE_REQ ||--o{ ENTITY_CRAWL_JOB : initiates
ENTITY_CRAWL_JOB ||--|{ ENTITY_PARSED_DATA : produces
ENTITY_PARSED_DATA ||--o| ENTITY_SCHEMA : validates
ENTITY_SCRAPE_REQ {
string url
string formats
boolean onlyMainContent
}
ENTITY_CRAWL_JOB {
string jobId
string status
int totalPages
}
ENTITY_PARSED_DATA {
string title
string markdown
string jsonContent
}
ENTITY_SCHEMA {
string schemaName
string jsonFormat
}
4. 재귀적 사이트 매핑 및 크롤링 처리 엔진 (/map & /crawl)
Firecrawl은 단일 URL 스크래핑(/scrape)에 그치지 않고, 사이트 전체의 URL 지도를 즉각적으로 그려주는 /map 기능과, 하위 페이지를 깊이에 따라 자동 추적하는 /crawl 기능을 제공합니다.
- Map 엔드포인트: 사이트맵(sitemap.xml)과 내부 링크 그래프를 조합하여 불과 수 초 만에 사이트 내 수천 개의 모든 유효 URL 리스트를 뽑아냅니다.
- Crawl 엔드포인트: 지정된 URL부터 시작하여 자식 링크를 순회하며 전체 페이지를 병렬 수집하고, 결과를 비동기적으로 전달합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
stateDiagram-v2
[*] --> Queued : Crawl 요청 등록
Queued --> MapScanning : 사이트맵 및 링크 탐색
MapScanning --> ScrapingWorkers : 작업 분할 및 워커 생성
ScrapingWorkers --> Retrying : IP 차단 또는 실패
Retrying --> ScrapingWorkers : 프록시 재할당 후 재시도
ScrapingWorkers --> MarkdownConverting : DOM 수집 성공
MarkdownConverting --> Completed : 모든 페이지 파싱 완료
Completed --> [*]
5. 대화형 액션 수행 (/interact)
버튼 클릭, 검색어 입력, 스크롤, 로그인 폼 채우기 등 사람의 행동이 필요한 페이지의 경우 /interact 엔드포인트를 통해 브라우저 세션을 유지한 채 액션을 지시할 수 있습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
classDiagram
class SERVICE_API {
+scrapeUrl(url, options)
+crawlUrl(url, options)
+mapUrl(url, options)
+extractData(url, schema)
}
class BROWSER_POOL {
+launchHeadless()
+rotateProxy()
+solveCaptcha()
}
class PARSER_MARKDOWN {
+sanitizeDom()
+convertToMarkdown()
+stripNoise()
}
class EXTRACTOR_LLM {
+parseSchema()
+validateJson()
}
SERVICE_API --> BROWSER_POOL
BROWSER_POOL --> PARSER_MARKDOWN
PARSER_MARKDOWN --> EXTRACTOR_LLM