🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

ジェミニウェブスクレイピング:Pythonによるスキーマファースト抽出

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

29-Jul-2026

TL;DR:

  • Geminiの安価なフラッシュティアは、まさにこの仕事のために作られています。 レンダリングされたページと厳密なスキーマを与えると、検証されたレコードが返ります—このガイドのライブ実行では、50,449文字のカタログページから全20製品を12,904トークンで抽出しました。
  • スキーマファースト、プロンプトセカンド。 現在のGemini APIは、リクエスト自体にPydantic由来のJSONスキーマを受け入れるため、フィールド名とタイプはAPIによって強制され、記述で求められることはありません。
  • Geminiが解決しないのはページの取得です。 モデルはJavaScriptをレンダリングしたり、セッションを保持したり、選択したボリュームでアクセスチャレンジをクリアしたりできません—それはフェッチレイヤーが行い、このガイドのフェッチはScrapeless Universal Scraping APIを介してページごと1 POSTです。
  • トークンコストはページサイズに追従するため、フェッチの質がコスト管理に。 切り取られた、レンダリングされたコンテンツを送信することで、壊れたウェブや膨大なフェッチとは違い、スケールでセントと本物のお金の違いが生まれます。
  • まだGoogleキーがない? 同じ抽出がOpenRouterを通じて実行可能。 このガイドはgoogle/gemini-2.5-flash-liteでライブ実行し、キャプチャされた出力を示します。
  • フェッチ側は無料でスタート。 app.scrapeless.comでScrapeless APIキーを作成します。

Geminiはウェブサイトをスクレイピングできますか?

Geminiは抽出を行いますが、収集は行いません。モデルにページテキストとスキーマを渡すと、クリーンなレコードが返ります—その部分は本当に素晴らしいことで、フラッシュティアでは安価です。しかし、スクレイピングパイプラインは固有のページをフェッチし、JavaScriptをレンダリングし、あなたが制御するボリュームとペースで行わなければなりませんが、それは言語モデルAPIの中には存在しません。

Googleは、APIが渡されたリンクを読み取ることができるURLコンテキストツールを提供しており、誠実なフレーミングの価値があります:一度きりの読み方には便利ですが、そのフェッチングを引き継ぎます—レンダリングの挙動、地理、またはページが自動アクセスに挑むときに何が起こるかを制御できません。生産的な抽出は層を別々に保ちます:あなたが制御するフェッチレイヤーがあり、その後Geminiがパーサーとして機能します。

一つの区別として、キーワードが両方向に切るため:このガイドはGeminiを抽出エンジンとしてウェブに向けます。Gemini自身の回答をデータとしてキャプチャすることは逆の仕事であり、それがGemini Scraper APIガイドであり、LLMスクレイパー解説がそのカテゴリーをカバーします。

インストール

二つのクライアント:ネイティブパス用のGoogleのSDKと、フェッチレイヤー用のrequests。このガイドで実行したのはPython 3.12でした:

bash Copy
pip install google-genai requests

構成

両方のキーは環境から取得します:

bash Copy
export GEMINI_API_KEY="your_google_ai_studio_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

抽出に値するページをフェッチ

デモターゲットは、スクレイピングの練習用に作られた公共の書店カタログページです—20製品、各製品にはタイトル、価格、在庫フラグ、プレゼンテーションHTMLに埋め込まれた星評価があります。Universal Scraping APIに1 POSTを行うと、レンダリング、アンロック、およびプロキシルーティングがサーバーサイドで処理され、ページが返されます:

python Copy
# fetch_catalogue.py — 1 POSTでレンダリングされたカタログページを返します
import os

import requests

resp = requests.post(
    "https://api.scrapeless.com/api/v1/unlocker/request",
    headers={
        "Content-Type": "application/json",
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
    },
    json={
        "actor": "unlocker.webunlocker",
        "input": {"url": "https://books.toscrape.com/catalogue/page-1.html", "method": "GET"},
    },
    timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")
print(f"取得した文字数: {len(html):,}文字")
print("HTML内の製品カード数:", html.count('<article class="product_pod">'))

with open("page.html", "w", encoding="utf-8") as f:
    f.write(html)

この実行は50,449文字と20の製品カードを印刷します。この50kの数字は後で重要です:それがGeminiが読む内容であり、あなたがトークンを支払う対象です。

基本的な実装:スキーマファーストの抽出

現在のGemini APIはリクエスト内にJSONスキーマを受け付けており、最もクリーンな方法はPydanticモデルを生成することです—スキーマ言語自体はJSONスキーマ仕様によって定義されています。このページの評価はテキストではなくCSSクラスに存在するため、スキーマとシステムルールによりそれらの読み取り方法が明記されています。
注意: このブロックでは GEMINI_API_KEY が必要です — このガイドではこの前提条件を想定していません。次のセクションでは、キャプチャされた出力を含めて OpenRouter を通じて同じ抽出をライブで実行します。正確なリクエストサーフェスは Gemini構造化出力ガイド に文書化されています。

python Copy
# extract_gemini.py — ネイティブGemini抽出(GEMINI_API_KEYが必要)
from google import genai
from pydantic import BaseModel


class Book(BaseModel):
    title: str
    price_gbp: float
    in_stock: bool
    rating: int


class Catalogue(BaseModel):
    books: list[Book]


client = genai.Client()  # 環境からGEMINI_API_KEYを読み取ります
page_html = open("page.html", encoding="utf-8").read()

interaction = client.interactions.create(
    model="gemini-3.5-flash",
    input="すべての本を抽出します。評価は1-5で、星評価のクラス名から読み取ります。\n\n" + page_html,
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Catalogue.model_json_schema(),
    },
)
print(interaction)

スキーマが強制を行います: price_gbpは数値、in_stockはブール値、ratingは整数として返されます — 事後の文字列クリーンアップは不要です。

Googleキーがありませんか?OpenRouter経由で実行します

抽出は、背後にGeminiモデルを持つOpenAI互換のサーフェスでも実行されます。これは、このガイドが一貫して実行した方法です — 取得と抽出を一つの自己完結したスクリプトで実行します。

python Copy
# extract_openrouter.py — 同じ抽出、OpenRouterを介して実行
import json
import os

import requests
from openai import OpenAI

resp = requests.post(
    "https://api.scrapeless.com/api/v1/unlocker/request",
    headers={
        "Content-Type": "application/json",
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
    },
    json={
        "actor": "unlocker.webunlocker",
        "input": {"url": "https://books.toscrape.com/catalogue/page-1.html", "method": "GET"},
    },
    timeout=120,
)
resp.raise_for_status()
page_html = resp.json().get("data", "")

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ["OPENROUTER_API_KEY"],
)

completion = client.chat.completions.create(
    model="google/gemini-2.5-flash-lite",
    temperature=0,
    max_tokens=4000,
    response_format={"type": "json_object"},
    messages=[
        {
            "role": "system",
            "content": 'すべての本を抽出します。 JSONのみで返信します: '
            '{"books":[{"title":str,"price_gbp":number,"in_stock":bool,"rating":int}]}. '
            "評価は1-5で、星評価のクラス名から読み取ります。",
        },
        {"role": "user", "content": page_html},
    ],
)

data = json.loads(completion.choices[0].message.content)
print(f"抽出された本の数: {len(data['books'])}")
print(json.dumps(data["books"][0], ensure_ascii=False))

ライブ実行は20製品すべてを返しました。最初のレコード:

text Copy
抽出された本の数: 20
{"title": "A Light in the Attic", "price_gbp": 51.77, "in_stock": true, "rating": 3}

価格は浮動小数点数に解析され、在庫はブール値に、三つ星の評価はクラス名から正しく読み取られました — 50k文字のカタログHTMLから、1回の呼出しで、12,904トークンで、モデルは百万単位で数セントの価格です。

無料プランでAPIキーを取得してください: app.scrapeless.com

高度なパターン: トークン経済学

抽出コストは入力に支配されるため、取得層も予算層になります。

  • ページごとのトークンを早期に測定する。 上記の実行では、1つのカタログページに12,904トークンがかかりました。モデルティアにコミットする前にページ数を掛け算してください、請求書の後ではなく。
  • 送信前にトリミング。 ページの外枠は税金です。製品コンテナを特定するか、生のHTMLではなくマークダウンとしてページを取得することで、入力サイズを削減できます — しばしば半分以上 — 抽出可能コンテンツの損失はゼロです。
  • スキーマ作業にはフラッシュティアに留まる。 厳密なスキーマと temperature=0 が抽出を制約されたタスクにします; 上記の実行にはそれ以上は必要ありません。フィールドがクリーンな入力で間違って戻ってくる場合のみ、モデルサイズを拡大します。
  • プロンプトに何もキャッシュしない。 スキーマは呼び出しごとに1回システムメッセージに存在します; 新しい呼び出しに以前のページの例を貼り付けないでください — それは入力を膨らませ、モデルに古いレコードを反響させることを教えます。

トラブルシューティング

  • フィールドが文字列として返される。 スキーマがAPIに到達していません — ネイティブ呼び出しが schema を渡していることを確認してください(またはOpenRouterの呼び出しがシステムメッセージでJSON契約を渡していることを確認してください)、フィールドを緩く口頭で説明するのではなく。
  • 20製品ページからゼロまたは3製品。 最初に取得したHTMLを確認してください: 取得スクリプトが行うように製品カードを数えます。ほぼ空の取得はレンダリングやアクセスの問題です — プロンプト修正ではなく取得層の修正が必要です。
  • 評価はすべて5に戻ります。 その値はテキストではなく、マークアップにエンコードされています。「星評価のクラス名から読み取る」と記載されているように、それがどこにあるかを言及します。この2つの抽出ブロックのように。
  • コストは実行ごとに変動します。 入力サイズを比較してください。ページの重さが倍になる再設計は、トークン料金も倍にします。トリミングとマークダウン取得がそのレバーになります。

結論

Geminiのフラッシュティアと厳格なスキーマを組み合わせることで、50,000文字のカタログページを20個の記録に変換でき、これが抽出の半分であり、今や簡単な半分です。記録が存在するかどうかを決定する半分はフェッチです:レンダリングされ、制御され、ページごとに1回のPOSTがあります。層を分けて、ページごとのトークンを測定し、同じ40行がデモ書店から本物のカタログにスケールします。

Geminiに実際のページをフィードする準備はできていますか?

ここでのフェッチ層はユニバーサルスクレイピングAPIです — プランとリクエスト量は価格ページにあり、開発者ドキュメントはすべてのunlocker.webunlockerパラメータをカバーしています。無料プランでキーを作成し、app.scrapeless.comで上記のカタログフェッチが記載の通りに実行されます。

FAQ

Q: Geminiはウェブサイトに直接アクセスできますか?

GoogleのURLコンテキストツールを通じてのみ、リンクをサーバーサイドで取得し、一時的な読み取りを行います。レンダリング制御、地理的な出口、またはボリュームは提供されず、これはスクレイピングパイプラインが構築されるプロパティです — そのため、プロダクションセットアップではGeminiを専用のフェッチ層と組み合わせ、モデルにクリーンなページテキストを渡すことが一般的です。

Q: 抽出にはどのGeminiモデルを使用すべきですか?

スキーマを保持する最小のフラッシュティアモデルを使用してください。厳格なスキーマに対する抽出は制約されたタスクであり、推論のベンチマークではありません — このガイドでのライブ実行ではフラッシュライトモデルを使用し、すべての20記録を正しく型付けしました。クリーンな入力がまだ間違ったフィールドを生成する場合にのみ、ティアを上げてください。

Q: スケールでのGeminiウェブスクレイピングのコストはどのくらいですか?

入力トークンが支配するため、コストはだいたい「ページ数 × ページごとのトークン数 × モデル料金」です。ここで測定された実行では、50,449文字のページに12,904トークンかかりました; クロームをトリミングしたりマークダウンを取得したりすると、これを大幅に削減できます。外挿する前に実際のページを1つ測定してください — 発明された平均は予算が消失する理由です。

Q: Geminiスクレイパーとは何が違いますか?

方向性。このガイドでは、Geminiをウェブを指すパーサーとして使用しています。GeminiスクレイパーはGeminiにスクレイパーを向け、その回答、引用、ソースをデータとしてキャプチャします。Scrapelessはそれをアクターとして配信し、このイントロダクションにリンクされたGeminiスクレイパーAPIガイドでカバーしています。

Q: Geminiを使ったスクレイピングは合法ですか?

抽出層は収集ルールに何も変更を加えません。公共ページのみを取得し、サイトの利用規約およびロボット排除プロトコルで標準化されたロボット指令を尊重し、ボリュームを制限し、個人データを合法的に扱います — さらに、モデルサイドのGoogleのAPI条件も考慮します。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ