Ember 实战:17MB 轻量级无头浏览器让 AI Agent 随心所欲抓取网页
AI 编码 Agent(Claude Code、Codex、OpenCode)最大的局限之一就是看不到网页。让 Agent 去查文档?它只能读你粘贴的文本。去抓 API 文档?它没有浏览器。去爬竞争对手的产品页?更不行。
现有的网页抓取方案要么太重(Firecrawl 需要 Docker + Redis,4-8GB 内存),要么太笨(Playwright 自带 281MB Chromium)。如果你只是想让 Agent 能偶尔查查文档、搜搜资料,装一个完整的浏览器框架太过了。
Ember 就是为这个场景设计的——一个只有 17MB 闲置内存的无头浏览器,pip install 就能用,自带 CLI、Python API、REST API 和 MCP 服务。项目地址 github.com/andalabx/ember(MIT 协议,Python 语言)。
安装:一行命令
pip install ember-browser
无 Docker、无 API Key、无 Chromium 依赖。装完后验证:
ember version
你就能直接用了。Ember 的核心思路是智能降级——约 89% 的网页(博客、文档站、新闻)只需 HTTP 请求就能抓取,不需要浏览器。只有遇到 JavaScript 重度页面时,它才自动拉起内置的 Lightpanda(12MB,一个用 Zig 写的精简浏览器引擎)。
实战场景 1:让 Agent 搜索网页内容
最简单的用法是直接让终端命令抓取网页。假设你想让 Agent 了解某个技术的最新动态:
ember url https://news.ycombinator.com ember search "AI coding agents 2026" -n 5
ember url 会把网页内容转为 Markdown,返回标题、正文和关键链接。ember search 自动调用搜索引擎,返回结果列表(标题、URL、摘要),每一条都可以进一步用 ember url 抓取详情。
你甚至可以结合两个命令实现「搜索→读取摘要→抓取详情」的管道:
ember search "MCP server best practices" -n 10 -o results.json ember batch results.json -o ./articles/
实战场景 2:在 Python 脚本中集成网页能力
对于更复杂的场景,Ember 提供了 Python API。你可以在 Agent 的工作流中直接调用:
from emb.scrape import scrape_markdown
from emb.search import search
from emb.crawl import crawl
docs = [
"https://docs.anthropic.com/en/docs/claude-code/overview",
"https://code.visualstudio.com/docs/editor/ai-overview",
]
for url in docs:
md = scrape_markdown(url)
print(f"=== {url} ===")
print(md[:500]) # 读取前 500 字
print("...")
results = search("Show HN AI coding tool", limit=5)
for r in results:
print(f"{r.title}: {r.url}")
这个 API 是同步的,调用简单直接。如果你需要并发抓取,Ember 也提供了异步版本:
import asyncio
from emb.scrape import scrape_url_async
async def main():
tasks = [
scrape_url_async("https://example.com"),
scrape_url_async("https://httpbin.org/get"),
]
results = await asyncio.gather(*tasks)
for r in results:
print(r.url, r.success, len(r.markdown))
asyncio.run(main())
实战场景 3:架设 REST API 服务给多个 Agent 共享
如果你有多个 Agent 或需要远程访问,Ember 可以启动一个 REST API 服务:
ember serve --port 8080
然后在任何 Agent 或脚本中通过 HTTP 调用:
curl -X POST http://localhost:8080/scrape \
-H "Content-Type: application/json" \
-d '{"url": "https://news.ycombinator.com"}'
curl -X POST http://localhost:8080/search \
-H "Content-Type: application/json" \
-d '{"query": "AI agents python", "limit": 5}'
如果需要安全保护,加上 API Key:
EMBER_API_KEY=my-secret-key ember serve
所有请求都需要带上 X-API-Key 头,否则会被拒绝。
可选:MCP 集成
最酷的是,Ember 内置了 MCP 服务端。你在 Claude Code、Hermes 或其他 MCP 兼容客户端的配置中加入:
{
"mcpServers": {
"ember": {
"command": "ember",
"args": ["mcp"]
}
}
}
之后 Agent 就能直接对话式调用 Ember 的 7 个工具:scrape、search_web、crawl_site、map_site、batch_scrape、interact_page、extract_data。Agent 可以自主决定什么时候需要查网页、搜资料——完全不需要你手动用命令。
最佳实践
1. 轻量抓取优先:Ember 的默认行为是最优的——约 89% 的页面只通过 HTTP 抓取(trafilatura 引擎),不会启动浏览器进程。只有在页面内容过少时(SPA、JS 渲染)才自动切换到 Lightpanda 引擎。不需要手动选择模式。
2. 合理设置并发:ember batch 默认 5 并发。如果目标服务器有反爬限制,降低并发数:ember batch urls.txt -c 3。如果只是抓内部文档站,可以提高到 20。
3. 持久化保存:使用 ember config --save-dir ./research/ 设置默认保存目录,所有抓取结果自动存为 .md 文件。也可以用 EMBER_SAVE_DIR=./out ember url ... 临时覆盖。
4. 提取结构化数据:ember extract 命令配合 LLM 可以提取页面中的结构化数据(价格表、功能列表等):
ember extract https://example.com/pricing \ --prompt "list all plans and prices as JSON"
需要设置 EMBER_LLM_API_KEY 环境变量来指定 LLM 的 API Key。
5. 交互式操作:ember interact 可以用自然语言控制页面(”点击登录按钮””输入搜索关键词”)。它适合测试场景,不适合批量自动化——因为每次交互都需要 LLM 调用。
总结
Ember 解决了一个很实际的问题:AI Agent 需要看网页,但为此装一个完整的浏览器框架太重了。17MB 闲置内存、pip install 即用、CLI/Python/REST/MCP 四种接口——这是目前我看到最轻量的 Agent 网页抓取方案。
如果说 Firecrawl 是给生产环境用的重型工具,那 Ember 就是给开发和日常使用准备的随身利器。MIT 协议、开源、无 API Key 限制,你值得试试。
相关链接
- Ember GitHub 仓库(MIT 协议,Python)
- Ember PyPI 包
- Lightpanda 浏览器(Ember 使用的底层浏览器引擎)