Browsegrab
韩语文档 · llms.txt
用于本地LLM的令牌高效浏览器代理——Playwright+可访问性树+MarkGrab,MCP原生。
Browsegrab 是一个为本地LLM(8B-35B参数)设计的轻量级浏览器自动化库。它将Playwright的可访问性树与 MarkGrab的HTML到markdown的转换实现 每一步减少5-8倍的令牌 与浏览器使用等替代方案相比。
特性
- 代币高效:约500-1500个令牌/步(而浏览器使用为4000-10000个)
- 本地LLM优先:针对vLLM、Ollama和OpenAI兼容端点进行了优化
- MCP本地:内置MCP服务器,带有8个浏览器自动化工具
- MarkGrab集成:HTML→ 用于内容提取的干净标记
- 可访问性树+引用系统:稳定元素引用(
e1,e2, ...)没有视觉模型 - 成功模式缓存:重复工作流程中无LLM调用
- 5级JSON解析器:本地LLM输出的稳健操作解析
- 最小依赖性:只有
playwright+httpx在核心
安装
pip install browsegrab
playwright install chromium具有可选功能:
pip install browsegrab[mcp] # MCP server support
pip install browsegrab[content] # MarkGrab content extraction
pip install browsegrab[cli] # CLI with rich output
pip install browsegrab[all] # Everything快速开始
Python API
from browsegrab import BrowseSession
async with BrowseSession() as session:
# Navigate and get accessibility tree snapshot
await session.navigate("https://example.com")
snap = await session.snapshot()
print(snap.tree_text)
# - heading "Example Domain" [level=1]
# - link "Learn more": [ref=e1]
# Click using ref ID
result = await session.click("e1")
print(result.url) # https://www.iana.org/help/example-domains
# Type into search box
await session.navigate("https://en.wikipedia.org")
snap = await session.snapshot()
await session.type("e4", "Python programming", submit=True)
# Extract compressed content (AX tree + markdown)
content = await session.extract_content()命令行界面
# Accessibility tree snapshot
browsegrab snapshot https://example.com
# JSON output
browsegrab snapshot https://example.com -f json
# Extract content (AX tree + markdown)
browsegrab extract https://en.wikipedia.org/wiki/Python
# Agentic browse (requires LLM endpoint)
browsegrab browse https://example.com "Find the about page"MCP服务器
browsegrab-mcp # Start MCP server (stdio)克劳德桌面/光标/VS代码配置:
{
"mcpServers": {
"browsegrab": {
"command": "browsegrab-mcp"
}
}
}8个MCP工具: browser_navigate, browser_click, browser_type, browser_snapshot, browser_scroll, browser_extract_content, browser_go_back, browser_wait
运作原理
代理浏览循环
flowchart LR
A["🌐 URL + Goal"] --> B["Navigate"]
B --> C["AX Tree Snapshot\n~200–500 tokens"]
C --> D{"LLM\nDecision"}
D -->|"click / type / scroll"| E["Execute Action"]
E --> C
D -->|"goal reached"| F["Extract Content\n(MarkGrab)"]
F --> G["✅ Result"]代币效率
browsegrab分离 结构 (可访问性树)来自 内容 (MarkGrab标记),只发送LLM需要的内容:
flowchart TD
A["Raw HTML"] --> B["Accessibility Tree"]
A --> C["MarkGrab Markdown"]
B --> D["Structure: ~200–500 tokens\nInteractive elements with ref IDs"]
C --> E["Content: ~300–800 tokens\nClean markdown · on-demand"]
D --> F["Combined: ~500–1,300 tokens/step\n⚡ 5–8× fewer than browser-use"]
E --> F代币效率(测量)
| 页面 | 交互元素 | 令牌 | 浏览器使用等效物 |
|---|---|---|---|
| example.com | 1 | ~60 | ~500+ |
| 维基百科文章 | 452 | ~1254 | ~10000+ |
建筑
browsegrab/
├── config.py # Dataclass configs (env var loading)
├── result.py # Result types (ActionResult, BrowseResult, ...)
├── session.py # BrowseSession orchestrator
├── browser/
│ ├── manager.py # Playwright lifecycle (async context manager)
│ ├── snapshot.py # Accessibility tree + ref system
│ ├── selectors.py # 4-strategy selector resolver
│ └── actions.py # navigate, click, type, scroll, go_back, wait
├── dom/
│ ├── ref_map.py # ref ID ↔ element bidirectional mapping
│ └── compress.py # AX tree + MarkGrab → compressed context
├── llm/
│ ├── base.py # LLMProvider ABC
│ ├── provider.py # vLLM, Ollama, OpenAI-compatible
│ ├── prompt.py # System prompts (~400 tokens)
│ └── parse.py # 5-stage JSON fallback parser
├── agent/
│ ├── history.py # Sliding window history compression
│ ├── cache.py # Domain-based success pattern cache
│ └── loop_guard.py # Duplicate action detection
├── __main__.py # CLI (click)
└── mcp_server.py # FastMCP server (8 tools)配置
通过环境变量进行所有设置(BROWSEGRAB_* 前缀):
# Browser
BROWSEGRAB_BROWSER_HEADLESS=true
BROWSEGRAB_BROWSER_TIMEOUT_MS=30000
# LLM (for agentic browse)
BROWSEGRAB_LLM_PROVIDER=vllm # vllm | ollama | openai
BROWSEGRAB_LLM_BASE_URL=http://localhost:8000/v1
BROWSEGRAB_LLM_MODEL=Qwen/Qwen3.5-32B-AWQ
# Agent
BROWSEGRAB_AGENT_MAX_STEPS=10
BROWSEGRAB_AGENT_ENABLE_CACHE=trueQuartzUnit生态系统的一部分
发展
git clone https://github.com/QuartzUnit/browsegrab.git
cd browsegrab
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
playwright install chromium
# Unit tests (no browser needed)
pytest tests/ -m "not e2e"
# Full suite including E2E
pytest tests/ -v许可证
______________________________________________________________________
部分 Quartz单位 生态系统——用于数据收集、提取、搜索和AI代理安全的可组合Python库。
