Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/deepbluedynamics/grubcrawler
OSINT (Open Source Intelligence)ReconnaissanceDynamic Analysis (Sandboxing)Web Proxies & InterceptionInformation GatheringWeb SecurityPenetration TestingUtilities & FrameworksMachine LearningRed TeamingCrawlerAnti-Bot
34719일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubdeepbluedynamics/grubcrawler

grubcrawler

세계에서 가장 빠른 에이전틱 크롤러. 되찾았다. 재창조했다. 전투 준비 완료.

저장소 보기웹사이트
Grub Crawler

License Python FastAPI Playwright MCP Ghost Protocol Live Stream Camoufox Proxy


안티-탐지, 비전 폴백, P2P 메시를 갖춘 에이전틱 웹 크롤러.


엔드포인트 · 메시 · 안티-탐지 · Ghost Protocol · 라이브 스트림 · MCP 도구 · 빠른 시작 · 벤치마크 · 아키텍처


JavaScript 렌더링, Camoufox 안티-탐지 브라우저, 요청별 프록시 라우팅, 자율 에이전트 루프를 갖춘 풀스택 웹 크롤링 엔진입니다. 네이티브 Rust 추출 엔진으로 페이지를 깔끔한 마크다운으로 변환합니다. 표준 크롤링이 Cloudflare, CAPTCHA 또는 JavaScript 벽에 막히면 Ghost Protocol이 스크린샷을 캡처하고 비전 AI(Claude, GPT-4o 또는 Ollama)를 통해 콘텐츠를 추출합니다. 단일 세션에서 OpenAI, Anthropic, Ollama를 아우르는 다중 제공업체 LLM 오케스트레이션을 지원합니다. 노드는 분산 크롤링을 위해 가십 기반 P2P 메시를 통해 조정됩니다.


Grub을 선택해야 하는 이유

우리는 모든 주요 크롤러의 기능을 통합했습니다 — 그리고 그 어느 크롤러도 갖지 못한 기능을 추가했습니다.

자체 호스팅 크롤러

클라우드 / 관리형 크롤러

Grub만이 Ghost Protocol을 갖추고 있습니다 — 표준 크롤링이 실패하면 차단된 페이지를 스크린샷으로 캡처하고 LLM을 통해 콘텐츠를 추출하는 자동 비전 기반 폴백입니다. 예방(Camoufox + 프록시 + 스텔스)은 차단의 95%를 처리합니다. Ghost Protocol이 나머지를 처리합니다.

API 엔드포인트

핵심 크롤링

에이전트 (모드 B)

작업 관리

원격 캐시

세션 관리

라이브 스트림

메시

시스템

MCP 도구 (grub-crawl.py)

MCP 브리지는 MCP 호환 호스트에 모든 기능을 노출합니다:

내부 모듈

에이전트 코어 (app/agent/)

제공업체 어댑터 (app/agent/providers/)

정책 게이트 (app/policy/)

파일용도상태

관찰 가능성 (app/observability/)

API 레이어

안티-탐지 (app/)

파일용도상태
stealth.pyplaywright-stealth 패치, 트래커 도메인 차단완료
proxy.py환경 변수 폴백이 있는 요청별 프록시 해석완료

메시 (app/mesh/)

인프라

에이전트 상태 머신```

INIT -> PLAN -> EXECUTE_TOOL -> OBSERVE -> PLAN -> ... -> RESPOND -> STOP | | +-- policy_denied ---------------------->+ +-- max_steps / max_wall_time / max_failures -> STOP +-- no_op_loop (3x empty) ------------> STOP +-- blocked (ghost trigger) -----------> GHOST -> OBSERVE

root@kitploit:~
매 반복마다 적용되는 중지 조건:
- `max_steps` (기본값: 12)
- `max_wall_time` (기본값: 90초)
- `max_failures` (기본값: 3)
- `no_op_loop` (연속 3회 빈 응답)
- `policy_denied` (차단된 도구/도메인)
- `completed` (에이전트가 텍스트로 응답)

## 안티 탐지

함께 중첩되는 3계층의 안티 탐지 기능입니다. Prevention은 차단이 발생하기 전에 막아내고, Ghost Protocol은 차단 이후를 처리합니다.

### Camoufox 엔진

C++ 수준의 핑거프린트 스푸핑을 갖춘 플러그형 안티 탐지 브라우저입니다. 수동 user-agent 트릭이 필요하지 않습니다 — Camoufox는 브라우저 레벨에서 컨텍스트별로 현실적인 핑거프린트를 생성하며, 여기에는 canvas, WebGL, 폰트, navigator 속성이 포함됩니다.```bash
# Switch engine (default: chromium)
BROWSER_ENGINE=camoufox

요청별 프록시

리지덴셜, 데이터센터 또는 커스텀 프록시 풀을 통해 크롤링 트래픽을 라우팅합니다. 환경 변수 기반 기본값으로 요청별 재정의를 지원합니다. Playwright와 완전히 호환되는 프록시 구성입니다.```bash

Env-based default

PROXY_SERVER=http://proxy.example.com:10001 PROXY_USERNAME=your_username PROXY_PASSWORD=your_password

Or per-request

curl -X POST http://localhost:6792/api/crawl
-H "Content-Type: application/json"
-d '{ "url": "https://example.com", "options": { "proxy": { "server": "http://proxy.example.com:10001", "username": "your_username", "password": "your_password" } } }'

root@kitploit:~
### 스텔스 모드

Chromium용 옵트인 `playwright-stealth` 패치(내장된 Camoufox에서는 건너뜀). 핑거프린트 노출을 줄이기 위해 20개 이상의 추적/분석 도메인(Google Analytics, DataDome, PerimeterX 등)을 차단합니다.```bash
STEALTH_ENABLED=true
BLOCK_TRACKING_DOMAINS=true

Ghost Protocol

크롤 결과가 안티봇 차단(Cloudflare 챌린지, CAPTCHA, 빈 SPA 셸)을 감지하면 에이전트가 클로크 모드로 전환할 수 있습니다:

  1. Playwright를 통해 전체 페이지 스크린샷 촬영
  2. 이미지를 비전 지원 LLM(Claude Sonnet 또는 GPT-4o)로 전송
  3. 렌더링된 픽셀에서 콘텐츠 추출
  4. 추출된 텍스트를 트레이스에 render_mode: "ghost"와 함께 반환

이 방식은 DOM 기반 안티봇 탐지를 완전히 우회합니다.

AGENT_GHOST_ENABLED=true가 필요합니다. AGENT_GHOST_AUTO_TRIGGER=true로 설정하면 감지된 차단 시 자동으로 트리거됩니다.

Mesh

에이전트가 에이전트와 통신합니다. 모든 Grub 인스턴스는 워커이자 코디네이터입니다. 로컬 노드는 클라우드로 오프로드하고, 클라우드는 로컬로 위임합니다. 도구 호출은 투명하게 네트워크를 통해 전달됩니다.``` Node A (local) Node B (cloud) ┌─────────────┐ ┌─────────────┐ │ AgentEngine │ │ AgentEngine │ │ ↓ │ │ ↓ │ │ MeshDispatcher ──── HTTP ────→ MeshDispatcher │ │ ↓ │ │ ↓ │ │ Dispatcher │ │ Dispatcher │ │ ↓ │ │ ↓ │ │ ToolRegistry │ │ ToolRegistry │ └─────────────┘ └─────────────┘ ↕ heartbeat (15s) ↕ └────────────────────────────────┘

root@kitploit:~
**작동 방식:**
- **Discovery** — 노드는 시드 피어 목록을 통해 조인한 다음, gossip(1-hop)으로 다른 노드를 학습합니다.
- **Heartbeat** — 15초마다 노드가 부하 지표를 교환합니다. 3회 누락 = 비정상. 2분 = 제거.
- **Routing** — MeshDispatcher는 부하, 지역성, 선호도에 따라 모든 노드에 점수를 매긴 다음, 도구 호출을 최적의 노드로 라우팅합니다.
- **1-hop max** — 노드 A → B만 가능하며, A → B → C는 불가능합니다. 라우팅 루프를 방지합니다.
- **Local fallback** — 원격 실행이 실패하면 로컬 Dispatcher로 폴백합니다.
- **HMAC auth** — 모든 메시 트래픽은 공유 비밀키로 서명됩니다(SHA-256, 60초 TTL).

### 로컬에서 2-노드 메시 실행하기```bash
# Docker Compose (recommended)
./deploy.sh mesh           # Linux/Mac
./deploy.ps1 -Target mesh  # Windows

# Verify
curl http://localhost:6792/mesh/peers  # Node A sees Node B
curl http://localhost:6793/mesh/peers  # Node B sees Node A

로컬을 Cloud Run에 연결```bash

Deploy to Cloud Run with mesh

./deploy.sh cloudrun latest --mesh-peer http://your-local-ip:6792 --mesh-secret mysecret

Start local node

MESH_ENABLED=true MESH_SECRET=mysecret MESH_PEERS=https://your-cloud-run-url
MESH_ADVERTISE_URL=http://your-local-ip:6792
uvicorn app.main:app --port 6792

root@kitploit:~
### 수동 설정```bash
# Node A
MESH_ENABLED=true MESH_NODE_NAME=local MESH_SECRET=test123 \
  MESH_ADVERTISE_URL=http://localhost:6792 \
  uvicorn app.main:app --port 6792

# Node B
MESH_ENABLED=true MESH_NODE_NAME=cloud MESH_SECRET=test123 \
  MESH_PEERS=http://localhost:6792 \
  MESH_ADVERTISE_URL=http://localhost:8081 \
  uvicorn app.main:app --port 8081

메시가 비활성화된 경우(MESH_ENABLED=false, 기본값), Grub은 메시 오버헤드가 전혀 없는 일반적인 단일 노드 크롤러로 작동합니다.

라이브 스트림

크롤러가 실시간으로 작동하는 모습을 지켜보세요. 상시 유지되는 웜 Chromium 인스턴스 풀이 WebSocket 또는 MJPEG를 통해 뷰포트 프레임을 스트리밍합니다.

WebSocket — 연결하여 대화형 명령을 전송하세요:```javascript const ws = new WebSocket("ws://localhost:6792/stream/my-session?url=https://example.com"); ws.onmessage = (e) => { const msg = JSON.parse(e.data); if (msg.type === "frame") document.getElementById("viewport").src = "data:image/jpeg;base64," + msg.data; }; // Navigate, click, scroll, type — all over the same socket ws.send(JSON.stringify({ action: "navigate", url: "https://example.com/pricing" })); ws.send(JSON.stringify({ action: "click", selector: "#signup-btn" })); ws.send(JSON.stringify({ action: "scroll", direction: "down" }));

root@kitploit:~
**MJPEG** — `` 태그에 넣으면 즉시 영상:```html
<img src="http://localhost:6792/stream/my-session/mjpeg?url=https://example.com" />

BROWSER_STREAM_ENABLED=true가 필요합니다. 각 Chromium 인스턴스는 약 150~300MB RAM을 사용합니다.

빠른 시작

로컬 개발```bash

git clone cd grub-crawl cp .env.example .env pip install -r requirements.txt uvicorn app.main:app --reload --host 0.0.0.0 --port 6792

root@kitploit:~
### Agent Mode B 활성화```bash
# Add to .env
AGENT_ENABLED=true
OPENAI_API_KEY=sk-...
# or
ANTHROPIC_API_KEY=sk-ant-...
AGENT_PROVIDER=anthropic

에이전트 작업 제출```bash

curl -X POST http://localhost:6792/api/agent/run
-H "Content-Type: application/json"
-d '{ "task": "Find the pricing page on example.com and extract plan details", "max_steps": 10, "allowed_domains": ["example.com"] }'

root@kitploit:~
### Docker```bash
# Single node
./deploy.sh local            # or ./deploy.ps1 -Target local

# 2-node mesh
./deploy.sh mesh             # or ./deploy.ps1 -Target mesh

# Cloud Run
./deploy.sh cloudrun v1.0.0  # or ./deploy.ps1 -Target cloudrun -Tag v1.0.0

# Cloud Run + mesh (connect to local node)
./deploy.sh cloudrun v1.0.0 --mesh-peer http://your-ip:6792 --mesh-secret mykey

탐지 방지 (Camoufox + 프록시)```bash

Add to .env

BROWSER_ENGINE=camoufox STEALTH_ENABLED=true BLOCK_TRACKING_DOMAINS=true

Optional: proxy

PROXY_SERVER=http://proxy.example.com:10001 PROXY_USERNAME=your_username PROXY_PASSWORD=your_password

root@kitploit:~
### Ghost Protocol (안티봇 우회)```bash
# Add to .env
AGENT_GHOST_ENABLED=true

curl -X POST http://localhost:6792/api/agent/ghost \
  -H "Content-Type: application/json" \
  -d '{"url": "https://blocked-site.com"}'

실시간 브라우저 스트림```bash

Add to .env

BROWSER_STREAM_ENABLED=true BROWSER_POOL_SIZE=2

MJPEG (open in browser)

open "http://localhost:6792/stream/demo/mjpeg?url=https://example.com"

root@kitploit:~
## 구성

### 서버
- `HOST` (기본값: 0.0.0.0)
- `PORT` (기본값: 6792)
- `DEBUG` (기본값: false)

### 스토리지
- `STORAGE_PATH` (기본값: ./storage)
- `RUNNING_IN_CLOUD` (기본값: false)
- `GCS_BUCKET_NAME`
- `GOOGLE_CLOUD_PROJECT`

### 인증
- `DISABLE_AUTH` (기본값: false)
- `GNOSIS_AUTH_URL` (기본값: http://gnosis-auth:5000)

### 브라우저 엔진
- `BROWSER_ENGINE` — chromium | camoufox (기본값: chromium)

### 크롤링
- `MAX_CONCURRENT_CRAWLS` (기본값: 5)
- `CRAWL_TIMEOUT` (기본값: 30)
- `ENABLE_JAVASCRIPT` (기본값: true)
- `ENABLE_SCREENSHOTS` (기본값: false)

### 프록시
- `PROXY_SERVER` — 프록시 URL (예: http://proxy:10001)
- `PROXY_USERNAME`
- `PROXY_PASSWORD`
- `PROXY_BYPASS` — 쉼표로 구분된 바이패스 목록

### 스텔스
- `STEALTH_ENABLED` (기본값: false) — playwright-stealth 패치
- `BLOCK_TRACKING_DOMAINS` (기본값: false) — 분석/추적 요청 차단

### 에이전트 (모드 B)
- `AGENT_ENABLED` (기본값: false)
- `AGENT_MAX_STEPS` (기본값: 12)
- `AGENT_MAX_WALL_TIME_MS` (기본값: 90000)
- `AGENT_MAX_FAILURES` (기본값: 3)
- `AGENT_ALLOWED_TOOLS` — 쉼표로 구분된 허용 목록
- `AGENT_ALLOWED_DOMAINS` — 쉼표로 구분된 허용 목록
- `AGENT_BLOCK_PRIVATE_RANGES` (기본값: true)
- `AGENT_REDACT_SECRETS` (기본값: true)

### LLM 프로바이더
- `AGENT_PROVIDER` — openai | anthropic | ollama (기본값: openai)
- `OPENAI_API_KEY`
- `OPENAI_MODEL` (기본값: gpt-4.1-mini)
- `ANTHROPIC_API_KEY`
- `ANTHROPIC_MODEL` (기본값: claude-3-5-sonnet-latest)
- `OLLAMA_BASE_URL` (기본값: http://localhost:11434)
- `OLLAMA_MODEL` (기본값: llama3.1:8b-instruct)

### Ghost Protocol
- `AGENT_GHOST_ENABLED` (기본값: false)
- `AGENT_GHOST_AUTO_TRIGGER` (기본값: true)
- `AGENT_GHOST_VISION_PROVIDER` — AGENT_PROVIDER에서 상속
- `AGENT_GHOST_MAX_IMAGE_WIDTH` (기본값: 1280)

### 메시
- `MESH_ENABLED` (기본값: false) — 마스터 스위치
- `MESH_PEERS` — 쉼표로 구분된 시드 피어 URL
- `MESH_NODE_NAME` — 사람이 읽을 수 있는 이름 (기본값: hostname)
- `MESH_SECRET` — 노드 간 인증용 공유 HMAC 시크릿
- `MESH_ADVERTISE_URL` — 피어가 이 노드에 도달할 때 사용하는 URL
- `MESH_PREFER_LOCAL` (기본값: true) — 로컬 실행 선호
- `MESH_HEARTBEAT_INTERVAL_S` (기본값: 15)
- `MESH_PEER_TIMEOUT_S` (기본값: 45) — 이 시간 후 비정상으로 표시
- `MESH_PEER_REMOVE_S` (기본값: 120) — 이 시간 후 피어 테이블에서 제거
- `MESH_REMOTE_TIMEOUT_MS` (기본값: 35000) — 원격 도구 호출 타임아웃

### 라이브 스트림
- `BROWSER_POOL_SIZE` (기본값: 1)
- `BROWSER_STREAM_ENABLED` (기본값: false)
- `BROWSER_STREAM_QUALITY` (기본값: 25) — JPEG 품질 1-100
- `BROWSER_STREAM_MAX_WIDTH` (기본값: 854)
- `BROWSER_STREAM_MAX_LEASE_SECONDS` (기본값: 300)

## 응답 계약

`POST /api/markdown`는 다음을 반환합니다:

`success`, `url`, `final_url`, `status_code`, `markdown`, `markdown_plain`, `content`, `render_mode`, `wait_strategy`, `timings_ms`, `blocked`, `block_reason`, `captcha_detected`, `http_error_family`, `body_char_count`, `body_word_count`, `visible_char_count`, `visible_word_count`, `visible_similarity`, `quarantined`, `quarantine_reason`, `policy_flags`, `content_quality`, `extractor_version`, `normalized_url`, `content_hash`

### 콘텐츠 품질

- `blocked` — 안티봇/캡차/챌린지
- `empty` — 신호가 매우 낮음
- `minimal` — 콘텐츠가 부족하거나 오류 페이지
- `sufficient` — 요약에 사용 가능

`content_quality == "sufficient"`가 아닌 경우 요약하지 마십시오.

### 프롬프트 인젝션 방어

- `quarantined=true`는 추출기가 페이지의 표시된 렌더링 텍스트에는 없는, 추출된 콘텐츠 내의 명령어 형태 텍스트를 감지했음을 의미합니다 (일반적인 `.sr-only`/시각적으로 숨겨진 콘텐츠 악용).
- 격리된 경우 `content_quality`는 `minimal`로 낮아지고, `policy_flags`에는 `hidden_text_suspected` 및 `quarantined`가 포함되며, `content`/`markdown` 출력은 공백 처리됩니다(실패 시 폐쇄).

### 오류 형식```json
{"error": "http_error|validation_error|internal_error", "status": 400, "details": {}}

벤치마크

전투 경기장 — Crawl4AI, Firecrawl(자체 호스팅), Scrapy와의 일대일 벤치마크. 모든 테스트는 동일한 머신, 동일한 URL, 동일한 조건에서 실행됩니다. Grub은 기준선(baseline)으로 먼저 실행되며, 나머지 어댑터는 무작위 순서로 10초 간격으로 실행되어 속도 제한(rate-limiting) 편향을 방지합니다.

단일 URL 속도 (ms, 낮을수록 좋음)

Grub은 단일 URL 속도 경주에서 5판 4승을 기록합니다. Markdown 변환은 네이티브 Rust 엔진(grub_md)을 통해 0-21ms로 실행됩니다.

Grub 단계별 분석 (서버 측 ms)

탐색(navigation)이 지배적입니다. markdown 변환은 대부분의 페이지에서 1밀리초 미만이며, 이는 Rust 엔진 덕분입니다.

배치 처리량 (ms, 낮을수록 좋음)

Grub은 배치 크기 3개 중 2개에서 승리합니다. URL당 비용: 163-312ms(Grub) 대 255-477ms(기타).

실행 방법```bash

Start Grub

docker compose up -d

Start Firecrawl (optional)

docker compose -f combat/firecrawl-compose.yaml up -d

Install combat deps

pip install crawl4ai scrapy markdownify tabulate

Run the arena

pytest combat/ -m combat -v

Generate report

python -m combat.report

root@kitploit:~
## 개발 현황

### 1단계: 핵심 인프라 ✅
### 2단계: 크롤링 ✅
### 3단계: 에이전트 모듈 ✅
- [x] 에이전트 코어 — 상태 머신, 타입, 오류 (W1)
- [x] 통합 도구 계약 — 타임아웃/재시도를 지원하는 디스패처 (W2)
- [x] 정책 게이트 — 도메인 허용 목록, 사설 범위 거부, 편집 (W3)
- [x] 관측 가능성 — EventBus, TraceCollector, RunSummary 영속화 (W4)
- [x] API 연결 — `/api/agent/run`, `/api/agent/status`, JobType.AGENT_RUN (W5)
- [x] 공급자 어댑터 — 폴백을 지원하는 OpenAI, Anthropic, Ollama (W6)
- [x] 설정 플래그 — agent, provider, ghost, stream 설정 (W7)

### 4단계: 고스트 프로토콜 ✅
- [x] 클록 모드 트리거 감지 (W8)
- [x] 스크린샷 캡처 파이프라인 (W8)
- [x] Claude/GPT-4o를 통한 비전 추출 (W8)
- [x] 엔진의 폴백 체인 (W8)
- [x] 외부 호출자를 위한 고스트 도구 (W8)
- [x] 고스트 MCP 도구 + REST 엔드포인트 (W8)

### 5단계: 라이브 브라우저 스트림 ✅
- [x] 임대/반환 방식의 영구 브라우저 풀 (W9)
- [x] CDP 스크린캐스트 릴레이 (W9)
- [x] 대화형 명령을 지원하는 WebSocket 엔드포인트 (W9)
- [x] MJPEG 폴백 스트림 (W9)
- [x] 스트림 상태 + 풀 상태 엔드포인트 (W9)

### 5.5단계: 안티-탐지 ✅
- [x] Camoufox 안티-탐지 브라우저 엔진 (W10)
- [x] 환경 변수 폴백이 포함된 요청별 프록시 (W10)
- [x] Chromium용 스텔스 패치 (W10)
- [x] 트래커/분석 도메인 차단 (W10)
- [x] Anthropic 비전 형식 감지 수정 (W10)

### 6단계: 메시 코디네이터 ✅
- [x] gossip 기반 피어 발견 (1-hop) (W11)
- [x] HMAC-SHA256 노드 간 인증 (W11)
- [x] 로드 메트릭 + 시드 재시도를 포함한 하트비트 루프 (W11)
- [x] MeshDispatcher — 투명한 크로스-노드 도구 라우팅 (W12)
- [x] 지역성/선호도 보너스가 적용된 로드 기반 점수 (W12)
- [x] 배포 스크립트 — 로컬, 메시, Cloud Run (W12)
- [x] Docker Compose 2-노드 메시 토폴로지 (W12)
- [x] 임베디드 랜딩 페이지 (grub-site) (W12)

### 7단계: 성능 + 강화
- [x] Rust 마크다운 엔진 (`grub_md`) — PyO3 네이티브 확장, 서브-ms 변환
- [x] 컴뱃 아레나 — Crawl4AI, Firecrawl, Scrapy 대비 자동 벤치마크
- [x] 유닛 테스트 스위트 — 모든 모듈에 걸친 176개 테스트
- [ ] 오류 처리 개선
- [ ] 모니터링 및 알림

전체 아키텍처 계획은 [MASTER_PLAN.md](https://github.com/deepbluedynamics/grubcrawler/blob/HEAD/MASTER_PLAN.md)를 참조하세요.

## 라이선스

Grub Crawler 프로젝트 라이선스
도구 다운로드
기능Crawl4AIFirecrawlScrapyGrub
JS 렌더링✅ Playwright✅ Playwright❌ HTTP 전용✅ Playwright
안티-탐지 브라우저스텔스 플러그인❌❌✅ Camoufox
Ghost Protocol❌❌❌✅ 자동 폴백
요청별 프록시✅ 에스컬레이션❌미들웨어✅ 요청별
스텔스 패치✅❌❌✅ 옵트인
에이전트 루프✅ 에이전틱✅ /agent❌ 스파이더✅ 제한된 SM
라이브 브라우저 스트림✅ WebSocket✅ Live View❌✅ WS + MJPEG
마크다운 출력✅ Fit Markdown✅ 코어❌✅ Rust 엔진
MCP 도구✅ 커뮤니티✅ 공식⚠️ 커뮤니티✅ 15개 도구
다중 제공업체 LLM✅ 모든 LLM⚠️ Gemini❌✅ OpenAI/Anthropic/Ollama
메시 P2P❌❌❌✅ 가십 프로토콜
정책 시행❌❌❌✅ 도메인 게이트 + 마스킹
프롬프트 인젝션 방어❌❌❌✅ 격리 + 표시 텍스트 diff
라이선스Apache 2.0AGPL-3.0BSD독점
가격무료무료–$333/월무료자체 호스팅
기능BrowserbaseScrapflyFirecrawl CloudGrub
JS 렌더링✅ 사용자 정의 Chromium✅ 독점✅ Playwright✅ Playwright
안티-탐지 브라우저✅ 사용자 정의 Chromium✅ 독점✅ 클라우드 스텔스✅ Camoufox
Ghost Protocol❌❌❌✅ 자동 폴백
요청별 프록시✅ 관리형✅ 1억 3,000만+ IP✅ 클라우드 관리형✅ 요청별
스텔스 패치✅ 내장✅ 내장✅ 내장✅ 옵트인
에이전트 루프✅ Stagehand⚠️ 통합을 통해✅ /agent✅ 제한된 SM
라이브 브라우저 스트림✅ iFrame + CDP✅ CDP✅ Live View✅ WS + MJPEG
마크다운 출력✅ MCP를 통해✅ 내장✅ 코어✅ Rust 엔진
MCP 도구✅ 공식✅ 공식✅ 공식✅ 15개 도구
메시 P2P❌❌❌✅ 가십 프로토콜
정책 시행❌❌❌✅ 도메인 게이트 + 마스킹
프롬프트 인젝션 방어❌❌❌✅ 격리 + 표시 텍스트 diff
자체 호스팅 가능❌ 클라우드 전용❌ 클라우드 전용⚠️ 제한된 OSS✅ 전체 + Cloud Run
가격무료–$99/월사용량 기반무료–$333/월자체 호스팅
메서드경로설명상태
POST/api/crawl단일 URL 크롤링 (HTML + 마크다운)활성
POST/api/markdown단일 또는 다중 URL 마크다운 추출활성
POST/api/batch작업 추적이 포함된 배치 크롤링활성
POST/api/raw원시 HTML 추출 (마크다운 없음)활성
GET/view브라우저 렌더링 HTML 뷰어활성
GET/download크롤러를 통한 파일 다운로드 (PDF 등)활성
메서드경로설명상태
POST/api/agent/run자율 에이전트 루프에 작업 제출활성
GET/api/agent/status/{run_id}에이전트 실행 상태 확인 / 추적 로드활성
POST/api/agent/ghostGhost Protocol: 스크린샷 + 비전 추출활성
메서드경로설명상태
POST/api/jobs/create일반 작업 제출활성
POST/api/jobs/crawl단일 URL 크롤링 작업 제출활성
POST/api/jobs/batch-crawl배치 크롤링 작업 제출활성
POST/api/jobs/markdown마크다운 전용 작업 제출활성
POST/api/jobs/process-jobCloud Tasks 작업자 엔드포인트활성
POST/api/wraithAI 기반 크롤링 워크플로플레이스홀더
메서드경로설명상태
POST/api/cache/search캐시된 콘텐츠 퍼지 검색활성
GET/api/cache/list캐시된 문서 메타데이터 목록활성
GET/api/cache/doc/{doc_id}캐시된 문서 하나 가져오기활성
POST/api/cache/upsert캐시 항목 Upsert활성
POST/api/cache/pruneTTL/도메인별 캐시 항목 정리활성
메서드경로설명상태
GET/api/sessions/{session_id}/files세션 파일 목록활성
GET/api/sessions/{session_id}/file특정 파일 가져오기활성
GET/api/sessions/{session_id}/status세션 진행 상태활성
GET/api/sessions/{session_id}/results모든 크롤링 결과활성
GET/api/sessions/{session_id}/screenshots스크린샷 목록활성
메서드경로설명상태
WS/stream/{session_id}WebSocket 뷰포트 스트림활성
GET/stream/{session_id}/mjpegMJPEG 폴백 스트림활성
GET/stream/{session_id}/status스트림 세션 상태활성
GET/stream/pool/status브라우저 풀 상태활성
메서드경로설명상태
POST/mesh/join피어 조인 + 가십 디스커버리활성
POST/mesh/heartbeat부하 메트릭이 포함된 피어 하트비트활성
POST/mesh/execute크로스 노드 도구 실행 (최대 1홉)활성
POST/mesh/leave피어 이탈 알림활성
GET/mesh/peers알려진 피어 + 상태 정보 목록활성
GET/mesh/status이 노드의 메시 상태 + 부하활성
메서드경로설명상태
GET/health상태 확인 + 도구 수 + 메시 정보활성
GET/tools등록된 AHP 도구 목록활성
GET/site내장 랜딩 페이지활성
GET/{tool_name}AHP 도구 실행 (catch-all)활성
도구설명상태
crawl_urlJS 주입을 통한 단일 URL 마크다운 추출활성
crawl_batch최대 50개 URL에 대한 배치 처리 및 결과 수집활성
raw_html변환 없는 원시 HTML 가져오기활성
download_file크롤러를 통한 파일 다운로드 (PDF 등)활성
crawl_validate콘텐츠 품질 평가활성
crawl_search로컬 크롤 캐시 퍼지 검색활성
crawl_cache_list로컬 캐시 파일 목록활성
crawl_remote_search원격 크롤러 캐시 검색활성
crawl_remote_cache_list원격 캐시 항목 목록활성
crawl_remote_cache_doc원격 캐시 문서 가져오기활성
agent_run자율 에이전트에 작업 제출 (모드 B)활성
agent_status에이전트 실행 상태 확인활성
ghost_extractGhost Protocol: 스크린샷 + 비전 AI 추출활성
mesh_peers메시 피어 및 해당 상태/부하 상태 목록활성
mesh_status이 노드의 메시 상태 및 부하 메트릭 가져오기활성
set_auth_token.wraithenv에 인증 토큰 저장활성
crawl_status구성 및 연결 보고활성
파일용도상태
types.pyRunState 열거형, StopReason, ToolCall, ToolResult, AssistantAction, RunConfig, RunContext, StepTrace, RunResult완료
errors.py타입화된 오류: validation_error, policy_denied, tool_timeout, tool_unavailable, execution_error, provider_error, stop_condition완료
dispatcher.py도구 검증, 타임아웃 적용(30초), 재시도(1회), 타입화된 오류 정규화완료
engine.py제한된 루프: plan -> execute -> observe -> stop. EventBus 통합. (RunResult, RunSummary) 반환완료
ghost.pyGhost Protocol: 차단 감지, 스크린샷 캡처, 비전 추출, 자동 트리거완료
파일용도상태
base.pyLLMAdapter ABC, FallbackAdapter(실패 시 순환), 팩토리 함수완료
openai_adapter.pyOpenAI tool_calls 매핑, GPT-4o 비전완료
anthropic_adapter.pyAnthropic tool_use/tool_result 블록, Claude Sonnet 비전완료
ollama_adapter.pyOllama HTTP /api/chat, llava 비전완료
domain.py
도메인 허용 목록, RFC-1918/루프백/링크-로컬 거부
완료
gate.pyPolicyVerdict로 도구 실행 전 및 가져오기 전 정책 검사완료
redaction.py비밀 패턴 마스킹 (API 키, JWT, 개인 키)완료
파일용도상태
events.pyEventBus + 7가지 타입화된 이벤트: run_start, step_start, tool_dispatch, tool_result, policy_denied, step_end, run_end완료
trace.pyTraceCollector, RunSummary JSON 직렬화, 스토리지를 통한 persist_trace() / load_trace()완료
파일용도상태
agent_routes.pyPOST /api/agent/run, GET /api/agent/status/{run_id}. 비활성화 시 503완료
routes.py핵심 크롤/마크다운/배치/캐시 REST 엔드포인트완료
job_routes.py작업 CRUD, 세션 상태, Cloud Tasks 작업자완료
jobs.pyJobType 열거형(AGENT_RUN 포함), JobManager, JobProcessor완료
models.pyAgentRunRequest/Response를 포함한 모든 Pydantic 모델완료
파일용도상태
models.py와이어 프로토콜 모델: NodeInfo, NodeLoad, MeshToolRequest/Response, PeerState완료
auth.py60초 TTL의 HMAC-SHA256 토큰 서명/검증완료
client.pyjoin, heartbeat, leave, execute_tool용 httpx 비동기 클라이언트완료
coordinator.py수명 주기, 피어 테이블, 시드 재시도가 있는 하트비트 루프완료
routes.py/mesh/* 엔드포인트 — join, heartbeat, execute, leave, peers, status완료
router.py부하 점수 계산 + 대상 선택 (순수 로직, I/O 없음)완료
dispatcher.py투명한 라우팅을 위해 로컬 Dispatcher를 래핑하는 MeshDispatcher완료
파일용도상태
config.py에이전트 + 제공업체 + ghost + 프록시 + 스텔스 구성 등 모든 환경 변수완료
storage.py사용자 분할 스토리지 (로컬 파일 시스템 / GCS)완료
crawler.py프록시 지원이 포함된 Playwright 크롤링 엔진완료
markdown.pyHTML에서 마크다운으로 변환완료
browser.py브라우저 자동화 — Chromium + Camoufox 엔진완료
browser_pool.py임대/반환 패턴을 사용하는 영구 브라우저 풀완료
stream.pyCDP 스크린캐스트 → WebSocket/MJPEG 릴레이 + 대화형 명령완료
URLGrubCrawl4AIFirecrawlScrapyWinner
example.com39112831513831Grub
news.ycombinator.com423220414012038Grub
en.wikipedia.org507486626372368Grub
httpbin.org2831170176769Firecrawl
quotes.toscrape.com27512446471145Grub
URLnavcontentvisible_textmarkdowntotal
example.com35811140391
news.ycombinator.com38419132423
en.wikipedia.org369483821507
httpbin.org22927160283
quotes.toscrape.com23010271275
BatchGrubCrawl4AIFirecrawlScrapyWinner
10 URLs1940467032168680Grub
25 URLs408510479669225303Grub
50 URLs15604238701272936232Firecrawl