使用Python进行人工智能(AI)网页抓取让您可以从网站提取数据,而无需依赖脆弱的解析规则。人工智能(AI)帮助处理页面不一致和动态内容,而Python继续管理获取。在本指南中,您将看到模型如何从非结构化页面提取数据、减少手动解析规则、支持自动化,并扩展为可靠的管道。

在这里插入图片描述

快速答案(TL;DR)

使用Python进行人工智能(AI)网页抓取通常遵循简单的流程:

  • Python获取页面并准备内容
  • 人工智能(AI)模型接收HTML或文本,并返回包含标题、价格或评级等字段的结构化JSON
  • 验证和自动化然后将其转变为可重复的工作流程

这种方法减少了手动解析,更可靠地处理布局更改,并比基于规则的抓取器更好地扩展。有关此模式的快速示例,ChatGPT网页抓取指南展示了人工智能(AI)模型如何直接从网页提取结构化数据。


人工智能(AI)如何改进Python网页抓取

传统的Python网页抓取在页面稳定且可预测时有效。您编写选择器、映射字段并开始抓取。但是,如果网站布局发生变化怎么办?抓取器中断,您又回到调试HTML而不是处理数据。

人工智能(AI)通过将焦点从结构转移到意义来改变这种动态。您不是告诉代码值在DOM中的位置,而是让模型将页面作为一个整体来解释。

从工作流程的角度来看,这将工作从规则编写转移到验证。Python仍然获取页面并处理重试,人工智能(AI)处理解释。诸如AI Parser之类的工具遵循此模型,让您可以将人工智能(AI)提取添加到现有管道中,而无需重新设计它们。

处理不清楚的HTML

实际网页通常包含可能污染HTML结构的嵌套元素和内联脚本。例如,页面可以以不同格式跨列表显示产品名称、价格和可用性。

使用人工智能(AI),您不必不断调整CSS选择器来跟上,因为它仍然可以理解页面上的内容,并每次提取适当的值。

处理HTML布局更改

当网站更新其布局时,经典抓取器会默默失败或返回空字段。另一方面,基于人工智能(AI)的提取通常会继续工作,因为内容的含义没有改变,只有其呈现方式改变了。

处理动态内容

人工智能(AI)还帮助处理动态内容。一旦页面被渲染,您可以将HTML或文本传递给模型并提取结构化数据。该模型不依赖于内容是来自服务器端HTML还是客户端渲染。它处理您提供的输入。

使用人工智能(AI)进行数据提取

数据提取是任何抓取工作流程的标准部分。当HTML干净且布局一致时,传统解析工作得像魔法一样,没有理由重新发明它的完成方式。

当结构停止可靠时,问题就开始了。布局在页面之间变化。相同的字段出现在不同的位置。在那时,提取逻辑成为瓶颈,即使抓取器本身仍在工作。

这就是人工智能(AI)变得有用的地方。您不是依赖确切的标签或路径,而是将完整的HTML或文本传递给模型,并描述您想要返回的字段。该模型专注于内容,而不是布局,即使页面看起来不同,也可以返回相同的字段。

该方法非常适合产品数据、文章和列表,其中结构经常变化,但基础信息保持一致。Python仍然处理获取、重试和验证。人工智能(AI)处理解释。Claude抓取工作流程展示了这种分离如何在页面结构更改时帮助保持提取稳定。

使用人工智能(AI)进行自动化

抓取中的自动化通常会在决策周围崩溃。在检查页面后,您决定什么重要,并编写遵循决策的规则。但是,如果页面上的某些内容发生变化,您需要完全重写规则以适应这些变化。

人工智能(AI)通过帮助您自动化那些判断繁重的步骤来提供帮助。这样,抓取项目进展更快。您花更少的时间维护规则,更多的时间运行稳定的工作流程,即使页面发生变化。

人工智能(AI)发现页面上的模式

当页面遵循松散结构时,人工智能(AI)可以识别重复部分,并推断有用信息可能出现的位置。您不需要预先定义每个选择器。该模型可以专注于看起来像标题或价格的区域。

人工智能(AI)为您过滤内容

页面通常包括导航、广告、页脚和其他与您的数据集不相关的部分。您不是手动删除这些内容,而是模型可以识别页面的哪些部分有用,并忽略其余部分。这在提取甚至开始之前保持输入更清洁。

人工智能(AI)为您分类内容

收集内容后,人工智能(AI)可以自动标记它。它可以区分产品描述、技术细节和不相关的文本。在Python中,这减少了对自定义规则和条件逻辑的需求。


Python的人工智能(AI)工作流程工具

您不需要新的Python堆栈来处理人工智能(AI)抓取。大多数人工智能(AI)驱动的抓取器都是从熟悉的工具构建的,只是责任分工更清晰。

在管道的开始,Python处理页面收集。像Requests这样的库获取HTML并管理头和cookie。此步骤与传统抓取相同,并为您提供对如何访问页面的完全控制。

接下来,您仍然可以使用Beautiful Soup通过删除不必要的脚本和内容来清理页面。通过这样做,您准备页面,以便人工智能(AI)模型可以更轻松地处理。

人工智能(AI)适合解释阶段。您不是遍历DOM和维护选择器,而是将准备好的HTML或文本传递给模型并请求结构化输出。该模型为您处理整个字段识别。

然后,Python通过验证响应和存储数据来完成工作流程。

有关传统设置此工作流程方式的复习,Python抓取指南详细介绍了这些步骤。

Python中的简单人工智能(AI)工作流程

  • 首先,您通过HTTP(S)请求页面。此步骤与经典抓取器相同
  • 接下来,您通过删除script和style块、折叠空白并截断结果来清理内容,以便模型仅看到核心文本和结构
  • 然后,您将清理后的HTML或提取的文本发送到人工智能(AI)模型(在此示例中为OpenAI的ChatGPT),并提供清晰的指令和严格的JSON模式。这是您停止编写选择器并让模型处理语义映射的地方。在此示例中,脚本针对单个演示URL,而不是分页多个页面
  • 之后,您验证响应。像对待用户输入一样对待模型输出。解析JSON,依赖模式强制执行必填字段,并防御性地处理缺失值
  • 最后,您保存结果。JSONL(JSON Lines)非常适合管道,因为您可以在不将所有内容保存在内存中的情况下每页追加一条记录

下面是一个简短的示例,展示了端到端的流程,使用OpenAI的ChatGPT从scrapeme.live提取产品标题和价格并将它们保存为JSONL。要使脚本工作,您首先必须安装所有必要的依赖项:

pip install openai requests beautifulsoup4

然后,获取OpenAI API密钥的访问权限:

import json
Plain text





Drag
import re
Plain text





Drag
import requests
Plain text





Drag
from bs4 import BeautifulSoup
Plain text





Drag
from openai import OpenAI
Plain text





Drag


Plain text





Drag


Plain text





Drag
# Configuration
Plain text





Drag
DEMO_URL = "https://scrapeme.live/shop/Bulbasaur/"
Plain text





Drag
OUTPUT_PATH = "output.jsonl"
Plain text





Drag
MAX_HTML_CHARS = 120_000
Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag
# HTML fetching & cleaning
Plain text





Drag
def fetch_html(url: str) -> str:
Plain text





Drag
   r = requests.get(
Plain text





Drag
       url,
Plain text





Drag
       timeout=30,
Plain text





Drag
       headers={"User-Agent": "Mozilla/5.0 (demo-scraper)"},
Plain text





Drag
   )
Plain text





Drag
   r.raise_for_status()
Plain text





Drag
   return r.text
Plain text





Drag


Plain text





Drag


Plain text





Drag
def clean_html(html: str) -> str:
Plain text





Drag
   soup = BeautifulSoup(html, "html.parser")
Plain text





Drag
   for tag in soup(["script", "style", "noscript"]):
Plain text





Drag
       tag.decompose()
Plain text





Drag


Plain text





Drag


Plain text





Drag
   body = soup.body or soup
Plain text





Drag
   cleaned = str(body)
Plain text





Drag


Plain text





Drag


Plain text





Drag
   cleaned = re.sub(r"\s+", " ", cleaned).strip()
Plain text





Drag
   return cleaned[:MAX_HTML_CHARS]
Plain text





Drag


Plain text





Drag


Plain text





Drag
# OpenAI extraction
Plain text





Drag
def call_ai(cleaned_html: str) -> dict:
Plain text





Drag
   client = OpenAI()
Plain text





Drag


Plain text





Drag


Plain text





Drag
   response = client.responses.create(
Plain text





Drag
       model="gpt-5.2",
Plain text





Drag
       instructions=(
Plain text





Drag
           "Extract product data from the HTML.\n"
Plain text





Drag
           "Return ONLY valid JSON matching the schema.\n"
Plain text





Drag
           "If a field is missing, return null."
Plain text





Drag
       ),
Plain text





Drag
       input=[
Plain text





Drag
           {
Plain text





Drag
               "role": "user",
Plain text





Drag
               "content": [
Plain text





Drag
                   {
Plain text





Drag
                       "type": "input_text",
Plain text





Drag
                       "text": f"URL: {DEMO_URL}\n\nHTML:\n{cleaned_html}",
Plain text





Drag
                   }
Plain text





Drag
               ],
Plain text





Drag
           }
Plain text





Drag
       ],
Plain text





Drag
       text={
Plain text





Drag
           "format": {
Plain text





Drag
               "type": "json_schema",
Plain text





Drag
               "name": "product",
Plain text





Drag
               "strict": True,
Plain text





Drag
               "schema": {
Plain text





Drag
                   "type": "object",
Plain text





Drag
                   "additionalProperties": False,
Plain text





Drag
                   "properties": {
Plain text





Drag
                       "title": {"type": ["string", "null"]},
Plain text





Drag
                       "price": {"type": ["string", "null"]},
Plain text





Drag
                       "currency": {"type": ["string", "null"]},
Plain text





Drag
                   },
Plain text





Drag
                   "required": [
Plain text





Drag
                       "title",
Plain text





Drag
                       "price",
Plain text





Drag
                       "currency",
Plain text





Drag
                   ],
Plain text





Drag
               },
Plain text





Drag
           }
Plain text





Drag
       },
Plain text





Drag
   )
Plain text





Drag


Plain text





Drag


Plain text





Drag
   return json.loads(response.output_text)
Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag
# Persistence
Plain text





Drag
def save_jsonl(record: dict) -> None:
Plain text





Drag
   with open(OUTPUT_PATH, "a", encoding="utf-8") as f:
Plain text





Drag
       f.write(json.dumps(record, ensure_ascii=False) + "\n")
Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag
# Main
Plain text





Drag
def run() -> None:
Plain text





Drag
   html = fetch_html(DEMO_URL)
Plain text





Drag
   cleaned_html = clean_html(html)
Plain text





Drag
   data = call_ai(cleaned_html)
Plain text





Drag


Plain text





Drag


Plain text





Drag
   save_jsonl(data)
Plain text





Drag
   print("Saved:", data)
Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag


Plain text





Drag
if __name__ == "__main__":
Plain text





Drag
   run()
  1. 访问platform.openai.com并登录(如果您没有帐户,请创建一个)
  2. 单击右上角的个人资料图标
  3. 从下拉菜单中选择API keys
  4. 单击Create new secret key按钮
  5. 为您的密钥命名(可选)
  6. 立即复制密钥并将其保存在安全的地方(您将无法再次看到它)
  7. 通过转到SettingsBilling并添加付款方式来设置计费
  8. 在计费部分设置使用限制以控制支出

请注意,API与ChatGPT Plus订阅是分开的: 它们是不同的产品,具有不同的计费。您需要有效的付款方式才能使用API(新帐户可能有免费试用积分)。

要使用您的API密钥,您需要"导出"它。导出设置一个环境变量,使密钥可供您的脚本使用,而无需在文件中硬编码它。

确保此命令和脚本运行命令从同一终端会话执行,以便环境变量可用:

export OPENAI_API_KEY="your_key_here"

最后,如果您不确定如何运行Python脚本,请查看我们关于如何在终端中运行Python代码的指南,并运行此人工智能(AI)网页抓取脚本:

import json
import re
import requests
from bs4 import BeautifulSoup
from openai import OpenAI

# 配置
DEMO_URL = "https://scrapeme.live/shop/Bulbasaur/"
OUTPUT_PATH = "output.jsonl"
MAX_HTML_CHARS = 120_000

# HTML获取和清理
def fetch_html(url: str) -> str:
    r = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "Mozilla/5.0 (demo-scraper)"},
    )
    r.raise_for_status()
    return r.text

def clean_html(html: str) -> str:
    soup = BeautifulSoup(html, "html.parser")
    for tag in soup(["script", "style", "noscript"]):
        tag.decompose()
    body = soup.body or soup
    cleaned = str(body)
    cleaned = re.sub(r"\s+", " ", cleaned).strip()
    return cleaned[:MAX_HTML_CHARS]

# OpenAI提取
def call_ai(cleaned_html: str) -> dict:
    client = OpenAI()
    response = client.responses.create(
        model="gpt-5.2",
        instructions=(
            "从HTML中提取产品数据。\n"
            "仅返回与模式匹配的有效JSON。\n"
            "如果字段缺失,返回null。"
        ),
        input=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "input_text",
                        "text": f"URL: {DEMO_URL}\n\nHTML:\n{cleaned_html}",
                    }
                ],
            }
        ],
        text={
            "format": {
                "type": "json_schema",
                "name": "product",
                "strict": True,
                "schema": {
                    "type": "object",
                    "additionalProperties": False,
                    "properties": {
                        "title": {"type": ["string", "null"]},
                        "price": {"type": ["string", "null"]},
                        "currency": {"type": ["string", "null"]},
                    },
                    "required": [
                        "title",
                        "price",
                        "currency",
                    ],
                },
            }
        },
    )
    return json.loads(response.output_text)

# 持久化
def save_jsonl(record: dict) -> None:
    with open(OUTPUT_PATH, "a", encoding="utf-8") as f:
        f.write(json.dumps(record, ensure_ascii=False) + "\n")

# 主函数
def run() -> None:
    html = fetch_html(DEMO_URL)
    cleaned_html = clean_html(html)
    data = call_ai(cleaned_html)
    save_jsonl(data)
    print("已保存:", data)

if __name__ == "__main__":
    run()

如果您想通过调度运行、处理失败和将结果发送到下游来自动化此操作,而不仅仅是单个脚本,n8n自动化示例展示了相同的步骤如何转换为可重复的管道。


用于Python抓取的现代人工智能(AI)集成

一旦您开始处理数百或数千个页面,主要挑战就变成了如何实际大规模协调抓取。对于每个页面,相同的工作流程重复 - 您获取页面,准备内容,将其发送到人工智能(AI)模型,存储结果。

工作流程引擎旨在帮助您处理这种重复。它们排队任务,并行运行它们,并重试失败,以便您的Python代码专注于核心逻辑。

编排层在此基础上增加了可靠性。例如,如果请求失败或人工智能(AI)调用超时,系统可以重试、暂停或重新路由任务,而不会使整个运行崩溃。因此,无需将复杂的控制流程构建到每个脚本中。

使用这些工具,您还可以管理并发。您不是盲目发送请求,而是可以控制一次处理多少页面。

如果您不想自己管理抓取逻辑,MCP服务器可以简化设置。用于抓取的MCP服务器让您将首选语言模型直接连接到Decodo的抓取基础设施,为模型提供对网络数据的受控、实时访问。您可以获得更可靠的环境,而无需自己构建和维护抓取层。

使用人工智能(AI)构建更强大的管道

您不是止步于结构化输出,而是可以添加人工智能(AI)步骤来提高数据质量并使管道随着时间的推移更有用:

  • 数据验证. 提取后,人工智能(AI)可以检查值在上下文中是否有意义。如果价格看起来像文本而不是数字,或者标题缺失,模型可以标记记录或尝试更正
  • 数据丰富. 您可以要求模型规范化单位、推断类别或生成简短摘要。对于电商页面,这通常意味着将长描述转换为一致的功能列表或按类型标记产品。数据变得更容易查询和比较
  • 数据摘要. 许多页面包含的信息多于下游系统所需的信息。人工智能(AI)可以将该内容压缩为简短的结构化字段,同时保留关键细节。当您从抓取的数据构建目录、内部搜索或报告视图时,这很有用

一个常见的模式是抓取电商页面并将它们转换为随时间保持一致的结构化目录。RAG抓取方法展示了相同的数据如何在单个生产管道中支持提取、丰富和检索。


端到端人工智能(AI)抓取工作流程

端到端人工智能(AI)抓取工作流程最好作为一系列小而可靠的步骤工作:

  • 抓取. Python通过HTTP(S)获取页面,处理重试,并返回内容或错误消息
  • 人工智能(AI)提取. 您不是手动解析每个页面,而是将清理后的内容传递给模型并请求结构化输出。该模型解释页面并返回一致的字段,即使布局不同。这是大多数手动工作消失的地方
  • 验证数据. 检查必填字段,规范化格式,并有意处理部分结果。人工智能(AI)也可以在这里提供帮助,通过标记异常或填补小空白,这有助于随着数据集增长保持数据集可用
  • 自动化. 工作流程引擎在许多页面上运行相同的流程,处理错误,并将结果移至下游。您不需要照看脚本。您监控结果。这就是小实验如何转变为可重复系统的方式

对于初学者来说,这种方法降低了扩展的障碍。您不需要预先预测每个边缘情况。您从简单的流程开始,并根据需要添加验证和自动化。LangChain抓取工作流程展示了这些步骤如何在生产风格的管道中结合在一起。


最后的想法

使用Python进行人工智能(AI)网页抓取通过让模型解释页面内容而不是依赖脆弱的HTML规则来简化提取。Python仍然处理获取、验证和存储,而人工智能(AI)即使在布局更改时也能提供一致的结构化数据。随着工作流程的增长,用于抓取的MCP服务器和n8n自动化等工具使扩展、处理重试和将结果移至下游变得更容易,而无需为脚本添加复杂性。这种方法同样适用于快速实验和生产就绪的管道。


常见问题解答

什么是人工智能(AI)网页抓取?

人工智能(AI)网页抓取是使用语言模型而不是刚性解析规则从网页提取结构化数据的一种方法。您向模型提供HTML或纯文本,它根据含义而不是标签结构返回组织的字段。

实际上,这意味着模型读取页面,理解什么信息重要,并以JSON等格式输出数据。Python处理获取和存储,而人工智能(AI)处理解释。

人工智能(AI)抓取对初学者有好处吗?

是的,人工智能(AI)抓取通常对初学者更容易,因为它消除了传统抓取中许多最困难的部分。您不需要掌握复杂的选择器或编写长解析逻辑就可以提取几个字段。

相反,您专注于定义您想要的数据,并让模型处理页面结构的变化。Python仍然运行工作流程,但人工智能(AI)减少了您需要维护的代码量和手动模式匹配。

人工智能(AI)会取代Python抓取代码吗?

不会,Python仍然负责获取页面、处理HTTP(S)、管理重试和存储结果。人工智能(AI)在代码最脆弱的地方介入,解释页面内容并返回结构化数据。它们共同减少了手动工作并提高了准确性,而无需更改核心抓取工作流程。

我需要特殊硬件吗?

不需要,大多数人工智能(AI)抓取工作流程使用托管API,因此繁重的计算在远程基础设施上运行。您的本地计算机或服务器只需发送请求和处理响应,这意味着标准Python环境就足够了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐