2026 年使用 ChatGPT 进行网页爬虫:分步教程

了解如何使用 ChatGPT 在 Python 中高效进行网页抓取,以及如何使用 Bright Data 的网络解锁器克服反机器人网站限制。
1 分钟阅读
使用 ChatGPT 进行网页爬虫的博客图片

在本指南中,你将看到:

  • 为什么 ChatGPT 是 AI 驱动网页爬虫的理想选择。
  • 如何使用 ChatGPT 通过 Python 爬虫网站数据。
  • 这种方法的主要限制,以及如何绕过它们。

让我们开始吧!

ChatGPT 能爬虫网站吗?

可以。ChatGPT 可以通过两种方式爬虫网站:使用其内置的 Web Search 功能直接从 URL 提取数据(快速,但仅限小规模),或生成由你自己运行的 Python 爬虫代码(可扩展、生产就绪,也是本教程涵盖的内容)。

这两种方法的关键限制都是反机器人保护:验证码、IP 封锁,以及基础脚本无法处理的 JavaScript 渲染。本教程也会介绍如何解决这些问题。

为什么使用 ChatGPT 进行网页爬虫?

ChatGPT(或者更准确地说,GPT 模型)引入了一种强大的网页爬虫新方式。

你不必编写复杂的解析逻辑来从原始 HTML 中提取数据,而是可以让模型处理该过程。OpenAI 的 API 甚至提供了用于数据解析的专用端点,使 GPT 模型特别适合网页爬虫任务。

最大的优势是,你不再需要编写手动的数据解析逻辑。忘掉处理脆弱的 CSS 选择器或 XPath 表达式吧。你所需要的只是一个可靠的数据提取提示词。只需几行代码,你就可以指示 AI 从 HTML 页面中提取结构化数据。

总的来说,这种 AI 驱动的方法使网页爬虫更快、更灵活,也更易于维护。更多详细信息,请参阅我们关于使用 AI 进行网页爬虫的指南。

爬虫场景

ChatGPT 可以改进或替代传统爬虫工具的一些实际场景包括:

  • 具有动态布局的电商网站:即使页面结构不同,也能自动提取产品详情(价格、描述、图片)。这适用于价格监控和/或从 Amazon 等网站检索数据,或爬虫基于 Shopify 的商店
  • 内容聚合:从多个来源爬虫博客文章、评论或新闻文章,并使用 GPT 总结或标准化输出。
  • AI 辅助网页爬取:将 GPT 与爬虫结合,不仅获取页面,还确定哪些链接值得访问或哪些内容应优先爬虫。
  • 社交媒体和快速变化的平台:从内容频繁更新或 UI 难以解析的平台中提取相关信息。

支持的工作流

下面是一些 ChatGPT 爬虫真正大放异彩的高级工作流:

  • 检索增强生成 (RAG):将爬虫到的网页数据直接添加到 ChatGPT 上下文中,以生成更智能、更准确、具备上下文感知能力的答案。请参阅我们关于构建由搜索引擎数据驱动的 RAG 聊天机器人的指南。
  • 实时数据增强:使用即时收集的爬虫产品、定价或趋势数据优化内部工具、控制面板或 AI 代理。
  • 市场研究的快速原型设计:使用 ChatGPT 从多个平台快速收集数据,而无需手动构建自定义爬虫机器人

如何在 Python 中使用 ChatGPT 执行网页爬虫

在本引导部分中,你将看到如何构建一个 ChtGPT 爬虫脚本。目标将是“Ecommerce Test Site to Learn Web Scraping”中的特定产品页面

此页面是理想的测试目标,因为电商产品页面通常在结构上有所不同。它们会根据产品显示不同类型的数据。这种可变性正是电商网页抓取如此具有挑战性的原因,也是 AI 能真正发挥作用的地方。

该爬虫工具将使用 ChatGPT(GPT 模型)从页面中提取这些产品详情,而无需编写任何手动解析逻辑:

  • SKU
  • 名称
  • 图片
  • 价格
  • 描述
  • 尺寸
  • 颜色
  • 类别

注意:以下示例使用 Python 编写,以便简化,并且因为 OpenAI Python SDK 被广泛使用。不过,你也可以使用 JavaScript OpenAI SDK 或任何其他受支持语言实现相同结果。我们还建议你阅读 Python 网页抓取指南

按照以下步骤学习如何使用 ChatGPT 抓取网页数据!

前提条件

在开始之前,请确保你具备以下内容:

按照官方指南检索你的 OpenAI API 密钥

步骤 #1:创建你的 Python 项目

在终端中运行以下命令,为你的网页抓取项目创建一个新文件夹:

mkdir chatgpt-scraper

这个 chatgpt-scraper 目录将作为使用 ChatGPT 进行网页抓取的项目文件夹。

进入该文件夹,并在其中创建一个 Python 虚拟环境

cd chatgpt-scraper
python -m venv venv

在你喜欢的 Python IDE 中打开项目文件夹。带有 Python 扩展的 Visual Studio CodePyCharm Community Edition 都是很好的选择。

在项目文件夹中,创建一个 scraper.py 文件:

chatgpt-scraper
├─── venv/
└─── scraper.py    # <------------

现在,scraper.py 只是一个空的 Python 脚本。它很快将包含通过 ChatGPT 进行 LLM 网页抓取的逻辑。

接下来,在终端中激活虚拟环境。在 Linux 或 macOS 上,运行:

source venv/bin/activate

同样,在 Windows 上,执行:

venv/Scripts/activate

很好!你的 Python 环境现在已经为使用 ChatGPT 进行网页抓取设置好了。

注意:在以下步骤中,你将被引导逐一安装所有必需的依赖项。如果你更喜欢一次性安装它们,请运行以下命令:

pip install requests openai markdownify beautifulsoup4

步骤 #2:在 Python 中配置 OpenAI

要连接到 ChatGPT(即 GPT 模型)进行网页抓取,你需要使用 OpenAI Python SDK。在已激活的虚拟环境中,通过 openai 包安装该库:

pip install openai

然后,在你的代码中导入 OpenAI 客户端:

from openai import OpenAI

要连接到 ChatGPT 进行网页抓取,请创建一个客户端实例:

client = OpenAI()

默认情况下,OpenAI() 构造函数会在 OPENAI_API_KEY 环境变量中查找你的 API 密钥。这是安全配置身份验证的推荐方式

出于开发或测试目的,你也可以直接在代码中添加密钥:
python

OPENAI_API_KEY = "<YOUR_OPENAI_API_KEY>"

client = OpenAI(api_key=OPENAI_API_KEY)

<YOUR_OPENAI_API_KEY> 占位符替换为你的实际 OpenAI API 密钥。

太棒了!你的 OpenAI 设置现在已完成,你可以使用 ChatGPT 进行网页抓取了。

步骤 #3:检索目标页面的 HTML

要从网页抓取数据,你首先需要获取其 HTML。你可以通过使用流行的 Python HTTP 客户端(如 Requests)向目标 Web 服务器发出 GET 请求来实现。

在已激活的虚拟环境中,使用以下命令安装 Requests

pip install requests

接下来,在 scraper.py 中导入该库:

import requests

使用 get() 方法向目标 URL 发送 GET 请求:

url = "https://www.scrapingcourse.com/ecommerce/product/mach-street-sweatshirt"
response = requests.get(url)

目标服务器将返回与该网页关联的 HTML 文档。

如果你打印 response.content,你将看到该页面的完整 HTML 文档:

<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="profile" href="https://gmpg.org/xfn/11" />
    <link rel="pingback" href="https://www.scrapingcourse.com/ecommerce/xmlrpc.php" />

    <!-- omitted for brevity... -->

    <title>Mach Street Sweatshirt &#8211; Ecommerce Test Site to Learn Web Scraping</title>
    <!-- omitted for brevity... -->
  </head>
  <body>
    <!-- omitted for brevity... -->
  </body>
</html>

你现在拥有了目标页面的 HTML。使用 ChatGPT 解析它并从中提取结构化数据!

步骤 #4:将页面 HTML 转换为 Markdown [可选]

注意:此步骤在技术上并非必需,但它可以为你节省大量时间和金钱。因此,值得实现。

在深入 ChatGPT 爬虫之前,花点时间看看其他 AI 网页抓取工具如何处理原始 HTML。你会注意到,它们中的许多都会在将 HTML 传递给 LLM 之前将其转换为 Markdown。

它们为什么这样做?我们的 Kaggle 基准测试强调了两个主要原因:

  • 成本效率:Markdown 使用的 token 比 HTML 更少,这减少了 API 使用量并降低了成本。
  • 更快处理:更少的 token 也降低了计算开销,从而带来更快的响应。

更多详细信息,请阅读我们关于为什么 AI 代理更喜欢 markdown 而不是 HTML的指南。

是时候实现 HTML 到 Markdown 的优化了!

在隐身模式下打开目标网页(以确保新的会话),然后右键单击页面上的任意位置。选择“Inspect”以打开浏览器的 Developer Tools。探索 DOM,你会发现所有相关产品信息都位于 CSS 选择器为 #main 的元素内:

作为第一种方法,你可能会考虑将整个页面的原始 HTML 发送给 ChatGPT 进行数据解析。然而,这会包含大量不相关内容(如页眉、页脚和导航元素)。这会增加不必要的噪声,并可能为幻觉打开大门。

相反,你应该只使用 #main 元素内的内容。这可保证你只向 LLM 发送页面中最相关的部分,从而降低结果不准确的风险。因此,即使你选择不将 HTML 转换为 Markdown,将输入限定在关键 HTML 元素中也是使用 LLM 时的最佳实践。

若只考虑 #main 元素,你需要一个 Python HTML 解析库,如 Beautiful Soup。在已激活的 Python 虚拟环境中,使用此命令安装它:

pip install beautifulsoup4

如果你不熟悉它的 API,请查看我们关于 Beautiful Soup 网页抓取的教程。

然后,在 scraper.py 中导入它:

from bs4 import BeautifulSoup

使用 Beautiful Soup 来:

  1. 解析通过 Requests 获取的原始 HTML。
  2. 选择 #main 元素。
  3. 获取其 HTML 内容。

使用以下代码片段实现:

# Parse the HTML of the page with Beautiful Soup
soup = BeautifulSoup(response.content, "html.parser")

# Select the #main element and get its outer HTML
main_element = soup.select_one("#main")
main_html = str(main_element)

如果你打印 main_html,你应该会看到:

<main id="main" class="site-main" role="main" data-testid="main-content" data-content="main-area">
    <div class="woocommerce-notices-wrapper" 
         id="notices-wrapper" 
         data-testid="notices-wrapper" 
         data-sorting="notices">
    </div>
    <div id="product-267" 
         class="product type-product post-267 status-publish first outofstock 
                product_cat-hoodies-sweatshirts has-post-thumbnail 
                shipping-taxable purchasable product-type-variable">
        <!-- omitted for brevity... -->
    </div>
</main>

现在,使用官方 OpenAI Tokenizer 工具检查所选 HTML 字符串对应多少个 token:

#main 元素的 HTML 内容对应 21,504 个 token

接下来,使用像 LLM API Pricing Calculator 这样的工具估算将这些 token 发送到 OpenAI 的成本:

使用原始 #main HTML 的 OpenAI API 价格预测

如你所见,这种方法会产生超过 20,000 个 token,约等于每个请求 $0.10。起初这可能看起来不多,但在涉及数千个页面的大规模网页抓取项目中,成本会迅速累积。

为了减少 token 消耗,使用像 markdownify 这样的包将提取的 HTML 转换为 Markdown。在你的 ChatGPT 抓取项目中使用以下命令安装它:

pip install markdownify

不要忘记在 scraper.py 中导入 markdownify

from markdownify import markdownify

然后,使用它通过这行代码将来自 #main 的 HTML 转换为 Markdown:

main_markdown = markdownify(main_html)

你可以使用许多在线可用的 HTML 到 Markdown 转换器中的任意一个来模拟输出。转换过程将产生类似如下的结果:

查看两个文本区域末尾附近的“size”元素。你会注意到,输入的 Markdown 版本比原始 #main HTML 紧凑得多。然而,如果你检查它,你会看到它保留了抓取所需的所有关键数据。

再次使用 OpenAI Tokenizer 查看新的 Markdown 输入消耗多少个 token:

通过这个简单技巧,你将 21,504 个 token 减少到了 956 个 token。这是超过 95% 的 token 减少!

这也转化为每个请求的 OpenAI API 成本大幅降低:

价格从每个请求约 ~$0.10 降到了仅约 ~$0.006!

步骤 #5:使用 ChatGPT 进行数据解析

OpenAI SDK 提供了一个名为 parse() 的结构化数据提取专用方法。该方法接受:

  1. 用于解析的模型(例如 "gpt-4o")。
  2. 输出格式,定义为 Pydantic 模型
  3. 一个标准 completions 输入(你的系统消息和用户消息)。

parse() 方法将返回指定 Pydantic 类的实例,或者如果模型未能生成有效响应,则返回 None

首先定义一个 Product 类,表示你想要提取的产品数据结构:

class Product(BaseModel):
    sku: Optional[str] = None
    name: Optional[str] = None
    images: Optional[List[str]] = None
    price: Optional[str] = None
    description: Optional[str] = None
    sizes: Optional[List[str]] = None
    colors: Optional[List[str]] = None
    category: Optional[str] = None

这个 Pydantic 类映射了页面上找到的预期产品结构。所有字段都标记为可选,这一点很重要,因为:

  • 并非所有产品页面都可能具有所有数据字段。
  • 如果页面上缺少必需字段,模型不会被迫用可能产生幻觉的数据来填充它,只为完成该结构。

不要忘记在 scrape.py 中添加这两个导入:

from pydantic import BaseModel
from typing import List, Optional

然后,用以下内容定义你的抓取任务:

input = [
    {
        "role": "system",
        "content": (
            "You are a scraping agent that extracts structured product data in the specified format."
        ),
    },
    {
        "role": "user",
        "content": (
            f"""
            Extract product data from the given content.

            CONTENT:\n
            {main_markdown}
            """
        ),
    },
]

上述提示词指示 ChatGPT 使用你在 Product 类中定义的格式,从 main_markdown 内容中提取结构化数据。

提示:在将提示词集成到代码之前,在 ChatGPT 中测试并优化它,以确保它返回你期望的结构。

现在使用你配置的参数调用 parse() 方法:

response = client.responses.parse(
    model="gpt-4o",
    input=input,
    text_format=Product,
)

你现在可以使用以下方式访问生成的解析对象:

product = response.output_parsed

product 将是 Product 类的实例(或者如果数据解析过程失败,则为 None)。

太棒了!你刚刚依靠 GPT 模型从网页中提取了结构化产品数据。

步骤 #6:导出抓取的数据

此时,抓取的数据存储在一个 Python 对象中,该对象是 Product 类的实例。请注意,如果解析失败,该对象也可能是 None

要将该对象导出到 JSON 文件,请使用以下代码:

if product is not None:
    with open("product.json", "w", encoding="utf-8") as json_file:
        json.dump(product.model_dump(), json_file, indent=4)
else:
    print("Extracted product was None!")

这将创建一个 product.json 文件,其中包含结构化 JSON 格式的爬虫数据。

从 Python 标准库导入 json

import json

做得好!你的 ChatGPT 驱动网页爬虫工具现在已完成。

步骤 #7:整合全部内容

下面是 scraper.py 的完整代码,这是一个使用 ChatGPT 进行网页爬虫的脚本:

from openai import OpenAI
import requests
from bs4 import BeautifulSoup
from markdownify import markdownify
from pydantic import BaseModel
from typing import List, Optional
import json

# The Pydantic class representing the structure of the object to scrape
class Product(BaseModel):
    sku: Optional[str] = None
    name: Optional[str] = None
    images: Optional[List[str]] = None
    price: Optional[str] = None
    description: Optional[str] = None
    sizes: Optional[List[str]] = None
    colors: Optional[List[str]] = None
    category: Optional[str] = None

# Your OpenAI API key
OPENAI_API_KEY = "<YOUR_OPENAI_API_KEY>"

# Initialize the OpenAI SDK client
client = OpenAI(api_key=OPENAI_API_KEY) # In production, read the OpenAI key from the envs

# Retrieve the HTML content of the target page
url = "https://www.scrapingcourse.com/ecommerce/product/mach-street-sweatshirt/"
response = requests.get(url)

# Parse the HTML of the page with Beautiful Soup
soup = BeautifulSoup(response.content, "html.parser")

# Select the #main element, get its HTML, and convert it to Markdown
main_element = soup.select_one("#main")
main_html = str(main_element)
main_markdown = markdownify(main_html)

# Define the input for the scraping task
input = [
    {
        "role": "system",
        "content": (
            "You are a scraping agent that extracts structured product data in the specified format."
        ),
    },
    {
        "role": "user",
        "content": (
            f"""
            Extract product data from the given content.

            CONTENT:\n
            {main_markdown}
            """
        ),
    },
]

# Perform the scraping parsing request with OpenAI
response = client.responses.parse(
    model="gpt-4o",
    input=input,
    text_format=Product,
)

# Get the parsed product data
product = response.output_parsed

# If OpenAI returned the desired content
if product is not None:
    # Export the scraped data to JSON
    with open("product.json", "w", encoding="utf-8") as json_file:
        json.dump(product.model_dump(), json_file, indent=4)
else:
    print("Extracted product was None!")

使用以下命令执行该脚本:

python scraper.py

该爬虫会运行一段时间,然后在你的项目文件夹中生成一个 product.json 文件。打开它,你应该会看到:

{
    "sku": "MH10",
    "name": "Mach Street Sweatshirt",
    "images": [
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh10-blue_main.jpg",
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh10-blue_alt1.jpg",
        "https://www.scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh10-blue_back.jpg"
    ],
    "price": "$62.00",
    "description": "From hard streets to asphalt track, the Mach Street Sweatshirt holds up to wear and wind and rain. An infusion of performance and stylish comfort, with moisture-wicking LumaTech\u2122 fabric, it\u2019s bound to become an everyday part of your active lifestyle.\n\n\u2022 Navy heather crewneck sweatshirt.  \n\u2022 LumaTech\u2122 moisture-wicking fabric.  \n\u2022 Antimicrobial, odor-resistant.  \n\u2022 Zip hand pockets.  \n\u2022 Chafe-resistant flatlock seams.  \n\u2022 Rib-knit cuffs and hem.",
    "sizes": [
        "XS",
        "S",
        "M",
        "L",
        "XL"
    ],
    "colors": [
        "Black",
        "Blue",
        "Red"
    ],
    "category": "Hoodies & Sweatshirts"
}

Et voilà!ChatGPT 爬虫工具将 HTML 页面中的非结构化数据转换成了整齐组织的 JSON 文件。

后续步骤

要改进你的 ChatGPT 爬虫工具,请考虑以下增强:

  • 使其可复用:重构脚本,使其接受目标 URL 和模型名称作为命令行参数。这会为你的抓取逻辑增加灵活性。
  • 保护你的 API 密钥:不要在脚本中硬编码你的 OpenAI API 密钥,而是将其存储在 .env 文件中,并使用 python-dotenv 安全地加载它。或者,将其设置为名为 OPENAI_API_KEY 的全局环境变量。这两种方法都通过将敏感凭据保留在代码库之外来提高安全性。

有关在其他 AI 爬虫工具中集成 OpenAI 模型,请参阅以下指南:

克服这种 AI 驱动抓取方法的最大限制

主要瓶颈是 requests 发出的 HTTP 请求。上述示例之所以有效,是因为目标网站欢迎网页爬虫(请记住,目标网站的名称是“Ecommerce Test Site to Learn Web Scraping”)。在现实世界中,情况有所不同。大多数网站会使用反爬虫措施来保护其内容,这些措施可能会阻止你的自动化请求。

当这种情况发生时,你的脚本将失败,并出现 403 Forbidden 错误(或类似错误),如下所示:

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: <YOUR_TARGET_URL>

此外,这里介绍的爬虫方法不适用于严重依赖 JavaScript 的网站。如果你正在针对动态网站requests 不够,你需要像 Playwright 或 Selenium 这样的浏览器自动化解决方案。因此,即使没有强大的反机器人保护,许多网站也可能会破坏你的 ChatGPT 爬虫工具。

克服这些问题的最佳方式是使用专用的网络解锁 API

Bright Data 的网络解锁器 API 是一个强大的抓取端点,你可以从任何 HTTP 客户端调用它。它会返回任何 URL 的完全解锁 HTML,这意味着它会自动为你绕过反抓取封锁。

这是可能的,因为它由以下内容支持:

要开始使用,请遵循官方网络解锁器文档并检索你的 API 密钥。然后,将“步骤 #4”和“步骤 #5”中的代码替换为以下几行:

WEB_UNLOCKER_API_KEY = "<YOUR_WEB_UNLOCKER_API_KEY>"

# Set up authentication headers for Web Unlocker
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {WEB_UNLOCKER_API_KEY}"
}

# Define the request payload
payload = {
    "zone": "unblocker",
    "url": "https://www.scrapingcourse.com/ecommerce/product/ajax-full-zip-sweatshirt/",  # Replace with your target URL
    "format": "raw",
    "data_format": "markdown" # To get a response in Markdown"
}

# Fetch the unlocked HTML of the target page
response = requests.post("https://api.brightdata.com/request", json=payload, headers=headers)

就这样,不再有封锁,不再有限制。你现在拥有了一个由 ChatGPT 和网络解锁器驱动的完全功能性 AI 网页抓取工具。

更复杂的抓取场景中查看 OpenAI SDK 和网络解锁器如何协同工作。

结论

在本教程中,你学习了如何将 ChatGPT(GPT 模型)与 Requests 和其他工具结合起来,构建一个 AI 驱动的网页爬虫工具。最大的挑战之一——被封锁——通过使用 Bright Data 的网络解锁器 API得到了解决。

如前所述,将 ChatGPT 与网络解锁器 API 集成,可让你从任何网站提取可直接用于提示词的数据。所有这些都无需编写自定义解析代码。这只是 Bright Data 的 AI 产品和服务所涵盖的众多场景之一。

立即免费注册 Bright Data,并试用我们的爬虫解决方案!

使用 ChatGPT 进行网页爬虫常见问题

ChatGPT 能爬虫网站吗?

可以。ChatGPT 可以使用其内置 Web Search 进行小规模提取,或生成 Python 爬虫代码以实现可扩展、生产就绪的爬虫。大多数现实世界的网站都需要处理反机器人保护(已在上面的网络解锁器部分介绍)。

哪个 AI 模型最适合网页爬虫?

GPT-4o 目前是网页爬虫任务中速度、准确性和成本之间的最佳平衡。它能可靠地处理结构化数据提取,并通过 OpenAI API 支持基于 Pydantic 的输出格式化。

使用 ChatGPT 爬虫时如何避免被封锁?

ChatGPT 生成的爬虫代码本身不会让你被封锁,你的 HTTP 请求会。使用动态代理,设置真实的请求头,并考虑使用像 Bright Data 的网络解锁器 API 这样的专用解决方案,以自动绕过验证码和反机器人措施。

ChatGPT 能爬虫 JavaScript 渲染的网站吗?

仅靠 requests 不行。对于大量使用 JavaScript 的网站,你需要像 Playwright 或 Selenium 这样的无头浏览器,或一个能够为你处理 JS 渲染的基于浏览器的爬虫 API。

支持支付宝等多种支付方式

Antonello Zanini

技术写作

5.5 years experience

Antonello是一名软件工程师,但他更喜欢称自己为技术传教士。通过写作传播知识是他的使命。

Expertise
Web 开发 网页抓取 AI 集成