🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

双子座网页抓取:Python中的模式优先提取

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

29-Jul-2026

简要总结:

  • Gemini 的廉价闪电层正是为此而设计。 给它提供一个渲染后的页面和严格的模式,它就会返回经过验证的记录——本指南中的实时运行从一个 50,449 字符的目录页面中提取了所有 20 个产品,消耗了 12,904 个令牌,使用的是一个轻量级的闪电模型。
  • 优先考虑模式,其次是提示。 当前的 Gemini API 在请求中接受一个基于 Pydantic 的 JSON 模式,因此字段名称和类型由 API 强制执行,而不是以散文形式请求。
  • Gemini 无法解决的是获取页面的问题。 模型无法渲染 JavaScript、保持会话或在您选择的数量下破除访问挑战——获取层负责这些,本指南中的获取是通过 Scrapeless 通用抓取 API 每个页面一次 POST。
  • 令牌成本与页面大小相关,因此获取质量是成本控制。 发送经过修剪的、渲染的内容,而不是破损或臃肿的获取,是大规模操作时便宜与真实金钱之间的区别。
  • 还没有 Google 密钥?同样的提取通过 OpenRouter 运行。 本指南在 google/gemini-2.5-flash-lite 上进行了实时执行,并展示了捕获的输出。
  • 获取侧免费开始。app.scrapeless.com 创建您的 Scrapeless API 密钥。

Gemini 可以抓取网站吗?

Gemini 提取;它不收集。将页面文本和模式交给模型,它会返回干净的记录——这一部分确实非常出色,并且在闪电层上便宜。但抓取管道还必须获取特定页面,渲染其 JavaScript,并按照您控制的数量和频率执行,而这些都不存在于语言模型 API 内部。

Google 确实提供了 URL 上下文工具,允许 API 读取您传入的链接,值得坦诚地表述:适合单次阅读,但您继承了其获取——对渲染行为、地理位置或页面何时挑战自动访问没有控制权。生产提取保持层的分离:一个由您控制的获取层,然后是作为解析器的 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 中的星级评分。向 通用抓取 API 发送一次 POST,返回处理了渲染、解锁和代理路由的页面:

python Copy
# fetch_catalogue.py — 一次 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 运行

此提取还通过兼容 OpenAI 的接口运行,后方有一个 Gemini 模型,这就是本指南如何从头到尾执行它的方式 —— 在一个自包含的脚本中获取和提取:

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}

价格解析为浮点数,库存为布尔值,三颗星的评分正确地从类名中读取 —— 从 5 万个字符的目录 HTML 中,一次调用中,需 12,904 个令牌,而该模型的定价为每百万分之几美元。

在免费计划上获取您的 API 密钥:app.scrapeless.com

高级模式:令牌经济

提取成本以输入为主,因此获取层也是预算层。

  • 尽早测量每页令牌数。 上述运行为一页目录花费了 12,904 个令牌。在确认模型等级前,将其乘以您的页面数,而不是在发票后。
  • 发送前修剪。 页面外观是额外的开销。隔离产品容器,或将页面作为 markdown 而不是原始 HTML 获取,可以大大减少输入大小 — 通常减少超过一半 — 而不会损失可提取内容。
  • 在模式工作时保持在闪电层。 严格的模式加上 temperature=0 使得提取成为一个受限制的任务;上述运行不需要更大的模式。只有当字段在清晰输入上返回错误时,才升高模型大小。
  • 在提示中不要缓存任何内容。 每次调用时,模式只存在于系统消息中;不要将前一页的示例粘贴到新调用中——这会膨胀输入并教导模型回显陈旧记录。

故障排除

  • 字段作为字符串返回。 您的模式未到达 API —— 检查原生调用是否传递了 schema(或 OpenRouter 调用在系统消息中传递了 JSON 合同),而不是用散文松散描述字段。
  • 从 20 产品页面获取 0 或 3 个产品。 首先检查获取的 HTML:按抓取脚本的方式计算产品卡片。近乎空的获取是渲染或访问问题——这是获取层的修复,而不是提示的修复。
  • 所有评分均为5分。 该值以标记编码,而非文本。说明它的来源(“从星级评分类名读取”),如这里的两个提取块所示。
  • 费用在运行之间波动。 比较输入大小;一次设计重构使页面重量翻倍,您的令牌账单也随之翻倍。修剪和提取 markdown 是杠杆。

结论

Gemini 的闪存级别加上严格的架构将一个 5 万字符的目录页面转化为 20 条简洁记录,只需小额费用——这就是提取的一半,现在是容易的一半。决定记录是否存在的另一半是提取:呈现、控制,每页一个 POST。保持各层分离,衡量每页的令牌,四十行代码可以从演示书店扩展到真实目录。

准备为 Gemini 提供真实页面?

这里的提取层是 Universal Scraping API — 计划和请求量见 定价页面开发者文档 涵盖了每个 unlocker.webunlocker 参数。 在免费的计划上创建一个密钥,访问 app.scrapeless.com,上述目录提取按所述运行。

常见问题

问:Gemini 能直接访问网站吗?

只能通过 Google 的 URL 上下文工具,它在服务器端获取链接进行一次性读取。它不提供渲染控制、地理出口或流量——爬取管道所依赖的属性——这就是为什么生产设置将 Gemini 与专用提取层配对并传递干净的页面文本。

问:我应该使用哪个 Gemini 模型进行提取?

最小的闪存级别模型,能够保持您的架构。针对严格架构的提取是一个受限任务,而非推理基准——本指南中的实时运行使用了闪存轻量模型,正确输入了所有 20 条记录。仅当干净输入仍然产生错误字段时,才考虑升级等级。

问:大规模使用 Gemini 网络爬虫的成本是多少?

输入令牌占主导,因此成本大致为页面数 × 每页令牌数 × 模型费率。这里测量的运行为一页 50,449 字符的页面使用了 12,904 个令牌;修剪 Chrome 或提取 Markdown 会大幅减少。推算之前先测量一个真实页面——虚构的平均值是预算崩溃的原因。

问:这与 Gemini 爬虫有何不同?

方向。本指南使用 Gemini 作为指向网络的解析器。Gemini 爬虫则将爬虫指向 Gemini——捕获其答案、引用和来源作为数据。Scrapeless 将其作为演员发布;在介绍中链接的 Gemini 爬虫 API 指南涵盖了这一点。

问:使用 Gemini 进行爬虫是否合法?

提取层未改变任何关于收集规则的规定。仅获取公共页面,遵守网站条款以及由 机器人排除协议 标准化的机器指令,保持量的上限,合法处理任何个人数据——此外还有关于模型方的 Google API 条款。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录