@freeCodeCamp:程序化广告让软件自动买卖广告位,常常在毫秒内完成。在本文中,@ma…

X AI KOLs Timeline 新闻

摘要

一篇教程,解释程序化广告以及如何使用Python建模物理广告,涵盖实体解析、受众数据、可用性和动态定价。

程序化广告让软件自动买卖广告位,常常在毫秒内完成。 在本文中,@manishmshiva 将教你它的工作原理,以及将相同模型应用到物理广告时会发生什么。 你将使用Python探索实体解析、受众数据、可用性和动态定价。 https://freecodecamp.org/news/how-programmatic-advertising-works/…
查看原文
查看缓存全文

缓存时间: 2026/07/27 07:45

程序化广告让软件能够自动买卖广告空间,通常在毫秒内完成。在本文中,@manishmshiva 将教你它是如何运作的,以及当把同样的模式应用到实体广告时会发生什么。你将使用 Python 来探索实体解析、受众数据、可用性和动态定价。https://freecodecamp.org/news/how-programmatic-advertising-works/…


程序化广告是如何运作的

来源:https://www.freecodecamp.org/news/how-programmatic-advertising-works/

大多数关于程序化广告的教程都停留在网页横幅广告上。这很可惜,因为这个概念一旦跳出屏幕,进入物理世界,会变得有趣得多。如果你从未涉足广告行业,别担心。你不需要任何广告行业背景也能理解。如果你能读懂基础的 Python,你就拥有了一切所需。广告部分只是背景设定,真正的主题是一项你会在任何地方都用到的技能:将现实中杂乱无章的一角,转化为软件可操作的数据。

在本文中,你将了解什么是程序化广告,以及它为什么在网络上如此成功。你会明白,将其应用到广告牌上实际上是一个数据建模问题,并且你将针对每一步构建简单的 Python 模型。

我们将涵盖:

广告有两个方面。发布商(例如新闻网站)有广告空间需要填充。广告商(例如鞋类品牌)想要填充它。几十年来,连接这两者意味着打电话、发邮件和填表格。程序化广告用软件取代了这些人工流程。没有人类去协商广告位。系统会查看一个广告位,并在毫秒内决定是否购买以及以什么价格购买。

以下是当你打开一个网页时它如何运作。网页会告知广告交易平台有一个广告位空缺,同时附带一些关于页面和浏览者上下文的上下文。广告商的系统会在实时拍卖中对这个广告位进行竞价。中标的广告会在页面加载完成前出现。这个过程被称为实时竞价,每天发生数十亿次。

两个简单的术语会有帮助。库存指的是卖家可提供的广告空间。展示指的是一个人看到一次广告。在网络上,这种模式来得很快,而且几乎感觉毫不费力。理解其中原因很有价值。

为什么网络让程序化变得容易

网络是偶然让程序化变得容易的。每个网络广告位都是预先结构化的。它有一个地址,即一个 URL 和页面上的位置。它位于一个具有已知形状的文档(即文档对象模型)内部。并且它可以报告广告是否已加载且被看到。整个环境从诞生起就是机器可读的,因为机器已经在提供服务了。当自动化购买出现时,它就有了一个干净的界面可以操作。这个媒介已经完成了艰苦的建模工作。请记住这一点,这是整个课程的关键。

广告牌问题

现在将同样的想法应用到广告牌上。那种便捷的结构荡然无存。一块物理标志不会自己宣布它在哪里或朝哪个方向。它不会说明本周的费用是多少,甚至不会说自己是否可用。在其大部分历史中,这些信息都存在于价格表和销售人员的记忆中,而不是存在于程序可以查询的任何东西里。

关键点在于:户外广告(行业术语,指广告牌、公交广告和公共屏幕)之所以落后于网络,并不是因为它是一种较弱的媒介,而是因为它没有机器可读的接口。受众一直都在,但结构化的数据却没有。

因此,将程序化广告带入物理世界的真正工作,并非巧妙的竞价逻辑,而是数据建模。让我们具体来看。有四个步骤,每一步都对应到你在许多其他工程问题中会看到的模式。

步骤 1:解析实体

同一块广告牌经常出现在多个供应商的数据集中。每个供应商给它不同的名称和略有不同的坐标。在你做任何其他事情之前,一个物理对象必须变成一条记录。这被称为记录链接,在这里加入了地理因素。一个简单的方法是:如果两条记录位置接近且名称相似,就将它们视为同一块广告牌。要测量两个坐标之间的距离,你可以使用哈弗辛公式

`` from math import radians, sin, cos, asin, sqrt

def haversine_m(lat1, lon1, lat2, lon2): “”“两点之间以米为单位的距离。”“” lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) a = sin((lat2 - lat1) / 2) ** 2 +
cos(lat1) * cos(lat2) * sin((lon2 - lon1) / 2) ** 2 return 6371000 * 2 * asin(sqrt(a))

def same_panel(a, b, max_distance_m=25): close = haversine_m(a[“lat”], a[“lon”], b[“lat”], b[“lon”]) <= max_distance_m similar_name = a[“name”].lower().split()[0] == b[“name”].lower().split()[0] return close and similar_name

vendor_a = {“name”: “I-95 North Bulletin”, “lat”: 25.7907, “lon”: -80.1300} vendor_b = {“name”: “I-95 Bulletin #4421”, “lat”: 25.7908, “lon”: -80.1301} print(same_panel(vendor_a, vendor_b)) # True – 同一个广告牌,同一条记录 ``

真实系统会使用更模糊的匹配和更多信号,但原理是一样的。实体解析必须优先进行,否则后面的每一步都会重复计算同一块广告牌。

步骤 2:将位置建模为计算出的上下文

一个坐标并非受众。要让一块广告牌对购买系统有用,你必须将其表示为一个带有朝向的点。然后通过将其与道路和交通数据关联,来估算实际经过它的人。有用的值是计算出来的,而不是给定的:

`` def estimate_impressions(panel, traffic_by_road): “”“根据道路交通数据估算每日展示量。”“” daily_vehicles = traffic_by_road[panel[“road_id”]] # 只有朝向广告牌面的交通才能看到它 facing_share = 0.5 avg_occupancy = 1.4 # 每辆车的人数 return int(daily_vehicles * facing_share * avg_occupancy)

panel = {“id”: “P-4421”, “road_id”: “I-95-N”, “facing”: “south”} traffic = {“I-95-N”: 120000} print(estimate_impressions(panel, traffic)) # 84000 ``

注意发生了什么。原始记录只是地图上的一个点。它被丰富成了买家可以分析的东西:84,000 次估计的每日展示。这种模式在数据工作中随处可见。原始记录加上外部数据等于有用的字段。

步骤 3:将可用性表示为日程表,而非布尔值

一个网络广告位要么现在开放,要么不是。在代码中,这是一个布尔值:一个简单地为 true 或 false 的值。广告牌是按日期范围预订的,其状态在你不知情的情况下变化。库存被保留、预订和释放。你需要实时数据,而不是静态快照。

`` from datetime import date

class PanelSchedule: def init(self): self.bookings = [] # (start, end) 元组列表

def book(self, start, end):
    if not self.is_available(start, end):
        raise ValueError("该日期范围广告牌不可用")
    self.bookings.append((start, end))

def is_available(self, start, end):
    return all(end < b_start or start > b_end for b_start, b_end in self.bookings)

schedule = PanelSchedule() schedule.book(date(2026, 8, 1), date(2026, 8, 14)) print(schedule.is_available(date(2026, 8, 10), date(2026, 8, 20))) # False print(schedule.is_available(date(2026, 8, 15), date(2026, 8, 31))) # True ``

这个教训同样适用。每当你对现实世界进行建模时,都要问一问某个值是否真的是固定的。通常它是随时间变化的状态。可用性、库存水平和座位图都是伪装成布尔值的日程表。

步骤 4:将价格表示为函数,而非数字

价目表上是一个数字。但实际上价格取决于日期、需求以及剩余库存量:

`` def price_for(base_rate, start, weeks_out, occupancy): “”“根据提前时间和需求为预订定价。”“” demand_multiplier = 1 + occupancy # 市场越繁忙,价格越高 urgency_discount = 0.9 if weeks_out > 8 else 1.0 # 提前预订有奖励 return round(base_rate * demand_multiplier * urgency_discount, 2)

print(price_for(base_rate=3000, start=date(2026, 12, 1), weeks_out=19, occupancy=0.85)) # 4995.0 print(price_for(base_rate=3000, start=date(2026, 8, 1), weeks_out=2, occupancy=0.40)) # 4200.0 ``

一旦价格成为一个函数,软件就能瞬间比较数千块广告牌和日期。这正是自动化购买所需要的。

整合在一起

你现在有了已解析的实体、计算出的受众、实时可用性和动态定价。有了这些,程序化数字户外广告在物理世界中的运作方式就和在线上一模一样了。软件可以跨物理屏幕规划广告活动,自动购买它们,近乎实时地调整,并衡量结果。这从来都不是关于网络本身,而是关于库存是否有一个模式,即一个定义好的结构,告诉软件每段数据是什么。一旦你给物理世界赋予了一个模式,自动化就随之而来。

一个培养直觉的练习

你不需要特殊的权限来练习这个。随便找一个杂乱的、基于位置的数据集,重演这四个步骤。一个很好的来源是OpenStreetMap,它提供数百万个现实世界地点的免费数据。

首先,通过合并描述同一现实世界对象的重复记录来解析重复项。其次,用计算出的上下文丰富每个点,而不是把原始记录当作完整的。第三,将一个字段建模为随时间变化的状态,而不是一个固定值。第四,将结果包装成一个干净的接口(例如一个类或一个小型 API),以便其他东西可以查询。

你并不会构建一个广告平台,但你会练习到让自动化购买拓展至新领域所需的确切技能。

要点

一个好的抽象能够经受住现实世界的考验。当你在一个整洁的环境中初次学习某个概念时,很容易认为整洁性本身就是概念的一部分。但事实很少如此。只有当你把它拖到杂乱的地方,并看着它仍然有效时,你才会发现一个想法有多么通用。程序化购买从屏幕转移到路边墙壁上,是这方面一个相当干净的证明。在其他地方也留意一下同样的模式:一个丰富的领域,只差一个模式。

希望你喜欢这篇文章。你可以在LinkedIn上与我联系。



免费学习编程。freeCodeCamp 的开源课程已帮助超过 40,000 人成为开发者。开始学习

相似文章

ChatGPT广告购买新方式

OpenAI Blog

OpenAI扩展ChatGPT广告试点,推出自助式广告管理器测试版、CPC竞价和增强型效果衡量工具,让企业投放广告更加便捷。

致所有 Google Ads 用户

Reddit r/AI_Agents

一位 Google Ads 管理者利用 Claude Code 生成 Python 脚本,实现广告系列创建与管理的自动化,大幅缩短搭建时间并确保变更可追溯。初步数据显示点击率(CTR)达 11.23%,但人工决策依然不可或缺。

OpenAI广告合作伙伴现已基于“提示词相关性”销售ChatGPT广告位

Hacker News Top

# 独家:泄露的演示文稿揭示了StackAdapt的ChatGPT广告投放策略 来源:[https://www.adweek.com/media/exclusive-leaked-deck-reveals-stackadapts-playbook-for-chatgpt-ads/](https://www.adweek.com/media/exclusive-leaked-deck-reveals-stackadapts-playbook-for-chatgpt-ads/) 如果您希望塑造媒体策略——而不仅仅是优化它——请升级您的专业素养。 [The ADWEEK MiniMBA in Marketing](https://www.adweek.com/minimba/?itm_source=articletop&itm_campaign=media4) 助您自信引领全局

在 ChatGPT 中测试广告

OpenAI Blog

OpenAI 正在美国面向免费版和 Go 版用户测试 ChatGPT 广告试点项目,并计划扩展至加拿大、澳大利亚、新西兰及其他地区。该举措旨在为更广泛的 AI 功能普及提供资金支持,同时保持回答的独立性和用户隐私。

我们在ChatGPT中投放广告与扩大访问的策略

OpenAI Blog

OpenAI宣布计划在ChatGPT的免费版和Go版中引入广告,同时将其ChatGPT Go订阅服务以每月8美元的价格扩展至美国及全球。公司概述了其广告投放方法的五项核心原则,强调答案独立性、对话隐私和用户控制,同时保持付费版无广告。