본문 바로가기
  • AI 시대에 적응하는 현대인을 위한 지식 공간
  • AI를 위한 데이터를 과학으로 역어본다
AI 활용

n8n 커뮤니티노드 Crawl4AI를 활용한 웹 스크래핑 - FireCrawl 대체

by 피크나인 2026. 1. 11.

Crawl4AI 완벽 가이드 : n8n과 함께하는 AI 친화적 웹 스크래핑 (2025년 최신판)

핵심 키워드: Crawl4AI, n8n 웹 스크래핑, Docker 웹 크롤러, LLM 친화적 스크래핑, Firecrawl 대안, ARM64 웹 크롤링, 마크다운 변환


목 차


1. 왜 Crawl4AI인가?  |  Firecrawl 대안 선택 과정

웹 스크래핑 도구의 진화

웹 스크래핑은 현대 데이터 수집의 핵심 기술로 자리 잡았습니다. 특히 AI와 LLM(대형 언어 모델)의 발전으로 인해 단순한 HTML 수집을 넘어서 AI가 이해하기 쉬운 형태로 데이터를 변환하는 것이 중요해졌습니다. 기존의 웹 스크래핑 도구들은 원시 HTML을 그대로 반환하거나, 복잡한 후처리 과정을 필요로 했습니다. 하지만 최근에는 웹 페이지를 깔끔한 마크다운으로 변환하고, 메타데이터와 링크를 자동으로 구조화해주는 LLM 친화적인 도구들이 등장하면서 AI 기반 자동화 워크플로우 구축이 훨씬 수월해졌습니다.

n8n과 같은 워크플로우 자동화 플랫폼을 사용하는 개발자라면 웹 스크래핑 도구 선택이 매우 중요합니다. n8n의 HTTP Request 노드만으로는 JavaScript로 렌더링되는 동적 페이지를 처리하기 어렵고, 봇 감지를 우회하는 것도 쉽지 않습니다. 이러한 한계를 극복하기 위해 Firecrawl, Crawl4AI, Browserless 등 다양한 도구들이 개발되었으며, 각각의 장단점을 이해하고 적합한 도구를 선택하는 것이 성공적인 자동화 프로젝트의 첫걸음입니다.

웹 스크래핑 도구 비교

웹 스크래핑 도구를 선택할 때 고려해야 할 요소는 여러 가지가 있습니다. 설치의 용이성, 비용, 성능, 그리고 특정 환경에서의 호환성 등이 주요 기준이 됩니다. 아래 표는 현재 널리 사용되는 웹 스크래핑 도구들의 특징을 비교한 것입니다. 각 도구의 장단점을 파악하면 자신의 프로젝트에 가장 적합한 선택을 할 수 있습니다.

 

[ 웹스크립팅 도구별 특징 비교 ]

도구 방식 JavaScript 렌더링 LLM친화적출력 셀프호스팅 ARM64지원
HTTP Request 직접 요청 X X - -
Puppeteer/Playwright 헤드리스 브라우저 O X O O
Browserless 브라우저 서비스 O X O O
Firecrawl AI 스크래퍼 O O O X
Crawl4AI AI 스크래퍼 O O O O

 

표에서 볼 수 있듯이 Crawl4AI는 모든 주요 기능을 지원하면서도 ARM64 아키텍처까지 지원하는 유일한 AI 스크래핑 도구입니다. 이는 Apple Silicon Mac이나 ARM 기반 서버를 사용하는 개발자들에게 매우 중요한 장점입니다.

Firecrawl vs Crawl4AI 상세 비교

Firecrawl은 LLM 친화적인 웹 스크래핑 도구로 많은 인기를 얻었지만, Docker 셀프호스팅 환경에서 몇 가지 제약사항이 있습니다. 가장 큰 문제는 ARM64 아키텍처를 공식적으로 지원하지 않는다는 점입니다. Apple Silicon Mac(M1, M2, M3, M4)이나 AWS Graviton 같은 ARM 기반 서버에서 Firecrawl을 실행하려면 x86 에뮬레이션을 사용해야 하는데, 이는 성능 저하와 안정성 문제를 야기할 수 있습니다. 또한 Firecrawl의 Docker 구성은 여러 개의 컨테이너(API, Worker, Playwright Service, Redis)를 필요로 하여 리소스 사용량이 상대적으로 높습니다.

반면 Crawl4AI는 단일 컨테이너로 모든 기능을 제공하며, ARM64와 AMD64 모두를 네이티브로 지원합니다. 브라우저(Chromium/Playwright)가 컨테이너 내부에 포함되어 있어 별도의 브라우저 서비스를 구성할 필요가 없습니다. GitHub에서 50,000개 이상의 스타를 받은 활발한 오픈소스 프로젝트로, 커뮤니티 지원도 활발합니다. 아래 표는 두 도구의 Docker 환경에서의 차이점을 상세하게 비교한 것입니다.

 

[ Firecrawl과 Crawl4AI의 구성항목별 비교 ]

항목 Firecrawl Crawl4AI
Docker 이미지 다중 컨테이너 필요 단일 컨테이너
ARM64 지원 X (에뮬레이션 필요) O 네이티브 지원
브라우저 별도 Playwright 서비스 내장 Chromium
Redis 의존성 O 필수 X 불필요
메모리 사용량 높음 (4GB+) 보통 (2GB+)
API 스타일 REST REST
마크다운 출력 O O
LLM 추출 O O
MCP 서버 O O
웹 플레이그라운드 Bull Queue UI O /playground
라이선스 AGPL-3.0 Apache 2.0

 

결론적으로 ARM64 환경을 사용하거나, 간단한 구성을 원하거나, 리소스를 절약하고 싶다면 Crawl4AI가 더 적합한 선택입니다. 물론 Firecrawl도 훌륭한 도구이며, 특히 클라우드 API를 사용하거나 x86 서버 환경에서는 좋은 선택이 될 수 있습니다.

Crawl4AI의 주요 노드

Basic Crawler Node

  • Crawl Single URL - 단일 웹 페이지에서 콘텐츠 추출
  • Crawl Multiple URLs - 한 번의 작업으로 여러 웹 페이지 처리
  • Process Raw HTML - 크롤링 없이 원시 HTML에서 콘텐츠 추출

Content Extractor Node

  • CSS Selector Extractor - CSS 셀렉터를 사용하여 구조화된 데이터 추출
  • LLM Extractor - AI를 사용하여 웹페이지에서 구조화된 데이터 추출
  • JSON Extractor - 웹 페이지에서 JSON 데이터를 추출하고 처리합니다

2. Crawl4AI Docker 설치하기

사전 준비사항

Crawl4AI를 Docker로 설치하기 전에 몇 가지 준비가 필요합니다. Docker Desktop이 설치되어 있어야 하며, Docker Compose를 사용할 수 있는 환경이어야 합니다. n8n과 함께 사용하려면 두 서비스가 같은 Docker 네트워크에서 통신할 수 있도록 설정해야 합니다. 아래는 설치 전 확인해야 할 항목들입니다.

항목 요구사항 확인 방법
Docker 20.10 이상 docker --version
Docker Compose v2 이상 docker compose version
메모리 최소 2GB (권장 4GB) Docker Desktop 설정
디스크 약 3GB 이미지 + 캐시
네트워크 n8n과 공유 네트워크 docker network ls

 

Docker 네트워크는 n8n과 Crawl4AI가 서로 통신하기 위해 반드시 필요합니다. 만약 n8n이 이미 실행 중이라면, n8n이 사용하는 네트워크 이름을 확인하고 Crawl4AI도 같은 네트워크에 연결해야 합니다. 일반적으로 n8n-shared-network 또는 유사한 이름의 외부 네트워크를 사용합니다.

빠른 설치 (단독 실행)

가장 간단한 방법은 Docker 명령어로 직접 컨테이너를 실행하는 것입니다. 이 방법은 테스트 목적이나 Crawl4AI를 단독으로 사용할 때 적합합니다. 아래 명령어를 실행하면 즉시 Crawl4AI를 사용할 수 있습니다. --shm-size 옵션은 브라우저가 안정적으로 동작하기 위해 공유 메모리 크기를 늘려주는 설정으로, 반드시 포함해야 합니다.

# Crawl4AI 컨테이너 실행
docker run -d \
  -p 11235:11235 \
  --name crawl4ai \
  --shm-size=2g \
  unclecode/crawl4ai:latest

# 실행 확인
docker logs crawl4ai

# 웹 플레이그라운드 접속
# http://localhost:11235/playground

 

설치가 완료되면 웹 브라우저에서 http://localhost:11235/playground에 접속하여 Crawl4AI의 웹 기반 테스트 도구를 사용할 수 있습니다. 이 플레이그라운드에서는 다양한 설정을 GUI로 조정하고, 결과를 즉시 확인할 수 있어 학습과 테스트에 매우 유용합니다.

Docker Compose로 설치  |  n8n 연동용

n8n과 함께 사용하려면 Docker Compose를 사용하는 것이 좋습니다. 특히 n8n Queue Mode(고가용성 구성)를 사용하는 경우, 유틸리티 서비스들을 별도의 스택으로 관리하면 유지보수가 편리합니다. 아래는 utility-stack이라는 별도 스택에서 Crawl4AI를 구성하는 예제입니다. 이 구성은 기존 n8n 환경에 영향을 주지 않으면서 웹 스크래핑 기능을 추가할 수 있습니다.

 

파일 구조:

docker/
├── database-stack/
├── n8n-queue-stack/
|   ├── docker-compose.yml
|   └── .env
└── utility-stack/
    ├── docker-compose.yml
    └── .env (선택사항)

 

docker-compose.yml:

# =============================================================================
# Utility Stack - 웹 스크래핑 및 유틸리티 서비스
# =============================================================================
# Crawl4AI: AI 친화적 웹 스크래퍼
# - 단일 컨테이너로 모든 기능 제공
# - ARM64/AMD64 네이티브 지원
# - 내장 Chromium 브라우저
# =============================================================================

services:
  # ---------------------------------------------------------------------------
  # Crawl4AI: LLM 친화적 웹 스크래퍼
  # ---------------------------------------------------------------------------
  crawl4ai:
    image: unclecode/crawl4ai:latest
    container_name: crawl4ai
    restart: unless-stopped
    ports:
      - "11235:11235"
    environment:
      # 동시 작업 수 (서버 성능에 따라 조정)
      - MAX_CONCURRENT_TASKS=10
      # 타임존 설정
      - TZ=${TZ:-Asia/Seoul}
      # LLM 추출 기능 사용 시 (선택사항)
      # - OPENAI_API_KEY=${OPENAI_API_KEY}
      # - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    # 브라우저 안정성을 위한 공유 메모리 설정
    shm_size: '2gb'
    # 데이터 영속성 (캐시, 세션 등)
    volumes:
      - crawl4ai_data:/app/data
    networks:
      - n8n-shared-network
    # 헬스체크 설정
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11235/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

networks:
  # n8n과 공유하는 외부 네트워크
  n8n-shared-network:
    external: true
    name: n8n-shared-network

volumes:
  crawl4ai_data:

 

위 설정에서 중요한 점은 networks 섹션입니다. external: true로 설정하면 이미 존재하는 네트워크를 사용하겠다는 의미입니다. n8n이 사용하는 네트워크 이름을 정확히 입력해야 합니다. 만약 네트워크가 존재하지 않는다면 먼저 생성해야 합니다.

실행 및 확인

Docker Compose 파일을 작성했다면 아래 명령어로 서비스를 시작하고 정상 동작을 확인할 수 있습니다. 로그를 확인하여 오류가 없는지, 헬스체크가 통과하는지 살펴보는 것이 좋습니다.

# 네트워크 생성 (없는 경우)
docker network create n8n-shared-network

# 서비스 시작
cd utility-stack
docker compose up -d

# 상태 확인
docker compose ps

# 로그 확인
docker logs crawl4ai

# API 테스트
curl -X POST http://localhost:11235/crawl \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://example.com"]}'

 

API 테스트에서 "success": true가 반환되면 설치가 정상적으로 완료된 것입니다. 이제 웹 플레이그라운드(http://localhost:11235/playground)에서 다양한 기능을 테스트해볼 수 있습니다.

crawl4ai 커뮤니티 노드의 설치와 함께 다양한 구조의 웹사이트를 스크랩핑합니다.
crawl4ai 커뮤니티 노드의 설치와 함께 다양한 구조의 웹사이트를 스크랩핑합니다.

환경 변수 상세 설명

Crawl4AI Docker 이미지는 다양한 환경 변수를 지원합니다. 기본 설정만으로도 대부분의 기능을 사용할 수 있지만, 고급 기능을 활용하거나 성능을 최적화하려면 환경 변수를 적절히 설정해야 합니다. 아래 표는 주요 환경 변수와 그 용도를 설명합니다.

 

[ Crawl4AI docker-compose.yml파일의 환경 설정 값 ]

환경 변수 기본값 설명
MAX_CONCURRENT_TASKS 5 동시에 처리할 수 있는 크롤링 작업 수입니다. 서버 메모리와 CPU에 따라 조정하세요.
TZ UTC 타임존 설정입니다. 한국 시간을 사용하려면 Asia/Seoul로 설정합니다.
OPENAI_API_KEY (없음) OpenAI API 키입니다. LLM 기반 추출 기능을 사용할 때 필요합니다.
ANTHROPIC_API_KEY (없음) Anthropic API 키입니다. Claude 모델로 추출할 때 사용합니다.
GROQ_API_KEY (없음) Groq API 키입니다. 빠른 추론이 필요할 때 사용합니다.

 

LLM 관련 환경 변수는 선택사항입니다. Crawl4AI의 기본 기능(HTML, 마크다운, 링크 추출 등)은 API 키 없이도 모두 사용할 수 있습니다. LLM 추출 기능은 "이 페이지에서 상품명과 가격을 추출해줘"와 같은 자연어 명령으로 데이터를 구조화할 때만 필요합니다.


3. n8n 연동 방법

연동 방식 개요

n8n에서 Crawl4AI를 사용하는 방법은 크게 두 가지가 있습니다. 첫 번째는 HTTP Request 노드를 사용하여 Crawl4AI API를 직접 호출하는 방법이고, 두 번째는 Crawl4AI 커뮤니티 노드를 설치하여 GUI로 설정하는 방법입니다. 두 방법 모두 같은 API를 호출하므로 결과는 동일하지만, 사용 편의성과 유연성에서 차이가 있습니다.

 

[ HTTP Request 노드와 커뮤니티 노드를 활용한 Crawl4AI의 비교 ]

방식 장점 단점 추천 대상
HTTP Request 노드 모든 API 옵션 사용 가능, 별도 설치 불필요 JSON 직접 작성 필요 고급 사용자, 세밀한 제어 필요 시
커뮤니티 노드 GUI로 쉬운 설정, 직관적인 사용 일부 고급 옵션 제한 초보자, 빠른 구현 필요 시

 

어떤 방식을 선택하든 Crawl4AI 컨테이너가 n8n과 같은 Docker 네트워크에 있어야 합니다. 같은 네트워크에 있다면 http://crawl4ai:11235로 접근할 수 있고, 그렇지 않다면 http://localhost:11235 또는 서버 IP를 사용해야 합니다.

방법 1  |  HTTP Request 노드 사용

HTTP Request 노드는 n8n의 기본 노드로, 별도의 설치 없이 바로 사용할 수 있습니다. Crawl4AI의 모든 API 옵션을 사용할 수 있어 가장 유연한 방법입니다. 아래는 기본적인 설정 방법입니다.

 

노드 설정:

설정 항목 값
Method POST
URL http://crawl4ai:11235/crawl
Authentication None (셀프호스팅은 인증 불필요)
Body Content Type JSON
Specify Body Using JSON

 

기본 요청 본문:

{
  "urls": ["https://example.com"]
}

이것만으로도 웹 페이지의 HTML, 마크다운, 링크, 메타데이터를 모두 가져올 수 있습니다. 결과는 $json.results[0] 객체에 담겨 반환됩니다.

 

고급 요청 본문 (JavaScript 렌더링 대기):

{
  "urls": ["https://news.ycombinator.com"],
  "crawler_config": {
    "type": "CrawlerRunConfig",
    "params": {
      "wait_until": "networkidle",
      "page_timeout": 30000
    }
  }
}

 

wait_until 옵션은 페이지 로딩 완료를 판단하는 기준입니다. networkidle은 네트워크 요청이 500ms 동안 없을 때 로딩 완료로 판단합니다. JavaScript로 동적 콘텐츠를 로드하는 사이트에서 유용합니다.

 

결과 데이터 접근 (Expression):

// 마크다운 본문
{{ $json.results[0].markdown.raw_markdown }}

// 정제된 HTML
{{ $json.results[0].cleaned_html }}

// 페이지 제목
{{ $json.results[0].metadata.title }}

// 내부 링크 목록
{{ $json.results[0].links.internal }}

// 외부 링크 목록
{{ $json.results[0].links.external }}

고급 옵션을 사용하여 웹사이트를 크롤링한 결과는 HTML, 마크다운, 링크, 메타데이터 등 다양한 결과물을 확인할 수 있습니다.
고급 옵션을 사용하여 웹사이트를 크롤링한 결과는 HTML, 마크다운, 링크, 메타데이터 등 다양한 결과물을 확인할 수 있습니다.

방법 2  |  커뮤니티 노드 사용

Crawl4AI 커뮤니티 노드를 사용하면 GUI에서 옵션을 선택하는 방식으로 쉽게 설정할 수 있습니다. JSON을 직접 작성할 필요가 없어 초보자에게 적합합니다. 다만 n8n Queue Mode(main/worker 분리 구조)를 사용하는 경우, 모든 인스턴스에 노드를 설치해야 합니다.

 

설치 방법:

  1. n8n 설정(Settings) → Community Nodes 메뉴로 이동합니다
  2. 검색창에 crawl4ai를 입력합니다
  3. n8n-nodes-crawl4ai-enhanced 패키지를 선택하여 설치합니다 ('n8n-nodes-crawl4ai' 패키지를 선택하셔도 됩니다)
  4. n8n을 재시작하여 노드를 활성화합니다

Queue Mode 환경에서의 설치:

n8n Queue Mode를 사용하는 경우, 커뮤니티 노드는 main 인스턴스와 worker 인스턴스 모두에 설치되어야 합니다. 가장 간단한 방법은 공유 볼륨을 사용하는 것입니다. docker-compose.yml에서 n8n 데이터 볼륨을 main과 worker가 공유하도록 설정하면, main에서 설치한 커뮤니티 노드가 worker에서도 자동으로 사용됩니다.

# n8n-queue-stack/docker-compose.yml 일부
# 공유 볼륨 1) : n8n_data:/home/node/.n8n
# 공유 볼륨 2) : n8n_community_nodes:/home/node/.n8n/nodes
# 공유 볼륨 1)번만으로 공유하거나 또는 커뮤니티 전용 볼륨 2)를 추가로 만들어서 공유할 수 있음

services:
  n8n:
    volumes:
      - n8n_data:/home/node/.n8n  # 공유 볼륨
  
  n8n-worker:
    volumes:
      - n8n_data:/home/node/.n8n  # 같은 볼륨 마운트

volumes:
  n8n_data:  # 공유 볼륨 정의

 

Credential 설정:

커뮤니티 노드에서 Credential을 요구하는 경우 아래와 같이 설정합니다. 셀프호스팅 환경에서는 실제 인증이 필요하지 않으므로 더미 값을 입력해도 됩니다.

항목
Base URL http://crawl4ai:11235
API Key local (더미값) 또는 비워두기

 

Basic Crawler 노드 설정:

항목 설명
Operation Crawl Single URL 단일 URL 크롤링
URL {{ $json.url }} 이전 노드에서 전달받은 URL
Output Format Markdown 출력 형식이 마크다운 형태로 간소화됨

 

커뮤니티 노드의 결과는 HTTP Request보다 간소화되어 있어 $json.markdown으로 바로 접근할 수 있습니다.

n8n 워크플로우에서 Crawl4AI 노드를 연결하여 웹 데이터를 자동으로 수집하고 처리하는 과정
n8n 워크플로우에서 Crawl4AI 노드를 연결하여 웹 데이터를 자동으로 수집하고 처리하는 과정


4. Crawl4AI 핵심 기능 분석

기능 개요

Crawl4AI는 단순한 웹 크롤러를 넘어 AI 친화적인 데이터 추출 플랫폼입니다. 웹 페이지를 방문하여 HTML을 가져오는 것은 기본이고, 이를 깔끔한 마크다운으로 변환하고, 링크와 미디어를 구조화하며, 필요한 경우 AI를 활용해 특정 정보를 추출하는 기능까지 제공합니다. 아래는 Crawl4AI의 주요 기능을 입력, 처리, 출력 단계로 분류한 것입니다.

 

입력 옵션 (Input Options):

옵션 설명
urls 크롤링할 URL 목록입니다. 단일 URL 또는 여러 URL을 배열로 전달할 수 있습니다.
browser_config 브라우저 설정입니다. 뷰포트 크기, 헤드리스 모드, 프록시 등을 설정합니다.
crawler_config 크롤링 동작 설정입니다. 대기 조건, 타임아웃, JavaScript 실행 등을 제어합니다.

 

처리 옵션 (Process Options):

옵션 설명
wait_until 페이지 로딩 완료 조건입니다. load, domcontentloaded, networkidle 중 선택합니다.
js_code 페이지에서 실행할 커스텀 JavaScript 코드입니다. 버튼 클릭, 스크롤 등에 사용합니다.
css_selector 특정 요소만 추출할 때 사용하는 CSS 선택자입니다.
excluded_tags 추출에서 제외할 HTML 태그 목록입니다. 광고, 네비게이션 등을 제거할 때 유용합니다.


출력 유형 (Output Options):

출력 필드 설명
html 원본 HTML 전체입니다.
cleaned_html 불필요한 요소가 제거된 정제된 HTML입니다.
markdown.raw_markdown HTML을 변환한 마크다운입니다. LLM에 직접 전달하기 좋은 형식입니다.
markdown.fit_markdown 더 압축된 마크다운입니다. 토큰 절약이 필요할 때 사용합니다.
links.internal 같은 도메인 내부 링크 목록입니다.
links.external 외부 도메인 링크 목록입니다.
metadata 페이지 제목, 설명, Open Graph 태그 등의 메타 정보입니다.
screenshot 페이지 스크린샷 (base64 인코딩)입니다.
pdf 페이지를 PDF로 변환한 결과입니다.

마크다운 변환의 중요성

Crawl4AI의 가장 큰 장점 중 하나는 웹 페이지를 깔끔한 마크다운으로 변환해준다는 것입니다. 일반적인 웹 스크래핑 도구는 원시 HTML을 그대로 반환하기 때문에, 이를 AI가 이해할 수 있는 형태로 가공하려면 추가 작업이 필요합니다. HTML에는 스타일, 스크립트, 광고, 네비게이션 등 본문과 관련 없는 요소가 많이 포함되어 있어 LLM의 컨텍스트 윈도우를 낭비하게 됩니다.

 

Crawl4AI는 이러한 불필요한 요소를 자동으로 제거하고, 본문 콘텐츠만 추출하여 마크다운으로 변환합니다. 이렇게 변환된 마크다운은 GPT, Claude 등의 LLM에 직접 전달할 수 있어, RAG(Retrieval-Augmented Generation) 시스템이나 AI 에이전트 구축에 매우 유용합니다. 또한 fit_markdown 옵션을 사용하면 더 압축된 형태의 마크다운을 얻을 수 있어 토큰 비용을 절감할 수 있습니다.

링크 구조화 기능

Crawl4AI는 페이지 내의 모든 링크를 자동으로 분석하여 내부 링크와 외부 링크로 분류합니다. 각 링크에는 URL뿐만 아니라 텍스트, 제목, 기본 도메인 등의 정보가 포함됩니다. 이 기능은 웹사이트 구조 분석, 콘텐츠 색인화, 관련 페이지 크롤링 등에 활용할 수 있습니다.

 

링크 객체 구조:

{
  "href": "https://example.com/article/123",
  "text": "기사 제목",
  "title": "링크 타이틀 속성",
  "base_domain": "example.com"
}

 

이 구조화된 링크 정보를 활용하면 n8n의 Code 노드에서 간단한 필터링만으로 원하는 링크를 추출할 수 있습니다. 예를 들어 뉴스 기사 링크만 필터링하거나, 특정 패턴의 URL만 선택하는 작업이 매우 쉬워집니다.


5. 실전 테스트 시나리오

테스트 URL 목록

Crawl4AI의 다양한 기능을 검증하기 위해 여러 유형의 웹사이트를 테스트해봐야 합니다. 아래는 난이도별로 분류한 테스트 URL 목록입니다. 각 사이트는 서로 다른 기술적 특성을 가지고 있어 Crawl4AI의 다양한 기능을 확인할 수 있습니다.

난이도 사이트 URL 특징
쉬움 Example.com https://example.com 정적 HTML, 테스트 기본
쉬움 Wikipedia https://en.wikipedia.org/wiki/Web_scraping 정적, 테이블 포함
보통 Hacker News https://news.ycombinator.com 서버 렌더링, 링크 목록
보통 OpenAI News https://openai.com/news/?display=list JavaScript SPA
어려움 네이버 뉴스 https://n.news.naver.com/mnews/article/... 동적 로딩, 봇 감지

시나리오 1  |  정적 페이지 (Example.com)

가장 기본적인 테스트로, 정적 HTML 페이지를 크롤링합니다. 이 테스트를 통해 Crawl4AI가 정상적으로 동작하는지, 기본적인 출력 구조가 어떻게 되는지 확인할 수 있습니다.

 

요청:

{
  "urls": ["https://example.com"]
}

 

응답 확인 포인트:

항목 예상 결과
success true
results[0].html 전체 HTML 포함
results[0].markdown.raw_markdown 깔끔한 마크다운
results[0].metadata.title "Example Domain"
처리 시간 1초 미만

 

이 테스트가 성공하면 Crawl4AI의 기본 설치가 정상적으로 완료된 것입니다.

시나리오 2  |  JavaScript 렌더링 (OpenAI News)

많은 현대 웹사이트는 JavaScript를 사용하여 콘텐츠를 동적으로 로드합니다. React, Vue, Angular 같은 SPA(Single Page Application) 프레임워크로 만들어진 사이트가 대표적입니다. 이런 사이트는 초기 HTML에 실제 콘텐츠가 없고, JavaScript가 실행된 후에야 콘텐츠가 나타납니다.

 

요청:

{
  "urls": ["https://openai.com/news/?display=list"],
  "crawler_config": {
    "type": "CrawlerRunConfig",
    "params": {
      "wait_until": "networkidle",
      "page_timeout": 30000
    }
  }
}

 

응답 확인 포인트:

항목 예상 결과
markdown.raw_markdown 뉴스 기사 제목과 요약 포함
links.internal 개별 기사 링크 목록
처리 시간 3-10초

 

OpenAI 뉴스 페이지는 JavaScript로 기사 목록을 렌더링하므로, wait_until: networkidle 설정이 필수입니다. 이 설정 없이 크롤링하면 빈 페이지가 반환될 수 있습니다.

시나리오 3  |  한국어 뉴스 (네이버 뉴스)

네이버 뉴스는 한국어 콘텐츠 테스트와 함께 봇 감지 우회 능력을 확인할 수 있는 좋은 대상입니다. 많은 웹 스크래핑 도구가 네이버의 봇 감지에 막히지만, Crawl4AI는 실제 브라우저를 사용하기 때문에 상당히 높은 성공률을 보입니다.

 

요청:

{
  "urls": ["https://n.news.naver.com/mnews/article/015/0005084285"],
  "crawler_config": {
    "type": "CrawlerRunConfig",
    "params": {
      "wait_until": "networkidle"
    }
  }
}

 

응답에서 확인할 정보:

정보 위치
기사 제목 metadata.title 또는 markdown
기자명 markdown.raw_markdown 내 텍스트
작성일 markdown.raw_markdown 내 텍스트
본문 markdown.raw_markdown

 

네이버 뉴스 테스트가 성공하면 대부분의 한국 웹사이트에서도 Crawl4AI를 사용할 수 있습니다.

시나리오 4  |  링크 추출 및 필터링

실제 업무에서는 페이지 전체를 가져오는 것보다 특정 링크만 추출하는 경우가 많습니다. 예를 들어 뉴스 포털에서 기사 링크만 수집하거나, 쇼핑몰에서 상품 페이지 링크만 추출하는 작업이 있습니다. Crawl4AI의 links.internal 출력을 n8n의 Code 노드와 결합하면 이러한 작업을 쉽게 수행할 수 있습니다.

 

n8n Code 노드 예제 (뉴스 기사 링크 필터링):

// Crawl4AI 결과에서 내부 링크 추출
const links = $json.results[0].links.internal;

// 기사 URL 패턴으로 필터링
return links
  .filter(link => 
    link.href.includes('/article/') || 
    link.href.includes('/news/')
  )
  .filter(link => 
    link.text && link.text.length > 10  // 짧은 메뉴 텍스트 제외
  )
  .map(link => ({
    json: {
      title: link.text.trim(),
      url: link.href
    }
  }));

 

이 코드는 Crawl4AI가 추출한 내부 링크 중에서 URL에 /article/ 또는 /news/가 포함된 것만 필터링하고, 링크 텍스트가 10자 이상인 것만 선택합니다. 결과는 제목과 URL이 포함된 객체 배열로 반환됩니다.


6. 데이터 구조화 전략

추출 방법 비교

웹에서 수집한 데이터를 구조화하는 방법은 크게 세 가지가 있습니다. 각 방법은 장단점이 있으며, 상황에 따라 적절한 방법을 선택해야 합니다.

방법 설명 비용 정확도 유연성
Code 기반 CSS 선택자, 정규식 사용 무료 사이트별 다름 낮음 (사이트 변경 시 수정 필요)
AI 추출 LLM에 추출 지시 유료 (API 호출) 높음 높음 (자연어 지시)
하이브리드 기본은 Code, 복잡한 건 AI 중간 높음 높음

 

간단한 경우에는 Code 기반 방법으로 충분하고, 비정형 데이터나 복잡한 추출이 필요한 경우에는 AI 추출을 사용합니다. 비용과 정확도의 균형을 맞추려면 하이브리드 방식을 추천합니다.

Code 기반 추출

n8n의 Code 노드를 사용하면 JavaScript로 데이터를 파싱할 수 있습니다. Crawl4AI가 이미 링크와 메타데이터를 구조화해서 제공하기 때문에, 많은 경우 복잡한 파싱 없이도 원하는 데이터를 얻을 수 있습니다.

 

예제: 마크다운에서 제목과 본문 분리

const markdown = $json.results[0].markdown.raw_markdown;

// 첫 번째 줄을 제목으로 사용
const lines = markdown.split('\n').filter(line => line.trim());
const title = lines[0].replace(/^#+ /, '');  // # 기호 제거

// 나머지를 본문으로
const body = lines.slice(1).join('\n');

return [{
  json: {
    title: title,
    body: body,
    wordCount: body.split(/\s+/).length
  }
}];

AI 기반 추출 (LLM Extraction)

Crawl4AI는 자체적으로 LLM 추출 기능을 지원합니다. 이 기능을 사용하면 자연어로 추출 지시를 내릴 수 있어 매우 유연합니다. 다만 이 기능을 사용하려면 Crawl4AI 컨테이너에 LLM API 키(OpenAI, Anthropic 등)가 설정되어 있어야 합니다.

 

LLM 추출 요청 예제:

{
  "urls": ["https://openai.com/news/?display=list"],
  "extraction_config": {
    "type": "LLMExtractionStrategy",
    "params": {
      "provider": "openai/gpt-4o-mini",
      "instruction": "이 페이지에서 모든 뉴스 기사의 제목, 날짜, 카테고리, 요약을 추출해서 JSON 배열로 반환해줘"
    }
  }
}

 

AI 추출의 장점은 사이트 구조가 변경되어도 추출 지시만 명확하면 계속 동작한다는 것입니다. 단점은 API 호출 비용이 발생하고, 응답 시간이 길어질 수 있다는 것입니다.

실용적인 추출 전략

실제 프로젝트에서는 다음과 같은 전략을 추천합니다. 먼저 Crawl4AI의 기본 출력(links.internal, metadata)으로 해결되는지 확인합니다. 해결된다면 추가 비용 없이 데이터를 얻을 수 있습니다. 기본 출력으로 부족하다면 Code 노드에서 마크다운을 파싱합니다. 정규식이나 문자열 처리로 대부분의 경우 처리할 수 있습니다. 그래도 부족하다면 AI 추출을 사용합니다.

필요한 정보 추천 방법 비용
URL + 제목만 links.internal 무료
+ 메타데이터 metadata 무료
+ 본문 추출 Code 노드 + 마크다운 파싱 무료
복잡한 구조화 AI 추출 유료

7. 한계점과 트레이드오프

Crawl4AI의 한계

Crawl4AI는 강력한 도구이지만 만능은 아닙니다. 웹 스크래핑의 본질적인 한계와 함께 Crawl4AI 특유의 제약사항도 있습니다. 이러한 한계를 이해하고 적절한 대안을 준비해두는 것이 중요합니다.

 

기술적 한계:

한계 설명 대안
고급 봇 감지 Akamai, CloudFlare 등의 고급 봇 감지는 우회하기 어려울 수 있습니다 유료 프록시 서비스, 수동 쿠키 수집
로그인 필요 사이트 인증이 필요한 페이지는 추가 설정이 필요합니다 Hooks를 통한 쿠키 주입, 세션 관리
캡차 reCAPTCHA, hCaptcha 등은 자동 우회가 불가능합니다 수동 해결, 캡차 우회 서비스
속도 제한 대량 크롤링 시 대상 사이트의 차단을 받을 수 있습니다 요청 간격 조절, 프록시 로테이션

 

Docker API 모드의 제한:

Crawl4AI는 Python 라이브러리와 Docker REST API 두 가지 방식으로 사용할 수 있습니다. Docker API 모드는 편리하지만 Python 라이브러리의 모든 기능을 지원하지는 않습니다.

기능 Python 라이브러리 Docker API
기본 크롤링 O O
JavaScript 렌더링 O O
LLM 추출 O O
Stealth Mode O (enable_stealth=True) (!) 제한적
Undetected Browser O (browser_type="undetected") (!) 제한적
Custom Hooks O (함수 직접 전달) (!) 문자열로만 가능

봇 감지 우회에 대한 현실적 조언

웹 스크래핑 튜토리얼에서 "쉽게 봇 감지를 우회할 수 있다"고 설명하는 경우가 많지만, 현실은 다릅니다. Akamai Bot Manager, CloudFlare Bot Management 같은 기업용 봇 감지 솔루션은 매우 정교하며, 단순한 헤더 조작이나 스텔스 모드만으로는 우회하기 어렵습니다.

 

봇 감지 대응 단계:

  1. 기본 시도: Crawl4AI 기본 설정으로 크롤링 시도
  2. 대기 시간 추가: wait_until: networkidle, 요청 간격 조절
  3. 헤더 최적화: 실제 브라우저와 유사한 User-Agent, Accept 헤더 설정
  4. 프록시 사용: 주거용 프록시나 데이터센터 프록시 활용
  5. 수동 쿠키: 브라우저에서 수동으로 쿠키를 추출하여 주입
  6. 대안 모색: 공식 API가 있다면 API 사용 권장

특히 한국의 쿠팡, 네이버 쇼핑 등은 Akamai를 사용하여 봇을 감지합니다. 이런 사이트에서 안정적인 데이터 수집이 필요하다면 공식 제휴 API를 사용하거나, 수동 쿠키 수집 방식을 고려해야 합니다.

리소스 사용량

Crawl4AI는 실제 브라우저를 구동하기 때문에 HTTP Request보다 리소스 사용량이 높습니다. 특히 동시에 여러 페이지를 크롤링할 때 메모리 사용량이 급격히 증가할 수 있습니다.

항목 단일 페이지 동시 10페이지
메모리 약 500MB 약 2-3GB
CPU 보통 높음
처리 시간 1-5초 10-30초

 

리소스가 제한된 환경에서는 MAX_CONCURRENT_TASKS 환경 변수를 낮게 설정하고, 순차 처리를 고려해야 합니다.


8. 마무리 및 추천 리소스

핵심 요약

이 가이드에서는 Crawl4AI를 사용하여 n8n 워크플로우에서 웹 스크래핑을 구현하는 방법을 다루었습니다. Crawl4AI는 Firecrawl의 훌륭한 대안으로, 특히 ARM64 환경에서의 네이티브 지원과 단일 컨테이너 구성이 큰 장점입니다. 아래는 이 가이드의 핵심 내용을 정리한 것입니다.

 

왜 Crawl4AI인가:

  • ARM64(Apple Silicon) 네이티브 지원으로 M1/M2/M3/M4 Mac에서 안정적 동작
  • 단일 Docker 컨테이너로 간편한 설치 및 관리
  • LLM 친화적인 마크다운 출력으로 AI 워크플로우와 자연스러운 연동
  • 웹 플레이그라운드(/playground)를 통한 쉬운 테스트와 설정

n8n 연동 핵심:

  • HTTP Request 노드로 모든 API 기능 활용 가능
  • 커뮤니티 노드(n8n-nodes-crawl4ai-enhanced)로 GUI 기반 설정
  • Queue Mode 환경에서는 공유 볼륨을 통한 노드 설치 공유

실용적 팁:

  • 기본 출력(links, metadata)을 먼저 활용하고, 부족할 때만 AI 추출 사용
  • 봇 감지가 강한 사이트는 현실적인 기대치를 가지고 대안 준비
  • 리소스 제한 환경에서는 동시 처리 수를 낮게 설정

공식 리소스

리소스 URL 설명
공식 문서 https://docs.crawl4ai.com 모든 기능에 대한 상세 문서
GitHub https://github.com/unclecode/crawl4ai 소스 코드, 이슈 트래커
Docker Hub https://hub.docker.com/r/unclecode/crawl4ai Docker 이미지
Discord https://discord.gg/jP8KfhDhyN 커뮤니티 지원
n8n 커뮤니티 https://community.n8n.io n8n 관련 질문

다음 단계

Crawl4AI와 n8n의 기본적인 연동을 마스터했다면, 다음 단계로 아래 주제들을 학습해볼 것을 추천합니다.

  1. 고급 크롤링 기법: Hooks를 활용한 인증 처리, 세션 관리
  2. 대량 데이터 수집: 비동기 작업 큐(/crawl/job), 웹훅 알림
  3. AI 에이전트 구축: MCP 서버 연동, RAG 파이프라인
  4. 모니터링: Prometheus 메트릭, 에러 알림

웹 스크래핑은 지속적인 학습과 적응이 필요한 분야입니다. 웹사이트는 계속 변화하고, 봇 감지 기술도 발전합니다. 하지만 Crawl4AI와 같은 현대적인 도구와 n8n의 자동화 기능을 조합하면, 대부분의 웹 데이터 수집 요구사항을 효과적으로 해결할 수 있습니다.


부록: 빠른 참조 가이드

Docker 명령어 모음

# 설치 및 실행
docker run -d -p 11235:11235 --name crawl4ai --shm-size=2g unclecode/crawl4ai:latest

# 상태 확인
docker logs crawl4ai
docker ps | grep crawl4ai

# 재시작
docker restart crawl4ai

# 종료 및 삭제
docker stop crawl4ai
docker rm crawl4ai

# 이미지 업데이트
docker pull unclecode/crawl4ai:latest
docker stop crawl4ai && docker rm crawl4ai
docker run -d -p 11235:11235 --name crawl4ai --shm-size=2g unclecode/crawl4ai:latest

API 요청 예제 모음

기본 크롤링:

curl -X POST http://localhost:11235/crawl \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://example.com"]}'

 

JavaScript 렌더링:

curl -X POST http://localhost:11235/crawl \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["https://spa-website.com"],
    "crawler_config": {
      "type": "CrawlerRunConfig",
      "params": {"wait_until": "networkidle"}
    }
  }'

 

스크린샷 포함:

curl -X POST http://localhost:11235/crawl \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["https://example.com"],
    "crawler_config": {
      "type": "CrawlerRunConfig",
      "params": {"screenshot": true}
    }
  }'

n8n Expression 참조

// 성공 여부
{{ $json.success }}

// 마크다운 본문
{{ $json.results[0].markdown.raw_markdown }}

// 압축 마크다운
{{ $json.results[0].markdown.fit_markdown }}

// 원본 HTML
{{ $json.results[0].html }}

// 정제된 HTML
{{ $json.results[0].cleaned_html }}

// 페이지 제목
{{ $json.results[0].metadata.title }}

// 페이지 설명
{{ $json.results[0].metadata.description }}

// 내부 링크 배열
{{ $json.results[0].links.internal }}

// 외부 링크 배열
{{ $json.results[0].links.external }}

// 첫 번째 내부 링크 URL
{{ $json.results[0].links.internal[0].href }}

// 스크린샷 (base64)
{{ $json.results[0].screenshot }}