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

掌握网页抓取:实用的Python指南

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

29-Jul-2026

TL;DR:

  • Grok的API流利地使用OpenAI,因此它是一个即时的提取引擎。 将官方OpenAI Python SDK指向https://api.x.ai/v1,模型将页面文本转换为JSON记录,使用temperature=0response_format={"type": "json_object"}
  • Grok所不做的是提取。 该模型没有浏览器和会话;xAI的服务器端网络搜索工具用实时结果支持答案,而批量页面提取仍然是你的工作。
  • 差距在一个脚本中可见。 在一个JavaScript渲染的演示页面上进行简单的GET请求包含0个引用元素;同一个URL通过Scrapeless Universal Scraping API使用js_render包含所有10个 — 而渲染的HTML就是Grok提取的内容。
  • 本指南中的提取是真实的,而不是假设的。 针对渲染页面的实时运行返回了所有10个引用,作者和标签数组完好无损 — 整个调用消耗了3211个tokens。
  • 还没有xAI密钥?相同的请求通过OpenRouter运行。 相同的OpenAI SDK,不同的base_url和模型字符串;本指南展示了这两条路径。
  • 在提取方面免费开始。app.scrapeless.com创建你的Scrapeless API密钥。

Grok能抓取网站吗?

Grok可以读取你提供的页面,并准确返回你要求的字段;它无法在抓取量上获取该页面。这是每个"Grok网络抓取"设置的两个方面,将它们混淆是项目停滞的原因。xAI API暴露了一个语言模型 — 实际上连接起来异常简单,因为端点接受与OpenAI相同的请求格式 — 但HTTP提取、JavaScript渲染、会话状态和访问挑战都在其外部。

xAI确实提供了一个服务器端的网络搜索工具,并且值得诚实地提到:它允许Grok搜索和读取实时网络以支持一个答案。这是为问答提供的数据检索。它不允许你控制哪些页面被提取,如何渲染,或者你可以处理多少个页面 — 这三点是抓取管道构建的基础。

因此,工作的架构是两层:一个提取层返回忠实渲染的HTML,Grok作为将其转换为记录的提取层。在代码之前再做一次澄清:本指南将Grok指向网络。将抓取器指向Grok — 将其答案捕获为数据 — 是相反的工作,涵盖于Grok Scraper API指南LLM抓取器解释

安装

整个工具链是OpenAI SDK加上requests — 本指南所使用的版本是openai 2.34.0和当前的requests

bash Copy
pip install "openai==2.34.0" requests

配置

密钥保持在环境中,绝不写入源代码:

bash Copy
export XAI_API_KEY="xai-your_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

获取Grok可以实际读取的页面

提取质量受限于提取的真实性,因此从大多数Grok教程结束的地方开始。在JavaScript渲染的页面上,普通HTTP客户端接收到的文档并不是阅读器所看到的文档 — 内容仅在脚本构建DOM后到达,这是由HTML脚本规范定义的生命周期。一个脚本展示了差异,并保存了值得提取的版本:

python Copy
# fetch_rendered.py — 普通GET与服务器端渲染,相同URL
import os

import requests

URL = "https://quotes.toscrape.com/js/"
MARKER = '<span class="text"'

plain = requests.get(URL, timeout=60).text
print(f"plain GET: {len(plain):,} chars | quote elements: {plain.count(MARKER)}")

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": URL, "method": "GET", "js_render": True},
    },
    timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print(f"rendered:  {len(rendered):,} chars | quote elements: {rendered.count(MARKER)}")

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

运行打印 quote elements: 0 对于普通获取,而对于渲染的则为 quote elements: 10。渲染、解锁和代理路由都发生在服务器端的一个 POST 请求中——通用抓取 API 是抓取层,而 page.html 现在是模型可以提取的内容。

基本实现:将 Grok 作为提取器

xAI 端点接收标准的 OpenAI 聊天完成请求。两个参数决定了可靠性:temperature=0 使输出在运行之间保持稳定,JSON 模式则保持可解析性。在系统消息中命名您想要的确切键,并告诉模型如何处理缺失值。

注意:此块需要一个带有信用额度的 XAI_API_KEY ——这是本指南不假设的唯一先决条件。下一部分通过 OpenRouter 直播运行相同的提取,捕获输出。

python Copy
# extract_grok.py — 通过 xAI API 进行 Grok 提取(需要 XAI_API_KEY)
import json
import os

from openai import OpenAI

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

page_html = open("page.html", encoding="utf-8").read()

completion = client.chat.completions.create(
    model="grok-4.5",
    temperature=0,
    response_format={"type": "json_object"},
    messages=[
        {
            "role": "system",
            "content": '提取每个引用。仅以 JSON 回复:'
            '{"quotes":[{"text":str,"author":str,"tags":[str]}]}. 用 null 表示缺失值。',
        },
        {"role": "user", "content": page_html},
    ],
)

data = json.loads(completion.choices[0].message.content)
print(f"提取了 {len(data['quotes'])} 个引用")

grok-4.5 是 xAI 当前文档的中心;根据您的帐户运行的级别进行替换。请求的形状不会改变。

没有 xAI 密钥?通过 OpenRouter 运行相同的请求

因为请求的形状是 OpenAI 端到端的,聚合器密钥可以通过两个编辑来工作:base_url 和模型字符串。这是本指南实际执行的变体——在一个自包含的脚本中进行抓取和提取:

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://quotes.toscrape.com/js/", "method": "GET", "js_render": True},
    },
    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="x-ai/grok-4.20",
    temperature=0,
    response_format={"type": "json_object"},
    messages=[
        {
            "role": "system",
            "content": '提取每个引用。仅以 JSON 回复:'
            '{"quotes":[{"text":str,"author":str,"tags":[str]}]}. 用 null 表示缺失值。',
        },
        {"role": "user", "content": page_html},
    ],
)

data = json.loads(completion.choices[0].message.content)
print(f"从渲染页面提取了 {len(data['quotes'])} 个引用")
print(json.dumps(data["quotes"][0], ensure_ascii=False))

实时运行提取了所有 10 个引用,并打印了第一个:

text Copy
从渲染页面提取了 10 个引用
{"text": "“我们所创造的世界是我们思维的过程。没有改变我们的思维就不能改变它。”", "author": "阿尔伯特·爱因斯坦", "tags": ["改变", "深度思考", "思维", "世界"]}

作者和标签数组完整通过,整个调用消耗了 3,211 个 tokens。这就是整个抓取器:一次 POST 获取,一次完成提取,任何地方都没有选择器。

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

高级模式

  • 在系统消息中固定模式,而不是用户提示中。 页 HTML 放在用户回合中;合约保留在系统回合中,能够保持跨页面循环。
  • 在 Python 中循环,而不是在提示中循环。 每次完成处理一页可以防止记录跨边界流动,并使失败可以归因于特定 URL。
  • 尽可能发送更少的页面。 Grok 读取您发送的整个文档,包括 chrome。在提取内容容器或改为获取 markdown,而不是 HTML 的情况下,可以大致按照比例减少 token 消耗。
  • 明确处理标签和列表。 在架构中命名 tags:[str] 使得上面的运行产生了干净的数组;保持列表字段不描述,模型会将它们压缩成字符串。

故障排除

  • 使用散文而非 JSON。 你省略了 response_format={"type": "json_object"} — 有了它,端点限制输出;没有它,你正在解析善意。
  • 期望十条记录,返回三条。 检查你获取的内容,再指责模型:按获取脚本的方式计算 HTML 中已知元素的数量。接近空的获取意味着渲染问题,在获取层使用 js_render 修复。
  • 相同输入产生不同输出。 设置 temperature=0;提取不是创造性的任务。
  • 成本上升。 令牌支出与输入大小相关。修剪页面,不进行批处理,并密切关注每页的令牌计数,方式与上面的运行报告一致。

结论

Grok 在刮取器中赢得了一席之地,作为不接触网络的层:OpenAI 形状的请求、确定性的设置、一页输入、一 JSON 对象输出。决定这一切是否可能的层是获取 — 第一个脚本的 0 对 10 打印解决了这个问题 — 一次服务器渲染的 POST 消除了这种差距。将两者连接起来,演示页面上的十个引述作为验证的记录到达,标签和所有内容。

准备好用 Grok 处理真实页面了吗?

本指南中的获取层是 通用刮取 API 每页一个 POST — 计划和用量在 定价页面 上, 开发者文档 涵盖 unlocker.webunlocker 参数。在 app.scrapeless.com 上创建一个免费计划的密钥,然后按原样重新运行两个脚本。

常见问题

问:Grok 能独立刮取网站吗?

不能。Grok API 从您提供的文本中提取;它无法发出请求、渲染 JavaScript 或保持会话。它的网络搜索工具读取实时网络以提供答案,但页面选择、渲染保真度和数量超出您的控制范围 — 刮取管道需要自己的获取层。

问:Grok 内置的网络搜索与网络刮取是同一件事吗?

不同的工作。搜索工具检索上下文,以便模型可以回答问题;刮取检索特定页面,以便您可以在您选择的数量中提取特定字段。当您需要答案时使用工具,当您需要数据时使用本指南中的双层管道。

问:这与 Grok 刮取器有何不同?

方向。在这里,Grok 是解析器,网络是目标。Grok 刮取器反转了这一点 — 它将 Grok 自身的答案捕获为结构化数据,Scrapeless 作为一个参与者进行传输;引言中链接的 Grok 刮取器 API 指南涵盖了这一工作。

问:我应该选择哪个 Grok 模型进行提取?

最便宜的适合您的架构的模型。使用严格的 JSON 合同和 temperature=0 进行提取不是一个推理密集型的任务,所以从小开始 — 本指南中的实时运行使用了一个通过 OpenRouter 的低价 Grok 层,并正确返回了所有 10 条记录 — 只有当字段开始返回错误时才向上移动。

问:使用 Grok 进行刮取合法吗?

模型并不改变收集规则。仅获取公共页面,尊重网站条款和由 机器人排除协议 标准化的 robots 指令,保持数量有限,并在适用的法律下处理个人数据 — 以及 xAI 在模型方面的使用条款。

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

最受欢迎的文章

目录