
안티 디텍션, 비전 폴백, 피어 투 피어 메시를 갖춘 에이전틱 웹 크롤러.
엔드포인트 · 메시 · 안티 디텍션 · 고스트 프로토콜 · 라이브 스트림 · MCP 도구 · 빠른 시작 · 벤치마크 · 아키텍처
JavaScript 렌더링, Camoufox 안티 디텍트 브라우저, 요청별 프록시 라우팅, 자율 에이전트 루프를 갖춘 풀스택 웹 크롤링 엔진. 네이티브 Rust 추출 엔진으로 페이지를 깔끔한 마크다운으로 변환한다. 표준 크롤링이 Cloudflare, CAPTCHA 또는 JavaScript 장벽에 의해 차단될 때, Ghost Protocol이 스크린샷을 캡처하고 비전 AI(Claude, GPT-4o 또는 Ollama)를 통해 콘텐츠를 추출한다. 단일 세션에서 OpenAI, Anthropic, Ollama 전반에 걸친 멀티 프로바이더 LLM 오케스트레이션을 지원한다. 노드는 분산 크롤링을 위해 가십 기반 피어 투 피어 메시를 통해 조정된다.
Grub을 선택하는 이유
우리는 모든 주요 크롤러의 기능을 통합한 뒤, 그 어느 것도 갖지 못한 기능을 추가했다.
자체 호스팅 크롤러
| 기능 | Crawl4AI | Firecrawl | Scrapy | Grub |
|---|
| JS 렌더링 | ✅ Playwright | ✅ Playwright | ❌ HTTP 전용 | ✅ Playwright |
| 안티 디텍트 브라우저 | stealth 플러그인 | ❌ | ❌ | ✅ Camoufox |
| Ghost Protocol | ❌ | ❌ | ❌ | ✅ 자동 폴백 |
| 요청별 프록시 | ✅ 에스컬레이션 | ❌ | 미들웨어 | ✅ 요청별 |
| 스텔스 패치 | ✅ | ❌ | ❌ | ✅ 옵트인 |
| 에이전트 루프 | ✅ 에이전틱 | ✅ /agent | ❌ 스파이더 | ✅ 바운디드 SM |
| 라이브 브라우저 스트림 | ✅ WebSocket | ✅ Live View | ❌ | ✅ WS + MJPEG |
| 마크다운 출력 | ✅ Fit Markdown | ✅ 코어 | ❌ | ✅ Rust 엔진 |
| PDF 추출 | ✅ PDF 전략 | ✅ 파싱 | ❌ | ✅ 텍스트 레이어 + OCR 폴백 |
| MCP 도구 | ✅ 커뮤니티 | ✅ 공식 | ⚠️ 커뮤니티 | ✅ 15개 도구 |
| 멀티 프로바이더 LLM | ✅ 모든 LLM | ⚠️ Gemini | ❌ | ✅ OpenAI/Anthropic/Ollama |
| 메시 P2P | ❌ | ❌ | ❌ | ✅ 가십 프로토콜 |
| 정책 적용 | ❌ | ❌ | ❌ | ✅ 도메인 게이트 + 리댁션 |
| 프롬프트 인젝션 방어 | ❌ | ❌ | ❌ | ✅ 격리 + 가시 텍스트 diff |
| 라이선스 | Apache 2.0 | AGPL-3.0 | BSD | BSD-3-Clause |
| 가격 | 무료 | 무료–$333/월 | 무료 | 자체 호스팅 |
클라우드 / 매니지드 크롤러
| 기능 | Browserbase | Scrapfly | Firecrawl Cloud | Grub |
|---|
| JS 렌더링 | ✅ 커스텀 Chromium | ✅ 독점 | ✅ Playwright | ✅ Playwright |
| 안티 디텍트 브라우저 | ✅ 커스텀 Chromium | ✅ 독점 | ✅ 클라우드 스텔스 | ✅ Camoufox |
| Ghost Protocol | ❌ | ❌ | ❌ | ✅ 자동 폴백 |
| 요청별 프록시 | ✅ 매니지드 | ✅ 1억 3천만+ IP | ✅ 클라우드 매니지드 | ✅ 요청별 |
| 스텔스 패치 | ✅ 내장 | ✅ 내장 | ✅ 내장 | ✅ 옵트인 |
| 에이전트 루프 | ✅ Stagehand | ⚠️ 통합을 통함 | ✅ /agent | ✅ 바운디드 SM |
| 라이브 브라우저 스트림 | ✅ iFrame + CDP | ✅ CDP | ✅ Live View | ✅ WS + MJPEG |
| 마크다운 출력 | ✅ MCP를 통함 | ✅ 내장 | ✅ 코어 | ✅ Rust 엔진 |
| MCP 도구 | ✅ 공식 | ✅ 공식 | ✅ 공식 | ✅ 15개 도구 |
| 메시 P2P | ❌ | ❌ | ❌ | ✅ 가십 프로토콜 |
| 정책 적용 | ❌ | ❌ | ❌ | ✅ 도메인 게이트 + 리댁션 |
| 프롬프트 인젝션 방어 | ❌ | ❌ | ❌ | ✅ 격리 + 가시 텍스트 diff |
| 자체 호스팅 가능 | ❌ 클라우드 전용 | ❌ 클라우드 전용 | ⚠️ 제한적 OSS | ✅ 전체 + Cloud Run |
| 가격 | 무료–$99/월 | 사용량 기반 | 무료–$333/월 | 자체 호스팅 |
Ghost Protocol을 갖춘 것은 Grub뿐이다 — 표준 크롤링이 실패할 때 차단된 페이지를 스크린샷으로 캡처하고 LLM을 통해 콘텐츠를 추출하는 자동 비전 기반 폴백. 예방(Camoufox + 프록시 + 스텔스)이 차단의 95%를 처리한다. Ghost Protocol이 나머지를 처리한다.
API 엔드포인트
핵심 크롤링
| 메서드 | 경로 | 설명 | 상태 |
|---|
POST | /api/crawl | 단일 URL 크롤링 (HTML + 마크다운) | Live |
POST | /api/markdown | 단일 또는 다중 URL 마크다운 추출 | Live |
POST | /api/batch | 작업 추적을 포함한 배치 크롤링 | Live |
POST | /api/raw | 원시 HTML 추출 (마크다운 없음) | Live |
GET | /view | 브라우저 렌더링 HTML 뷰어 | Live |
GET | /download | 크롤러를 통한 파일 다운로드 (PDF 등) | Live |
POST | /api/pdf/pages | PDF 페이지를 텍스트 + 렌더링된 PNG(base64)로 | Live |
PDF URL은 브라우저 없이 /api/crawl, /api/markdown, /api/batch에서 처리된다: 텍스트 레이어는
페이지별로 추출되며(PyMuPDF), 이미지만 있는 페이지는 구성된 비전 프로바이더로 OCR 폴백된다
(로컬 기본값: benhaotang/Nanonets-OCR-s를 사용하는 Ollama; 호스팅 모델을 사용하려면 키와 함께
AGENT_GHOST_VISION_PROVIDER=anthropic 또는 openai를 설정). OCR된 페이지는 모델 이름과 함께
source: "ocr"로 표시되고 해당 제목 아래에 <!-- ocr: <model> --> 마커가 붙어, 전사본이 원본
텍스트로 오인되지 않는다. 출력은 페이지당 하나의 ## Page N 섹션을 가진 마크다운이며,
render_mode는 pdf_text, pdf_vision, pdf_mixed 또는 pdf_empty를 보고한다.
에이전트 (모드 B)
| 메서드 | 경로 | 설명 | 상태 |
|---|
POST | /api/agent/run | 자율 에이전트 루프에 작업 제출 | Live |
GET | /api/agent/status/{run_id} | 에이전트 실행 상태 확인 / 트레이스 로드 | Live |
POST | /api/agent/ghost | Ghost Protocol: 스크린샷 + 비전 추출 | Live |
작업 관리
| 메서드 | 경로 | 설명 | 상태 |
|---|
POST | /api/jobs/create | 일반 작업 제출 | Live |
POST | /api/jobs/crawl | 단일 URL 크롤링 작업 제출 | Live |
POST | /api/jobs/batch-crawl | 배치 크롤링 작업 제출 | Live |
POST | /api/jobs/markdown | 마크다운 전용 작업 제출 | Live |
POST | /api/jobs/process-job | Cloud Tasks 워커 엔드포인트 | Live |
POST | /api/wraith | AI 기반 크롤링 워크플로 | Placeholder |
원격 캐시
| 메서드 | 경로 | 설명 | 상태 |
|---|
POST | /api/cache/search | 캐시된 콘텐츠 퍼지 검색 | Live |
GET | /api/cache/list | 캐시된 문서 메타데이터 목록 | Live |
GET | /api/cache/doc/{doc_id} | 캐시된 문서 하나 가져오기 | Live |
POST | /api/cache/upsert | 캐시 항목 업서트 | Live |
POST | /api/cache/prune | TTL/도메인별 캐시 항목 정리 | Live |
세션 관리
| 메서드 | 경로 | 설명 | 상태 |
|---|
GET | /api/sessions/{session_id}/files | 세션 파일 목록 | Live |
GET | /api/sessions/{session_id}/file | 특정 파일 가져오기 | Live |
GET | /api/sessions/{session_id}/status | 세션 진행 상태 | Live |
GET | /api/sessions/{session_id}/results | 모든 크롤링 결과 | Live |
GET | /api/sessions/{session_id}/screenshots | 스크린샷 목록 | Live |
라이브 스트림
| 메서드 | 경로 | 설명 | 상태 |
|---|
WS | /stream/{session_id} | WebSocket 뷰포트 스트림 | Live |
GET | /stream/{session_id}/mjpeg | MJPEG 폴백 스트림 | Live |
GET | /stream/{session_id}/status | 스트림 세션 상태 | Live |
GET | /stream/pool/status | 브라우저 풀 상태 | Live |
메시
| 메서드 | 경로 | 설명 | 상태 |
|---|
POST | /mesh/join | 피어 참여 + 가십 디스커버리 | Live |
POST | /mesh/heartbeat | 부하 메트릭을 포함한 피어 하트비트 | Live |
POST | /mesh/execute | 노드 간 도구 실행 (최대 1홉) | Live |
POST | /mesh/leave | 피어 이탈 알림 | Live |
GET | /mesh/peers | 알려진 피어 + 상태 목록 | Live |
GET | /mesh/status | 이 노드의 메시 상태 + 부하 | Live |
시스템
| 메서드 | 경로 | 설명 | 상태 |
|---|
GET | /health | 상태 확인 + 도구 수 + 메시 정보 | Live |
GET | /tools | 등록된 AHP 도구 목록 | Live |
GET | /site | 내장 랜딩 페이지 | Live |
GET | /{tool_name} | AHP 도구 실행 (캐치올) | Live |
MCP 도구 (grub-crawl.py)
MCP 브리지는 모든 기능을 MCP 호환 호스트에 노출한다: