# 如何大规模抓取 ChatGPT 广告：技术架构


<!--
  结构化数据：渲染器（scripts/blog_render.py）会将来自上方前置信息的
  BlogPosting + Open Graph + Twitter 标签注入到 <head> 中。
  匹配的 FAQPage JSON-LD 位于此文件夹中的 faq-schema.jsonld 文件内；请在发布时将其
  合并到页面中（最好作为单个组合的 @graph）。
-->

# 如何大规模抓取 ChatGPT 广告：技术架构

OpenAI 于 2026 年 2 月 9 日开始针对使用免费版和 Go 版、已登录的美国成年用户在 ChatGPT 内测试广告（[OpenAI，“在 ChatGPT 中测试广告”](https://openai.com/index/testing-ads-in-chatgpt/))。由于没有可供查询的公开目录，且匹配操作是在每个私有对话线程中进行的，因此掌握如何抓取 ChatGPT 广告并非解析问题，而是一个采样问题：将设计好的提示词集应用于符合条件且地理位置准确的会话中，捕获每个赞助信息框，并重复此过程直至数据量趋于稳定。

> **关键要点**
> - 广告仅面向“免费”和“Go”套餐中已登录的美国成年用户展示；“Pro”、“Business”和“Enterprise”套餐仍无广告，因此数据采集会话必须位于符合条件的套餐级别（[TechCrunch，《ChatGPT推出广告》 2026-02-09](https://techcrunch.com/2026/02/09/chatgpt-rolls-out-ads/))。
> - 目前没有广告透明度中心，且匹配是按私密对话进行的，因此观察广告的唯一方法是运行多种多样的提示词并记录结果（[Search Engine Journal，2026](https://www.searchenginejournal.com/see-competitor-ads-chatgpt-trendos-spa/575883/)）。
> - 对于每次广告展示，需记录广告标题、广告描述和最终网址，然后将展示次数除以总运行次数来计算展示份额 ([Search Engine Land, 2026](https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301))。
> - 广告按国家/地区分批投放，因此需从当地源服务器针对各市场进行精准的数据采集 ([Euronews, 2026](https://www.euronews.com/next/2026/02/10/chatgpt-will-now-show-you-adverts-heres-everything-you-need-to-know))。
> - 数据中心 IP 容易被封禁；来自真实 ISP 的住宅 IP 则看起来像普通用户流量（[DataImpulse，《2026 年 AI 爬虫最佳代理》](https://dataimpulse.com/blog/best-proxies-for-ai-scraping/)）。

本文是关于[如何监控 ChatGPT 广告](https://www.joinmassive.com/blog/how-to-monitor-chatgpt-ads)的策略指南的工程实践指南。我们将分阶段详细介绍实际的数据处理流程。

[图片：工程师的屏幕显示了一个包含提示词队列、地理区域和赞助广告表的数据管道，界面采用深色配以橙色点缀——搜索词：数据管道 工程师 屏幕 深色]

## 是什么让 ChatGPT 广告难以抓取？

ChatGPT广告难以抓取，是因为其展示界面同时具备封闭性、情境相关性和地域性。广告会出现在回复下方的标有“赞助”字样的框中，其展示依据是对话主题、聊天记录以及之前的广告互动，而非精确的关键词（[StackAdapt，《如何在ChatGPT上投放广告》](https://www.stackadapt.com/resources/blog/how-to-advertise-on-chatgpt))。两个完全相同的提示可能返回不同的广告主，因此单次观察几乎无法提供任何有价值的信息。

有三项限制条件影响着每一项设计决策。首先，广告仅向使用“免费版”或“Go版”且已登录的美国成年用户展示，因此您的会话必须符合资格。其次，广告匹配是按私密对话线程进行的，没有可供查询的目录（[Search Engine Journal, 2026](https://www.searchenginejournal.com/see-competitor-ads-chatgpt-trendos-spa/575883/)）。 第三，广告推广按国家分阶段进行，首先在美国推出，随后是英国、日本、韩国、加拿大、澳大利亚和新西兰，计划中还包括墨西哥和巴西（[Euronews, 2026](https://www.euronews.com/next/2026/02/10/chatgpt-will-now-show-you-adverts-heres-everything-you-need-to-know)）。

> 引用摘要：截至 2026 年 2 月 9 日的测试，ChatGPT 广告仅面向“免费”和“Go”套餐中已登录的美国成年用户展示，以标有“赞助”字样的框形式出现，根据每个私有对话的上下文进行匹配，且没有公开目录，因此只能通过在符合条件的会话中运行各种提示来观察其展示情况 ([OpenAI，《在ChatGPT中测试广告》](https://openai.com/index/testing-ads-in-chatgpt/)；[Search Engine Journal，2026](https://www.searchenginejournal.com/see-competitor-ads-chatgpt-trendos-spa/575883/))。

<!-- [独特见解] --> 这种封闭式展示方式颠覆了传统的爬虫经济模式。在经典的网页爬取中，解析成本低廉，而访问才是主要成本。 而在这里，解析赞助广告框轻而易举，真正的成本在于统计分析：你需要估算一个隐藏的分布，因此你的架构必须优先考虑样本量和条件稳定性，而非巧妙的筛选器。

## 如何端到端地抓取 ChatGPT 广告？

你需要通过一个八阶段管道来抓取 ChatGPT 广告，该管道能将一组提示语转化为趋势线。这些阶段从设计到交付依次进行：设计提示语、筛选会话、按地理位置分配、渲染、捕获、标准化、计算展示份额，然后进行排程和存储。 每个阶段为下一阶段提供数据，整个循环以固定节奏重复，从而使单次运行的噪声被平均掉，最终形成可测量的信号。

<figure>
  <svg viewBox="0 0 680 260" role="img" aria-label="用于抓取 ChatGPT 广告的八阶段管道，从提示集设计到计划存储" xmlns="http://www.w3.org/2000/svg">
    <rect x="0" y="0" width="680" height="260" fill="#0a0a0f"/>
    <text x="24" y="34" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="18" font-weight="600">ChatGPT 广告抓取管道</text>
    <text x="24" y="54" fill="#8e8b89" font-family="Outfit, sans-serif" font-size="12">经过设计的提示词集将转化为展示份额趋势线。</text>

    <!-- 第 1 行 -->
    <rect x="24" y="78" width="142" height="40" rx="6" fill="#121117" stroke="#d74939"/>
    <text x="95" y="103" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">1. 提示词集</text>
    <rect x="190" y="78" width="142" height="40" rx="6" fill="#121117" stroke="#1d1d21"/>
    <text x="261" y="103" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">2. 符合条件的会话</text>
    <rect x="356" y="78" width="142" height="40" rx="6" fill="#121117" stroke="#1d1d21"/>
    <text x="427" y="103" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">3. 各市场的地理分布</text>
    <rect x="522" y="78" width="134" height="40" rx="6" fill="#121117" stroke="#ff8163"/>
    <text x="589" y="103" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">4. 渲染</text>

    <!-- 箭头第1行 -->
    <text x="178" y="103" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>
    <text x="344" y="103" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>
    <text x="510" y="103" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>

    <!-- 第2行 -->
    <rect x="24" y="158" width="142" height="40" rx="6" fill="#121117" stroke="#1d1d21"/>
    <text x="95" y="183" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">5. 捕获框</text>
    <rect x="190" y="158" width="142" height="40" rx="6" fill="#121117" stroke="#1d1d21"/>
    <text x="261" y="183" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">6. 归一化</text>
    <rect x="356" y="158" width="142" height="40" rx="6" fill="#121117" stroke="#d74939"/>
    <text x="427" y="183" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">7. 展示份额</text>
    <rect x="522" y="158" width="134" height="40" rx="6" fill="#121117" stroke="#1d1d21"/>
    <text x="589" y="183" fill="#faf4ec" font-family="Outfit, sans-serif" font-size="12" text-anchor="middle">8. 排程 + 存储</text>

    <text x="178" y="183" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>
    <text x="344" y="183" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>
    <text x="510" y="183" fill="#8e8b89" font-family="'JetBrains Mono', monospace" font-size="14" text-anchor="middle">&#8594;</text>

    <text x="24" y="236" fill="#34d399" font-family="'JetBrains Mono', monospace" font-size="11">以一定节奏循环整个流程；信号存在于重复之中</text>
  </svg>
  <figcaption>ChatGPT广告抓取的参考流程。方法依据<a href="https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301">Search Engine Land文章《ChatGPT广告数据揭示的竞争对手信息》，2026年</a>。</figcaption>
</figure>

各阶段的功能如下：

1. **设计提示词集。** 构建买家旅程提示词（如“适合小型团队的最佳CRM”）和品牌相关提示词（如“[品牌]值得购买吗”）。措辞的不同会触发不同的广告，因此应将提示词集视为一个受控变量。关于提示词的构建方法，请参阅[ChatGPT广告提示词映射](https://www.joinmassive.com/blog/prompt-mapping-chatgpt-ads)中详细介绍了构建方法。
2. **筛选会话。** 每次测试必须由登录 Free 或 Go 版本的美国成年用户进行。Pro、Business 和 Enterprise 版本不显示广告（[TechCrunch, 2026](https://techcrunch.com/2026/02/09/chatgpt-rolls-out-ads/)）。需变化会话历史记录，以避免单个偏颇的对话线程影响样本。
3. **按地理位置分布。** 由于广告投放是按国家/地区进行的，因此数据采集需从各市场的本地源地址进行。若仅关注美国视角，随着测试范围扩大，将遗漏英国、日本或加拿大的广告主。
4. **渲染对话内容。** 提交提示词并捕获完全渲染后的响应，包括任何赞助内容块。 此阶段需要真实用户的源地址，相关内容将在下文介绍。
5. **捕获赞助广告位。** 从渲染后的输出中，提取每个赞助广告位的广告标题、广告描述和最终网址（[Search Engine Land，2026](https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301)）。
6. **解析并规范化。** 将原始字段映射到稳定的模式中。规范化广告商名称和最终网址，以确保同一广告商不会分散在不同行中。
7. **计算展示份额。** 按提示和市场汇总展示次数与总运行次数。计算方法稍后详述。
8. **定时执行并存储。**以固定频率运行该数据集，并将带时间戳的行写入数据库，使展示份额成为趋势而非静态快照。

## 如何将提示作为符合条件的、地理位置准确的会话运行？

您需通过目标市场中的真实用户源发布提示，并将渲染后的对话内容捕获下来，从而将提示作为符合条件的会话运行。这一阶段将决定您是能够大规模收集 AI 广告数据，还是在早期就被屏蔽。 大多数平台会迅速将数据中心 IP 标记为可疑，而来自真实消费者 ISP 的住宅 IP 则看起来像普通流量；此外，AI 界面会根据地区和语言进行渲染，因此需要跨市场的本地 IP 才能确保准确性 ([DataImpulse，《2026年AI抓取的最佳代理》](https://dataimpulse.com/blog/best-proxies-for-ai-scraping/))。选择何种网络本身就是一项决策，相关对比可参见[AI广告中住宅代理与数据中心代理的对比](https://www.joinmassive.com/blog/residential-vs-datacenter-proxies-ai-ads)。

这正是 Massive 能直接融入数据处理流程之处。Massive 是一个设备访问网络加渲染堆栈的组合，可从任何公开来源返回干净的 HTML 或 Markdown 内容， 且覆盖全球任意位置，运行于195多个国家的真实消费者设备上。其Web Render API `/ai` 端点可通过您选择的地理区域内真实用户设备的源地址，以完整对话HTML、提示词HTML、生成结果HTML、来源HTML以及子查询数组的形式返回ChatGPT的生成内容。 同步模式直接返回生成内容；异步 `/ai/completions` 路径采用队列和检索机制，支持按国家、行政区或城市进行地理定位。

Massive 提供技术能力；您的团队负责设计提示词集并运行操作。 对于周边管道，Browsing 端点 (`/browser`) 提供一流的 Markdown 输出，并支持最长 12 分钟的持久会话。每个 IP 地址均通过 Massive SDK 进行授权，该平台已通过 SOC 2 审计、符合 GDPR 规范并获得 AppEsteem 认证，且具备完整的审计追踪记录。

控制循环非常简洁。复杂的部分（符合条件的源站、地理位置、渲染）都位于渲染调用之后，因此您的代码可以专注于采样和聚合：

```python
# Illustrative sampling loop. The render_chatgpt() call abstracts an
# eligible, geo-targeted session; see your render provider's docs for
# exact endpoint parameters before wiring it up.
from collections import Counter

def sample_prompt(prompt, market, runs=25):
    appearances = Counter()
    for _ in range(runs):
        convo = render_chatgpt(prompt=prompt, geo=market)   # rendered HTML
        for box in find_sponsored_boxes(convo):             # may be zero
            ad = {
                "advertiser": normalize(box.title),
                "description": box.description,
                "final_url":  canonical(box.final_url),
                "prompt":     prompt,
                "market":     market,
            }
            store(ad)                                       # stage 8
            appearances[ad["advertiser"]] += 1
    # stage 7: impression share = appearances / total runs
    return {a: round(n / runs, 3) for a, n in appearances.items()}
```

该循环设计得刻意简洁。生产环境构建中会添加重试机制、可容忍布局变化的赞助位检测、剔除空渲染的验证，以及按市场进行的调度。

## 如何计算多次运行中的展示份额？

您通过将广告商的展示次数除以给定提示词和市场下的总运行次数来计算展示份额。如果广告商在 25 次运行中有 12 次展示，则该提示词和时间窗口的展示份额为 48% ([Search Engine Land, 2026](https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301))。正是这一单一比率，将充满噪声的、按线程划分的表面数据转化为可追踪和比较的数值。

样本量至关重要。仅进行少数几次运行会产生波动较大的估计值，而每个提示词进行数十次运行则能得出较为稳定的结果。 请保持数据采集条件固定——包括同一市场、同一层级以及相同的提示词表述——这样数值的变动才能反映广告竞价情况，而非您的设置因素。同时追踪最终 URL 和展示份额，还能揭示竞争对手在每次对话中推广的具体着陆页。

> 引用摘要： ChatGPT 广告的展示份额等于广告主出现的运行次数除以该提示词和市场下的总运行次数； 在 25 次展示中出现 12 次，即该提示词和时间窗口内的展示份额为 48% ([Search Engine Land，《ChatGPT 广告数据揭示的竞争对手信息》，2026](https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301))。

## 应以何种频率收集数据，数据又该存放在何处？

应按固定频率收集数据，并将每条观测结果作为带时间戳的行存储，因为数据价值在于趋势，而非单次快照。针对每个市场，每周或每天对同一提示词集进行一次运行，可建立起后续无法补全的历史数据。 请将收集计划本身视为方法的一部分：中途更改收集频率会导致两个时间窗口难以比较。

一旦数据结构稳定，存储就变得很简单。一张宽表即可满足需求：提示词、市场、运行时间戳、广告主、广告标题、广告描述、最终网址。 展示份额即是对该表按提示词、市场和时间窗口分组后的查询结果。由于您控制着数据采集条件，下个月重新运行相同的查询将产生可比的数据，这正是按计划抓取赞助 AI 结果的全部意义所在。

## 关于范围和平台术语的说明

仅收集公开的广告展示区域，并严格遵守该范围。任何符合条件的用户所看到的赞助广告框均属于公开信息，这是值得尊重的边界。请勿收集个人数据，请勿试图绕过正常登录会话之外的身份验证， 并以合理的频率进行采集，而非对服务造成过载。遵守各平台明文规定的条款，确保提示词集专为特定目的设计；若您从事商业运营或大规模采集，请针对具体用途寻求法律审查。相关法律因司法管辖区而异且不断变化。

## 常见问题

### 如果没有公开目录，如何抓取 ChatGPT 广告？

采用采样而非搜索的方式。 由于匹配是按私有线程进行的且没有透明度中心，您应在符合条件的美国会话中反复运行专门设计的提示词集，并记录每个赞助框（[Search Engine Journal, 2026](https://www.searchenginejournal.com/see-competitor-ads-chatgpt-trendos-spa/575883/)）。通过数据量和重复操作，可以将隐藏的、按线程划分的展示面转化为可衡量的展示份额数据，从而实现随时间推移的追踪。

### 为什么需要住宅IP来收集ChatGPT广告数据？

数据中心 IP 容易被封禁，而来自真实消费者 ISP 的住宅 IP 则看起来像普通用户流量（[DataImpulse，《2026 年 AI 爬虫最佳代理》](https://dataimpulse.com/blog/best-proxies-for-ai-scraping/)）。 AI 广告展示还根据地区和语言进行渲染，且按国家分阶段推出，因此要实现精准的地理位置数据采集，您需要在每个目标市场使用当地 IP。

### 哪些 ChatGPT 套餐实际上会显示广告？

截至 2026 年 2 月 9 日的测试结果显示，仅“免费”和“Go”套餐会显示广告，且仅面向已登录的美国成年用户（[OpenAI，《在 ChatGPT 中测试广告》](https://openai.com/index/testing-ads-in-chatgpt/)）。 Pro、Business 和 Enterprise 套餐仍保持无广告状态 ([TechCrunch, 2026](https://techcrunch.com/2026/02/09/chatgpt-rolls-out-ads/))。若数据采集会话所属套餐不符合条件，则完全不会返回任何赞助内容框。

### 每条广告应采集哪些字段？

请采集每个赞助广告位的广告标题、广告描述和最终网址，以及提示词、市场和投放时间戳（[Search Engine Land, 2026](https://searchengineland.com/what-chatgpt-ads-data-reveals-about-your-competitors-479301)）。 这些字段可帮助您规范化广告主信息、追踪着陆页，并计算每个提示词和市场下的展示份额（即展示次数除以总投放次数）。

### 允许抓取 ChatGPT 广告吗？

仅收集任何符合条件的用户都能看到的公开赞助广告位，避免涉及个人数据，并遵守各平台明文规定的条款及合理的采集频率。公开广告区域是采集的边界。将数据抓取视为对公开广告位的观察，而非全面收集；若用于商业或大规模用途，请进行法律审查，因为不同司法管辖区的规则各不相同。

## 这对您意味着什么

抓取 ChatGPT 广告是一项需要严格采样的练习，而非选择器工程。八阶段管道保持了条件的一致性——包括设计好的提示词集、符合条件的会话、正确的地理位置以及真实用户的渲染效果——因此您计算出的展示份额数据在数周内具有可比性。 只需构建一次循环，按固定节奏运行，并存储每一行数据。

决定一切的关键在于采集层：符合条件、地理位置准确且表现得像真实用户的会话。这正是 Massive 的 `/ai` 端点及覆盖 195 多个国家的能力，它能通过您所选市场中真实用户设备的源地址，返回 ChatGPT 的自动补全内容。立即开始采样，尊重公开广告展示面，您将掌握事后无法重现的趋势数据。 关于战略框架，请参阅 [如何监控 ChatGPT 广告](https://www.joinmassive.com/blog/how-to-monitor-chatgpt-ads)。
