2026年7月10日 2 分钟阅读

Ember 实战:17MB 轻量级无头浏览器让 AI Agent 随心所欲抓取网页

tinyash 0 条评论

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 个工具:scrapesearch_webcrawl_sitemap_sitebatch_scrapeinteract_pageextract_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 限制,你值得试试。

相关链接

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。