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日5 分で読める984 語数|

AI を活用したデータ抽出と OpenClaw による Web スクレイピング

従来のウェブスクレーパーは壊れやすいものです。これらは、サイトがレイアウトを再設計した瞬間に壊れる CSS セレクターと XPath パターンに依存しています。 JavaScript フレームワークによって読み込まれる動的コンテンツには適応できません。 CAPTCHA、レート制限、または IP ブロックに遭遇すると、サイレントに失敗します。スクレーパー フリートの維持には、ターゲット サイトの変化に応じて常に注意を払う必要があり、そのコストは抽出されるデータの価値を超えることがよくあります。

OpenClaw のデータ抽出エージェントは異なります。ブラウザーの自動化、視覚的理解、LLM ベースの解析を組み合わせて、脆弱なセレクターに依存せずに Web サイトからデータを抽出します。サイトのレイアウトが変更されると、エージェントがそれに適応します。 CAPTCHA に遭遇すると、黙って失敗するのではなくエスカレートします。その結果、従来のスクレイパーよりもはるかに保守しやすいデータ抽出パイプラインが実現しました。

重要なポイント

  • OpenClaw の抽出エージェントは、JavaScript でレンダリングされたコンテンツに対してブラウザ自動化 (Playwright) を使用し、ユーザーに表示される内容とスクレイパーがアクセスできる内容との間のギャップを排除します。
  • LLM ベースの解析は、CSS セレクターを使用せずに非構造化 HTML から構造化データを抽出します。エージェントはコンテンツを位置ではなく意味的に理解します。
  • 組み込みのプロキシ ローテーション、リクエストの指紋のランダム化、およびレート制限により、追加のインフラストラクチャなしでボット対策を処理します。
  • スキーマ優先抽出により、型付きで検証された出力が生成されます。下流で部分的または不正な形式のスクレイピング データを処理する必要はありません。
  • 抽出エージェントはサイトの変更を監視し、データ構造や可用性が大幅に変化した場合に警告します。
  • 倫理的なスクレイピング ガードレールが組み込まれています: robots.txt への準拠、レート制限の遵守、利用規約のレビュー チェックポイント。
  • 抽出されたデータはクリーニング、正規化され、データ ウェアハウス、API、またはダウンストリーム アプリケーションに自動的に配信されます。
  • ECOSIRE は、市場インテリジェンス、競争監視、および研究アプリケーションのためのカスタム データ抽出パイプラインを構築および管理します。

アーキテクチャ: OpenClaw がデータを抽出する方法

データ抽出スタックには 4 つの層があります。

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 スキーマ形式で定義され、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"]
}

LLM は、ページ コンテンツの意味論的な理解に基づいて各フィールドに値を入力します。必須フィールドが存在しない場合、サイレント null 値ではなく抽出エラーが発生します。


クロール管理: 複数ページのサイトの移動

最も有用なデータ抽出には、ページ分割された製品リスト、カテゴリ階層、複数ページの記事など、複数のページ間を移動する必要があります。クロール マネージャーは、サイト全体のブラウザー エージェントとパーサー エージェントを調整します。

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 機能のチェック、計算パズルの実行) を使用するサイトの場合、完全なブラウザ環境はこれらのチェックに自動的に合格します。

CAPTCHA ゲートを備えたサイトの場合、エージェントには 2 つのパスがあります。

  1. サービス統合: 非インタラクティブな解決が許容される場合、CAPTCHA を人間支援 CAPTCHA 解決サービス (2captcha、Anti-Captcha) にルーティングします。
  2. 人間によるエスカレーション: 抽出タスクを一時停止し、手動で CAPTCHA を通過して次のページから再開するように人間のオペレーターに警告します。

スキーマの検証とデータの正規化

抽出された生のデータにはノイズが含まれます。価格はさまざまな形式で提供されます (欧州形式の場合は $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: リアルタイムで使用するために内部 API エンドポイントに POST します。 5xx での再試行をサポートし、指数バックオフを含みます。

S3 / クラウド ストレージ: 分析パイプラインによるダウンストリーム処理用に Parquet または JSON として書き込みます。

データベース: 構成可能な競合解決 (一致時に更新、一致時にスキップ、一致時にエラー) を使用して PostgreSQL、MySQL、または MongoDB に更新/挿入します。


変更の検出と監視

サイトの構造が変わります。競合他社が製品ページのデザインを変更しました。サプライヤーが価格設定形式を更新します。抽出パイプラインはこれらの変更を検出し、データ品質が低下する前に警告を発する必要があります。

モニタリング エージェントは毎日実行され、現在の抽出出力を統計ベースラインと比較します。

  • フィールド カバレッジ率 (各フィールドに null 以外の値を持つレコードの割合)
  • 価値分布の変化(価格帯、稼働率)
  • 抽出成功率 (有効なレコードを生成するクロール試行の割合)

重大な逸脱がある場合は、人間によるレビューのために変更された出力のサンプルとともにアラートがトリガーされます。


よくある質問

Web スクレイピングは合法ですか?

Web スクレイピングの合法性は、管轄区域、スクレイピングされるデータ、対象サイトの利用規約によって異なります。公開データ (製品価格、公開されている連絡先情報、公開されたニュース記事) は、サイトの利用規約に従って、ほとんどの管轄区域で一般に収集が許可されています。認証を背後でスクレイピングしたり、個人データにアクセスしたり、技術的保護手段を回避したりすると、法的および倫理的な懸念が生じます。 ECOSIRE では、実稼働抽出パイプラインを展開する前に、特定のユースケースとターゲット サイトについて法的審査を受けることをお勧めします。 OpenClaw には、ベースラインの倫理的ガードレールとして、robots.txt への準拠とレート制限がデフォルトで含まれています。

システムは、データにアクセスするためにログインが必要なサイトをどのように処理しますか?

組織が正当な資格情報を持っているサイト (独自のサプライヤー ポータル、購読している競合他社の価格監視サービス、パートナー サイト) の場合、エージェントはシークレット マネージャーに保存されている構成済みの資格情報を使用してログインできます。ログイン インタラクションは、インタラクション ステップ システムを使用してブラウザ エージェントによって処理されます。セッション Cookie は維持され、自動的に更新されます。多要素認証を必要とするサイトの場合、エージェントは、構成可能な TOTP シークレットを使用して TOTP ベースの MFA をサポートします。

スクレイピングされたデータのデータ鮮度保証とは何ですか?

データの鮮度はクロール スケジュールによって異なります。 OpenClaw は、リアルタイム (レート制限付きの継続的なクロール) から毎日、毎週、またはオンデマンドまでのクロール スケジュールをサポートします。競争力のある価格データの場合、1 時間または 1 日に 2 回のクロールが一般的です。ゆっくりと変化する市場調査データの場合は、毎日または毎週で十分です。抽出エージェントはすべてのレコードに抽出時間をタイムスタンプするため、消費者は鮮度を評価できます。

システムは Web ページだけでなくページ分割された API も処理できますか?

はい。ブラウザ エージェントは Web ページを処理します。 API 抽出エージェントは、ページ分割された REST および GraphQL API を処理します。構造化された JSON を返す API の場合、パーサー エージェントは、API 応答フィールドを出力スキーマにマッピングする、より単純なスキーマ マッピング ステップに置き換えられます。クロール マネージャーは、リンク ヘッダーによるページネーション、カーソル ベースのページネーション、オフセット制限によるページネーション、およびトークン ベースのページネーション パターンを処理します。

最初のページのレンダリング後に非同期で読み込まれる動的コンテンツをどのように処理しますか?

ブラウザ エージェントは、ネットワーク アイドル待機をサポートしています。新しいネットワーク要求が 500 ミリ秒行われなくなるまで待機してから、ページ コンテンツを抽出します。重要なデータをロードする特定の API 呼び出しについては、ネットワーク応答をインターセプトし、レンダリングされた HTML ではなく API ペイロードから直接データを抽出するようにエージェントを構成できます。これは、HTML 解析よりも高速で信頼性が高くなります。


次のステップ

データは競争力のある資産ですが、それは確実かつ大規模にアクセスできる場合に限られます。 OpenClaw のデータ抽出エージェントは、脆弱な従来のスクレーパーでは実現できない信頼性、適応性、AI を活用した解析を提供します。

ECOSIRE の OpenClaw Custom Skills サービス には、市場インテリジェンス、競争監視、価格追跡、調査データ収集のユースケースのためのデータ抽出パイプラインの設計と実装が含まれています。私たちのチームは、堅牢で保守可能で倫理的に健全な抽出パイプラインを設計します。

ECOSIRE に連絡 してデータ抽出要件について話し合い、カスタム実装の提案を受け取ります。

E

執筆者

ECOSIRE Research and Development Team

ECOSIREでエンタープライズグレードのデジタル製品を開発。Odoo統合、eコマース自動化、AI搭載ビジネスソリューションに関するインサイトを共有しています。

WhatsAppでチャット