最近一直在折腾 AI Agent ,发现让 Agent 可靠地与 Web 交互是个大难题,现有工具要么太底层,要么不够灵活。所以动手撸了一个轮子: **@isdk/web-fetcher**,想和大家分享一下,也希望能得到一些反馈。
https://github.com/isdk/web-fetcher.jsnpm install @isdk/web-fetcher你可能会问,为啥不用 fetch 或 Playwright/Crawlee ?
fetch 拿不到 JS 动态渲染的内容,对现代网页基本没用。await page.click(...) 等),不仅繁琐,而且 AI (比如 LLM) 很难直接生成这种复杂的逻辑。我不想重复造轮子,所以底层用了Crawlee 库来处理。
我的目标是在 Crawlee 之上构建一个跨引擎一致性:抽象/模拟 HTTP 与 Browser 的共有行为,声明式的“意图层”,让 AI 可以通过生成简单的 JSON 来“指挥”浏览器完成任务,而不是去写具体的执行代码。
http 模式(基于 Cheerio )来极速抓取静态内容,也可以用 browser 模式(基于 Playwright )来处理复杂的动态网页。http 和 browser 模式下的共性行为。无论底层用哪个引擎,你都使用同一套 actions API 。比如 extract (提取数据) 这个操作,在 http 模式下它会通过 Cheerio 解析静态 HTML ,在 browser 模式下它会操作浏览器渲染后的 DOM 。你只需要学习一套 API ,库在内部完成了适配和翻译。browser 模式下开启 antibot: true,能处理一些常见的 Cloudflare 挑战。loginToZhihu 的自定义动作。注意,下面的代码不关心目标 URL 是静态还是动态的,extract 操作在两种模式下都有效。
import { fetchWeb } from '@isdk/web-fetcher';
async function getTitle(url: string) {
  const { outputs } = await fetchWeb({
    url,
    actions: [
      {
        id: 'extract',
        params: {
          selector: 'title', // 提取 <title> 标签内容
        },
        storeAs: 'pageTitle', // 结果存到 outputs.pageTitle
      },
    ],
  });
  console.log('页面标题:', outputs.pageTitle);
}
getTitle('https://www.v2ex.com');
这个例子展示了如何用 JSON 指挥浏览器执行一系列动作。
import { fetchWeb } from '@isdk/web-fetcher';
async function searchGoogle(query: string) {
  const { result } = await fetchWeb({
    url: 'https://www.google.com',
    engine: 'browser', // 显式指定需要浏览器环境
    actions: [
      // 步骤 1: 找到输入框并填入内容
      { id: 'fill', params: { selector: 'textarea[name=q]', value: query } },
      // 步骤 2: 提交表单
      { id: 'submit', params: { selector: 'form' } },
      // 步骤 3: 等待搜索结果容器加载出来
      { id: 'waitFor', params: { selector: '#search' } },
    ]
  });
  console.log('搜索结果页 URL:', result?.finalUrl);
}
searchGoogle('V2EX');
项目刚起步,核心架构已经搭好。下一步计划是实现更智能的抓取策略(比如发现 http 模式拿不到内容时,自动升级到 browser 模式)。
项目是开源的,欢迎大家试用、Star 、提 Issue ,或者狠狠地拍砖!感谢。
|  |      1v2zhao      12 小时 56 分钟前 有意思 已 star | 
|      2closedevice      12 小时 24 分钟前 有意思,周末看下,另外有对比过 chrome-mcp 的实现么? | 
|      3riceball OP @closedevice chrome-mcp 没看到过,不过看到过基于 playwright 做的 MCP,太过简单. |