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


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

# 如何大规模抓取 ChatGPT 广告：技术架构

OpenAI 于 2026 年 2 月 9 日开始针对使用 Free 和 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/)）。
> - 对于每次广告展示，需捕获广告标题、广告描述和最终 URL，然后将展示次数除以总运行次数来计算展示份额（[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. **捕获赞助广告位。** 从渲染后的输出中，提取每个赞助广告位的广告标题、广告描述和最终 URL ([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)。
