AI-Powered Data Extraction and Web Scraping with OpenClaw

Build reliable, intelligent web scraping and data extraction pipelines with OpenClaw AI agents. Handle dynamic sites, anti-bot measures, and unstructured data automatically.

E
ECOSIRE Research and Development Team
|2026年3月19日4 分钟阅读857 字数|

使用 OpenClaw 进行人工智能驱动的数据提取和网页抓取

传统的网络抓取工具很脆弱。它们依赖于 CSS 选择器和 XPath 模式,这些模式会打破网站重新设计其布局的那一刻。它们无法适应 JavaScript 框架加载的动态内容。当遇到验证码、速率限制或 IP 阻止时,它们会默默地失败。随着目标站点的变化,维护抓取机车队需要持续关注,这一成本通常超过所提取数据的价值。

OpenClaw 的数据提取代理是不同的。它们结合了浏览器自动化、视觉理解和基于 LLM 的解析,从网站中提取数据,而不依赖于脆弱的选择器。当站点更改其布局时,代理会进行调整。当它遇到验证码时,它会升级而不是默默地失败。结果是数据提取管道的可维护性比传统的抓取工具高出几个数量级。

要点

  • OpenClaw 的提取代理使用浏览器自动化 (Playwright) 来处理 JavaScript 渲染的内容,消除了用户看到的内容和抓取工具可以访问的内容之间的差距。
  • 基于 LLM 的解析从非结构化 HTML 中提取结构化数据,无需 CSS 选择器 - 代理从语义上而不是位置上理解内容。
  • 内置代理轮换、请求指纹随机化和速率限制处理反机器人措施,无需额外的基础设施。
  • 模式优先提取产生类型化、经过验证的输出——不再需要处理部分或格式错误的下游数据。
  • 提取代理监视站点更改,并在数据结构或可用性发生显着变化时发出警报。
  • 内置道德抓取护栏:robots.txt 合规性、速率限制尊重和服务条款审查检查点。
  • 提取的数据经过清理、规范化并自动传送到您的数据仓库、API 或下游应用程序。
  • ECOSIRE 构建和管理用于市场情报、竞争监控和研究应用的自定义数据提取管道。

架构:OpenClaw 如何提取数据

数据提取堆栈有四层:

Target URL(s)
      ↓
[ Browser Agent ]        — navigation, rendering, interaction
      ↓
[ Parser Agent ]         — LLM-based content extraction
      ↓
[ Validation Agent ]     — schema validation, normalization
      ↓
[ Delivery Agent ]       — destination write (warehouse, API, file)

浏览器代理处理 HTTP 请求和 JavaScript 渲染。解析器代理从呈现的 HTML 中提取含义。验证代理强制执行架构合规性并规范化值。交付代理将提取的数据写入目标目的地。


浏览器代理:渲染用户看到的内容

大量使用 JavaScript 的网站(SPA、无限滚动、模态门控内容)无法通过简单的 HTTP 请求进行抓取。浏览器代理使用 Playwright 完全像浏览器一样渲染页面,然后将完全渲染的 DOM 公开给解析器代理。

export const RenderPage = defineSkill({
  name: "render-page",
  tools: ["browser", "proxy"],
  async run({ input, tools }) {
    const proxyConfig = await tools.proxy.getNextProxy({ country: input.targetCountry });

    const page = await tools.browser.newPage({
      proxy: proxyConfig,
      userAgent: getRandomUserAgent(),
      viewport: { width: 1440, height: 900 },
      locale: "en-US",
      timezoneId: "America/New_York",
    });

    await page.setExtraHTTPHeaders({
      "Accept-Language": "en-US,en;q=0.9",
      "Accept-Encoding": "gzip, deflate, br",
    });

    const response = await page.goto(input.url, { waitUntil: "networkidle", timeout: 30_000 });

    if (response.status() === 429) {
      throw new SkillError("RATE_LIMITED", "Target site returned 429. Backing off.", { retryAfterMs: 60_000 });
    }

    // Execute interaction steps if defined (click "Load More", handle cookie banners, etc.)
    for (const step of input.interactionSteps ?? []) {
      await executeInteractionStep(page, step);
    }

    const html = await page.content();
    const screenshot = await page.screenshot({ type: "png" }); // For visual verification

    await page.close();
    return { html, screenshot, url: page.url(), statusCode: response.status() };
  },
});

请求指纹随机化:浏览器代理会轮换用户代理、视口大小和 HTTP 标头,以避免基于指纹的阻塞。指纹配置文件是从真实浏览器签名的精选库中提取的。

代理轮换:代理工具维护按地理位置组织的住宅和数据中心代理池。它根据目标站点的地理访问要求选择代理,并轮换它们以跨 IP 地址分发请求。

交互步骤:许多网站在内容可见之前都需要交互 - 单击“接受 cookie”、滚动以触发延迟加载、单击分页控件。交互步骤以声明方式定义:

{
  "interactionSteps": [
    { "type": "click", "selector": "[data-testid='cookie-accept']", "optional": true },
    { "type": "scroll", "direction": "down", "pixels": 2000 },
    { "type": "wait", "milliseconds": 2000 },
    { "type": "click", "text": "Load more results", "optional": true }
  ]
}

解析器代理:无需选择器的语义提取

解析器是 OpenClaw 的 AI 优势最明显的地方。解析器代理不是脆弱的 CSS 选择器,而是将渲染的 HTML 和模式定义发送到 LLM,LLM 使用语义理解提取请求的字段。

export const ExtractStructuredData = defineSkill({
  name: "extract-structured-data",
  tools: ["llm"],
  async run({ input, tools }) {
    // Clean HTML for LLM consumption (strip scripts, styles, non-content)
    const cleanedHtml = cleanHtmlForExtraction(input.html, {
      stripTags: ["script", "style", "noscript", "iframe"],
      preserveAttributes: ["href", "src", "data-price", "data-sku"],
      maxLength: 50_000, // LLM context limit
    });

    const extractedData = await tools.llm.extract({
      content: cleanedHtml,
      schema: input.extractionSchema,
      instructions: `Extract the requested fields from the HTML. For prices, include the numeric value only (no currency symbols). For dates, use ISO 8601 format. If a field is not present on the page, return null for that field.`,
    });

    return { data: extractedData, sourceUrl: input.url, extractedAt: new Date().toISOString() };
  },
});

提取模式定义:模式以 JSON Schema 格式定义,为 LLM 提供精确的打字指导:

{
  "type": "object",
  "properties": {
    "productName": { "type": "string", "description": "Full product name including model/variant" },
    "price": { "type": "number", "description": "Current selling price, numeric only" },
    "originalPrice": { "type": ["number", "null"], "description": "Original price before discount, or null if not on sale" },
    "availability": { "type": "string", "enum": ["in_stock", "out_of_stock", "limited", "preorder"] },
    "rating": { "type": ["number", "null"], "description": "Average rating out of 5, or null if no ratings" },
    "reviewCount": { "type": ["integer", "null"] },
    "sku": { "type": ["string", "null"] }
  },
  "required": ["productName", "price", "availability"]
}

法学硕士根据其对页面内容的语义理解来填写每个字段。缺少的必填字段会触发提取失败,而不是静默的空值。


抓取管理:导航多页面网站

最有用的数据提取需要跨多个页面导航:分页产品列表、类别层次结构、多页文章。爬网管理器协调站点上的浏览器和解析器代理。

export const CrawlProductListing = defineSkill({
  name: "crawl-product-listing",
  tools: ["browser", "queue", "storage"],
  async run({ input, tools }) {
    let pageUrl: string | null = input.startUrl;
    const allProducts = [];
    let pageNumber = 1;

    while (pageUrl && pageNumber <= input.maxPages) {
      const rendered = await tools.browser.render(pageUrl, { interactionSteps: input.interactionSteps });
      const products = await extractProductsFromPage(rendered.html, input.extractionSchema);
      allProducts.push(...products);

      // Find the "Next" page URL
      pageUrl = extractNextPageUrl(rendered.html, input.paginationPattern);
      pageNumber++;

      // Respect crawl rate — be a polite scraper
      await sleep(input.delayBetweenPagesMs ?? 2000);
    }

    await tools.storage.put(`crawls/${Date.now()}-products.json`, JSON.stringify(allProducts));
    return { productCount: allProducts.length, pagesProcessed: pageNumber - 1 };
  },
});

默认情况下,爬网管理器遵循 robots.txt。在开始爬网之前,它会获取并解析目标站点的 robots.txt,并检查已配置的用户代理是否允许使用目标路径。尝试访问不允许的路径的爬网将被阻止,并向操作员发送警报。


处理反机器人措施

现代反机器人系统(Cloudflare、Akamai Bot Manager、PerimeterX)使用行为信号来区分人类和机器人。提取代理采用多种技术来显示为合法的浏览器流量:

鼠标移动模拟:真实的浏览器会话具有非线性鼠标移动。在单击目标之前,代理会使用自然速度曲线模拟真实的光标路径。

时间变化:请求延迟的时间间隔是根据人类浏览行为校准的分布得出的随机间隔,而不是统一或确定性间隔。

Cookie 管理:由反机器人系统设置的 Cookie 会被保留并在后续请求中发送,就像浏览器一样。

JavaScript 挑战完成:对于使用 JavaScript 挑战(检查浏览器 API 功能、执行计算难题)的网站,完整的浏览器环境会自动通过这些检查。

对于带有验证码门的站点,代理有两条路径:

  1. 服务集成:当非交互式解决可接受时,将验证码路由到人工辅助验证码解决服务(2captcha、反验证码)。
  2. 人工升级:暂停提取任务,提醒人工操作员手动导航通过验证码,然后从下一页继续。

模式验证和数据标准化

原始提取的数据有噪音。价格有不同的格式(欧洲格式为 1,299.99 美元、1299.99、1.299,99 美元)。日期以各种可以想象的格式出现。产品名称的大小写和编码不一致。验证代理在所有值到达交付层之前对其进行标准化。

export const NormalizeExtractedData = defineSkill({
  name: "normalize-extracted-data",
  async run({ input }) {
    const normalized = input.data.map((record) => ({
      ...record,
      price: parseFloat(String(record.price).replace(/[^0-9.]/g, "")),
      originalPrice: record.originalPrice
        ? parseFloat(String(record.originalPrice).replace(/[^0-9.]/g, ""))
        : null,
      productName: record.productName.trim().replace(/\s+/g, " "),
      extractedAt: new Date(record.extractedAt).toISOString(),
      availability: normalizeAvailability(record.availability),
    }));

    // Validate against schema
    const validation = validateAgainstSchema(normalized, input.outputSchema);
    const valid = normalized.filter((_, i) => validation[i].valid);
    const invalid = normalized.filter((_, i) => !validation[i].valid);

    return { valid, invalid, validCount: valid.length, invalidCount: invalid.length };
  },
});

无效记录(缺少必填字段、无法规范化的值)将写入单独的异常存储以供审查,而不是静默删除。


交付:将数据传送到需要的地方

交付代理将标准化数据写入配置的目标:

数据仓库:使用架构匹配列映射批量插入到 BigQuery、Snowflake 或 Redshift。按提取日期分区以实现高效查询。

REST API:POST 到内部 API 端点以进行实时使用。支持 5xx 重试并包括指数退避。

S3 / 云存储:写入为 Parquet 或 JSON,以便分析管道进行下游处理。

数据库:通过可配置的冲突解决方案更新插入到 PostgreSQL、MySQL 或 MongoDB(匹配时更新、匹配时跳过、匹配时出错)。


变更检测和监控

网站改变其结构。竞争对手重新设计了他们的产品页面。供应商更新其定价格式。提取管道需要检测这些变化并在数据质量下降之前发出警报。

监控代理每天运行并将当前提取输出与统计基线进行比较:

  • 字段覆盖率(每个字段具有非空值的记录的百分比)
  • 价值分布变化(价格范围、可用率)
  • 提取成功率(抓取尝试产生有效记录的百分比)

重大偏差会触发警报,并提供更改后的输出样本以供人工审核。


常见问题

网络抓取合法吗?

网络抓取的合法性取决于司法管辖区、被抓取的数据以及目标网站的服务条款。根据网站的服务条款,大多数司法管辖区通常允许抓取公共数据(产品价格、公开列出的联系信息、发布的新闻文章)。窃取身份验证、访问个人数据或规避技术保护措施会引发法律和道德问题。 ECOSIRE 建议在部署生产提取管道之前获得针对您的特定用例和目标站点的法律审查。 OpenClaw 默认包含 robots.txt 合规性和速率限制作为基线道德护栏。

系统如何处理需要登录才能访问数据的站点?

对于您的组织拥有合法凭据的站点(您自己的供应商门户、您订阅的竞争对手价格监控服务、合作伙伴站点),代理可以使用存储在机密管理器中的配置凭据登录。登录交互由浏览器代理使用交互步骤系统处理。会话 cookie 会自动维护和刷新。对于需要多重身份验证的站点,代理使用可配置的 TOTP 密钥支持基于 TOTP 的 MFA。

抓取数据的数据新鲜度保证是怎样的?

数据新鲜度取决于您的抓取计划。 OpenClaw 支持从实时(带速率限制的连续爬行)到每日、每周或按需的爬网计划。对于有竞争力的定价数据,每小时或每天两次的爬网很常见。对于变化缓慢的市场研究数据,每日或每周就足够了。提取代理为每条记录加上提取时间的时间戳,以便消费者评估新鲜度。

系统能否像处理网页一样处理分页 API?

是的。浏览器代理处理网页; API 提取代理处理分页 REST 和 GraphQL API。对于返回结构化 JSON 的 API,解析器代理被替换为更简单的架构映射步骤,该步骤将 API 响应字段映射到输出架构。爬网管理器通过链接标头、基于光标的分页、偏移限制分页和基于令牌的分页模式处理分页。

如何处理初始页面渲染后异步加载的动态内容?

浏览器代理支持网络空闲等待——它会等待 500 毫秒内没有发出新的网络请求,然后再提取页面内容。对于加载关键数据的特定 API 调用,您可以将代理配置为拦截网络响应并直接从 API 负载而不是呈现的 HTML 中提取数据,这比 HTML 解析更快、更可靠。


后续步骤

数据是一种有竞争力的资产,但前提是您能够可靠且大规模地访问它。 OpenClaw 的数据提取代理提供了脆弱的传统抓取工具无法比拟的可靠性、适应性和人工智能驱动的解析。

ECOSIRE 的 OpenClaw 自定义技能服务 包括用于市场情报、竞争监控、价格跟踪和研究数据收集用例的数据提取管道设计和实施。我们的团队设计了稳健、可维护且符合道德规范的提取管道。

联系 ECOSIRE 讨论您的数据提取要求并接收自定义实施建议。

E

作者

ECOSIRE Research and Development Team

在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。

通过 WhatsApp 聊天