AIウェブスクレイピング: LLM抽出、プロンプトからJSONへ、そしてコスト

LLM抽出は、どんなページでもプレーンな英語のプロンプトからクリーンなJSONに変換します — セレクターを維持する必要はありません。しかし、モデルはページを取得できず、生のHTMLはトークンを急速に消費します。正しい方法を紹介します。

AIウェブスクレイピングとは、言語モデルをページに向けて、プレーンな英語で欲しいフィールドをJSONとして返すように頼むことを意味します — CSSセレクターを書く必要もなく、レイアウトが変わったときにパーサーを維持する必要もありません。これは、混沌とした、変化に富んだ、または一度きりの抽出に対して本当に変革的です。しかし、広く誤解されており、そのために数百ページをスクレイプするために支払い、幻覚データを受け取ることになります。この混乱のほとんどを解決する2つの事実があります: 言語モデルはウェブページを取得できません — あなたが渡したテキストに対してのみ推論します — そして、生のHTMLを与えることはトークン予算を最も速く消費する方法です。このガイドでは、機能する抽出パターン、セレクターを超えるとき、そしてコストと幻覚を制御する方法をカバーします。

誰も言わないこと: モデルは取得できない

AIスクレイピングの難しい部分はAIではありません。チャットボットはライブページを確実にロードできません — 最初にHTMLを取得する専用エンジンが必要で、その後に提供されたテキストに対して推論します。したがって、LLM抽出パイプラインは実際にはスマートパーサーを最後に取り付けたスクレイピングパイプラインであり、スクレイピングの部分が問題を引き起こします: ボット管理、JavaScriptレンダリング、IPブロック。プロキシとレンダリングレイヤーで取得を解決すれば、抽出は簡単になります。ページを取得するクリーンな方法は、回転とレンダリングを処理し、マークダウンを返すスクレイパーAPIです。次のセクションで示すように、これはモデルにとっても最も安価な入力です。

import requests

def fetch_markdown(url, api_key):
    r = requests.get(
        "https://api.quantumproxies.io/scrape",
        params={"url": url, "render": "auto", "output": "markdown"},
        headers={"Authorization": f"Bearer {api_key}"},
        timeout=(5, 40),
    )
    r.raise_for_status()
    return r.json()["markdown"]  # nav/ads stripped, ready for the model

なぜマークダウンであってHTMLではないのかが本当のコストレバー

AIスクレイピングコストの最大の要因は、モデルに通すトークンの数です。そして、生のHTMLはほとんどが不要なトークンです: インラインスタイル、スクリプトタグ、トラッキング属性、ナビゲーション、フッター。ページをクリーンなマークダウンに変換するか、抽出前に主要なコンテンツだけを抽出することで、入力サイズを通常10分の1に削減し、コストを同じ割合で削減し、さらにボーナスとして、モデルがクロームではなくコンテンツを見るため、幻覚を減らします。これが、マークダウンファーストがモデルにフィードする標準であり、LLMに新鮮なウェブデータを供給する背後にある原則です。この記事から一つだけ持ち帰るなら: モデルに生のページソースを送らないこと。

LLM抽出パイプライン図: プロキシまたはスクレイパーAPIでページを取得し、マークダウンにクリーン化し、スキーマでプロンプトし、JSON出力を検証する
モデルはライブウェブに触れません。取得とクリーン化が最初に行われ、マークダウンがトークンコストを削減し、スキーマがJSONを正直に保ちます。

スキーマを使ったプロンプトからJSONへ

クリーンなテキストを手に入れたら、抽出は1回の呼び出しです: 欲しいフィールドを説明し、出力が構造化されるようスキーマを渡し、フィールドが欠けている場合は発明せずにnullを返すようモデルに指示します。抽出APIは、取得、クリーン、抽出を1つのリクエストにまとめるので、配管を完全にスキップできます。

curl -X POST "https://api.quantumproxies.io/extract" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product/xyz",
    "schema": {
      "title":  "string",
      "price":  "number",
      "in_stock": "boolean",
      "rating": "number|null"
    },
    "prompt": "Extract the product. Use null for anything not present."
  }'

スキーマは二重の役割を果たします: 下流のコードに予測可能な形を強制し、モデルを制約します。これは幻覚フィールドに対する第一の防衛線です。同じスキーマに対して応答を検証し、適合しないものを拒否します — 発明された価格は欠けているものよりも悪いです。

def validate(record, schema):
    for field, kind in schema.items():
        v = record.get(field)
        if v is None and "null" not in kind:
            raise ValueError(f"missing required field: {field}")
    return record  # only trust records that satisfy the schema

LLM抽出がCSSセレクターを超えるとき — そして超えないとき

AI抽出は普遍的なアップグレードではありません; それは異なるコスト曲線を持つ異なるツールです。作業が多様または不安定なときにそれを使用します — 千のレイアウトを持つ千のサイトをスクレイプする、絶えず再設計されるサイト、レビューやリスティングのような構造化されていないコンテンツでクリーンなセレクターが存在しない場合、またはセレクターを書く価値がない一度きりの作業。安定したサイトを高ボリュームで叩くときは、CSSまたはXPathセレクターを使用します: セレクターは決定論的で、ページごとに実質的に無料で、幻覚しません。成熟したパターンはハイブリッドです — 高ボリュームのコアターゲットにはセレクターを、長い尾と変化し続けるサイトにはLLM抽出を使用します。

コスト管理はこれを実験から生産に変えます。マークダウンファーストを超えて、変更されていないページをキャッシュし、タスクの難易度にモデルサイズを合わせ — 小さなモデルはシンプルなフィールド抽出を十分に処理し、APIが許可する場合はバッチ処理します。レンダリングは独自の項目です; 本当にJavaScriptが必要なページだけをレンダリングし、その決定を必要なときだけレンダリングで定量化します。コンテンツの代わりに空白ページを取得した場合、通常の修正はレンダリングであり、空白ページ、データ欠落でカバーされています。

無料およびオープンソースのルートについて一言、これはほとんどの人が最初に検索するものだからです。オープンソースの抽出ライブラリは、パターンを学ぶのに優れており、小規模な作業に適していますが、この記事の冒頭で述べた2つの難しい問題を返します: ボット管理を超えてページを取得する必要があり、抽出を行うモデルのコストを支払う必要があります。「無料」とは通常、無料のコードとプロキシおよびトークンの請求書を意味します。それは趣味のプロジェクトや概念実証には良い取引です; 生産量では、取得レイヤーのメンテナンスはチームが最終的にアウトソーシングするものです。これは、DIYスクレイパースタック対スクレイパーAPIで説明するビルド対購入の選択です。

LLM抽出とCSSセレクターの比較、安価な決定論的アプローチに対する柔軟なトークンごとのアプローチを示す
LLM抽出は多様で変化するサイトで勝ちます; セレクターは安定した高ボリュームのターゲットで勝ちます。ほとんどの実際のパイプラインは両方を実行します。

よくある質問

ChatGPTはウェブサイトをスクレイプできますか?

単独ではできません。言語モデルはライブページを確実に取得してレンダリングすることはできません — あなたが提供するテキストに対して推論します。AIをスクレイピングに使用するには、専用のスクレイピングエンジンとペアリングし、ページを取得してクリーン化し、モデルが結果から構造化データを抽出します。スクレイピングエンジンはプロキシ、レンダリング、ブロックを処理し、モデルはコンテンツをJSONに変換します。

AIウェブスクレイピングのコストを削減するにはどうすればよいですか?

ページをマークダウンに変換するか、モデルに送信する前に主要なコンテンツを抽出します — 生のHTMLは同じ情報に対してトークンが10倍になることがあります。その後、変更されていないページをキャッシュし、シンプルなフィールド抽出には小さなモデルを使用し、ページが必要とする場合のみJavaScriptをレンダリングし、リクエストをバッチ処理します。トークンボリュームが支配的なコストであるため、入力サイズを削減することが最も効果的な最適化です。

AIウェブスクレイピングは誤ったデータを幻覚しますか?

特にノイズの多い生のHTMLを与えられたり、ページにないフィールドを要求されたりすると、幻覚することがあります。それを防ぐために、入力をクリーンにし、明示的なスキーマを渡し、値が欠けている場合はnullを返すようモデルに指示し、そのスキーマに対してすべての応答を検証してから信頼します。欠けているフィールドは再試行できます; 自信を持って発明されたものはデータセットを静かに破損させます。

LLM抽出はCSSセレクターより優れていますか?

仕事によります。LLM抽出は、レイアウトが変化したり頻繁に変わったりするとき、またはセレクターを書く価値がないときに勝ちます。セレクターが不要で、再設計に耐えるからです。CSSセレクターは、単一の安定したサイトで高ボリュームで勝ちます: それらは決定論的で、ページごとに非常に安価です。ほとんどの生産パイプラインは、コアターゲットにはセレクターを、長い尾にはLLM抽出を使用します。

AIウェブスクレイピングは、モデルをスクレイパーとして扱うのをやめたときに強力になります。プロキシでクリーンに取得し、マークダウンをHTMLではなくフィードし、スキーマで出力を制約し、その柔軟性がトークンコストに見合う仕事にLLM抽出を予約します。それが、スムーズなデモと毎日実行できるパイプラインの違いです。

Extract APIでどんなページもJSONに変換