v2 APIの変更: JSONスキーマ抽出はv2で完全にサポートされていますが、APIのフォーマットが変更されました。v2では、スキーマは formats: [{type: "json", schema: {...}}] のようにフォーマットオブジェクト内に直接埋め込まれます。v1の jsonOptions パラメータはv2では廃止されています。
Firecrawlで構造化データをスクレイプして抽出する
FirecrawlはAIを用いて、ウェブページから構造化データを3ステップで取得します:
-
スキーマを設定(任意):
取得したいデータを指定するために(OpenAIの形式の)JSONスキーマを定義するか、厳密なスキーマが不要な場合はウェブページのURLと
promptだけを指定します。
-
リクエストを送信:
URLとスキーマを、JSONモードを用いて/scrape エンドポイントに送ります。詳しくはこちら:
Scrape Endpoint Documentation
-
データを取得:
スキーマに一致するクリーンな構造化データが返ってきます。すぐに利用できます。
これにより、必要なフォーマットでウェブデータを素早く簡単に取得できます。
スクレイピングしたページから構造化データを抽出するために使用します。
from firecrawl import Firecrawl
from pydantic import BaseModel
app = Firecrawl(api_key="fc-YOUR-API-KEY")
class CompanyInfo(BaseModel):
company_mission: str
supports_sso: bool
is_open_source: bool
is_in_yc: bool
result = app.scrape(
'https://firecrawl.dev',
formats=[{
"type": "json",
"schema": CompanyInfo.model_json_schema()
}],
only_main_content=False,
timeout=120000
)
print(result)
出力:
{
"success": true,
"data": {
"json": {
"company_mission": "AI対応のウェブスクレイピングとデータ抽出",
"supports_sso": true,
"is_open_source": true,
"is_in_yc": true
},
"metadata": {
"title": "Firecrawl",
"description": "AI対応のウェブスクレイピングとデータ抽出",
"robots": "follow, index",
"ogTitle": "Firecrawl",
"ogDescription": "AI対応のウェブスクレイピングとデータ抽出",
"ogUrl": "https://firecrawl.dev/",
"ogImage": "https://firecrawl.dev/og.png",
"ogLocaleAlternate": [],
"ogSiteName": "Firecrawl",
"sourceURL": "https://firecrawl.dev/"
},
}
}
エンドポイントに prompt を渡すだけで、スキーマなしで抽出できます。データの構造は LLM が決定します。
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-YOUR-API-KEY")
result = app.scrape(
'https://firecrawl.dev',
formats=[{
"type": "json",
"prompt": "ページから企業のミッションを抽出してください。"
}],
only_main_content=False,
timeout=120000
)
print(result)
出力:
{
"success": true,
"data": {
"json": {
"company_mission": "AI搭載のウェブスクレイピングとデータ抽出",
},
"metadata": {
"title": "Firecrawl",
"description": "AI搭載のウェブスクレイピングとデータ抽出",
"robots": "follow, index",
"ogTitle": "Firecrawl",
"ogDescription": "AI搭載のウェブスクレイピングとデータ抽出",
"ogUrl": "https://firecrawl.dev/",
"ogImage": "https://firecrawl.dev/og.png",
"ogLocaleAlternate": [],
"ogSiteName": "Firecrawl",
"sourceURL": "https://firecrawl.dev/"
},
}
}
以下は、ウェブサイトから構造化された企業情報を抽出する包括的な例です:
from firecrawl import Firecrawl
from pydantic import BaseModel
app = Firecrawl(api_key="fc-YOUR-API-KEY")
class CompanyInfo(BaseModel):
company_mission: str
supports_sso: bool
is_open_source: bool
is_in_yc: bool
result = app.scrape(
'https://firecrawl.dev/',
formats=[{
"type": "json",
"schema": CompanyInfo.model_json_schema()
}]
)
print(result)
出力:
{
"success": true,
"data": {
"json": {
"company_mission": "WebサイトをLLM対応データに変換",
"supports_sso": true,
"is_open_source": true,
"is_in_yc": true
}
}
}
v2 で JSONモード を使用する場合、formats にスキーマを直接埋め込んだオブジェクトを含めます:
formats: [{ type: 'json', schema: { ... }, prompt: '...' }]
パラメータ:
schema: 取得したい構造化出力を記述する JSON Schema(スキーマベースの抽出では必須)。
prompt: 抽出をガイドするための任意のプロンプト(スキーマなしの抽出でも使用)。
重要: v1 と異なり、v2 には個別の jsonOptions パラメータはありません。スキーマは formats 配列内のフォーマットオブジェクトに直接含める必要があります。
HTML 属性は JSON 抽出では利用できません。 JSON 抽出はページを markdown に変換した結果に対して実行され、この変換では表示テキストのみが保持されます。HTML 属性(例: data-id、要素上のカスタム属性)は変換時に削除されるため、LLM からは参照できません。HTML 属性値を抽出する必要がある場合は、rawHtml フォーマットを使用してクライアント側で属性をパースするか、executeJavascript アクションを使って抽出前に属性値を表示テキストへ埋め込んでください。
JSON 抽出の結果が一貫しなかったり不完全だったりする場合、次のベストプラクティスが役立ちます。
- プロンプトは短く、焦点を絞る。 多くのルールを含む長いプロンプトはばらつきを増やします。具体的な制約(許可される値など)はプロンプトではなくスキーマ側に移してください。
- プロパティ名は簡潔にする。 プロパティ名の中に指示や列挙リストを埋め込まないでください。
"installation_type" のような短いキーを使い、許可される値は enum 配列に入れます。
- 制約されたフィールドには
enum 配列を追加する。 フィールドが固定の値セットを持つ場合、それらを enum に列挙し、ページ上に表示されているテキストと完全に一致させてください。
- フィールドの説明に null ハンドリングを含める。 モデルが欠損値を推測しないよう、各フィールドの
description に "Return null if not found on the page." を追加してください。
- 場所のヒントを追加する。 モデルにページ上のどこからデータを取得するかを伝えます(例:
"Flow rate in GPM from the Specifications table.")。
- 大きなスキーマは小さなリクエストに分割する。 フィールド数が多いスキーマ(例: 30 項目以上)は結果の一貫性が下がります。10〜15 フィールドずつ、2〜3 個のリクエストに分割してください。
よく構造化されたスキーマの例:
{
"type": "object",
"properties": {
"product_name": {
"type": ["string", "null"],
"description": "Full descriptive product name as shown on the page. Return null if not found."
},
"installation_type": {
"type": ["string", "null"],
"description": "Installation type from the Specifications section. Return null if not found.",
"enum": ["Deck-mount", "Wall-mount", "Countertop", "Drop-in", "Undermount"]
},
"flow_rate_gpm": {
"type": ["string", "null"],
"description": "Flow rate in GPM from the Specifications section. Return null if not found."
}
}
}