广告验证怎么做:用城市级住宅代理检查投放是否真的落地

广告验证要回答的问题

广告投放的预算花出去之后,品牌方需要确认三件事:

  1. 广告真的展示了吗 —— 在目标地区、目标时段、目标人群里是否可见
  2. 展示的是什么内容 —— 落地页是否指向正确页面,有没有被篡改
  3. 有没有不该出现的情况 —— 竞品截流、仿冒站点、素材被替换

这三个问题都必须从真实用户的视角去检查,而这就是代理在网络取证里的作用。

为什么必须是城市级住宅代理

用机房 IP 做广告验证会得到系统性错误的结果,原因有三层:

第一层,广告平台本身按地域投放。 用美国机房 IP 去查中国大陆的广告,平台不会展示对应的广告——你验证的是一个不存在的场景。

第二层,IP 类型会被识别。 广告平台和监测平台都有 IP 信誉库,识别出机房 IP 后可能返回占位广告或直接不返回。你看到的”没有广告”,可能只是因为你被识别了。

第三层,地域粒度不够。 很多本地化投放是按城市甚至按商圈定的。用省级或国家级出口,覆盖不到实际投放的最小单元。

所以广告验证对代理的要求是:住宅网段 + 城市级定向 + 固定出口(可复现)。三者的组合才能让检查结果可重复——今天查和明天查,出口一致才有可比性。

要检查的指标

检查项判断方式
广告是否展示目标位置是否存在对应广告位与素材
素材是否被替换比对截图与投放素材的一致性
落地页正确性点击后的最终 URL 是否与投放配置一致
跳转链路是否经过未授权的中间跳转或联盟参数注入
竞品截流搜索品牌词时是否出现竞品广告
地域一致性不同城市展示的素材与落地页是否符合投放配置

其中跳转链路联盟参数注入最容易被忽略:有些流量劫持会在跳转过程中插入自己的联盟追踪参数,导致本该属于品牌方的转化被截走。检查方式是对比投放配置的最终 URL 和实际落地的 URL 参数。

自动化验证的实现思路

核心是让浏览器在指定城市的出口下加载页面,截图并提取关键信息,然后做比对。

from playwright.sync_api import sync_playwright
import hashlib

def verify_placement(url: str, city_session: str, shot_path: str) -> dict:
    proxy = {
        "server": "http://gateway.example.com:8080",
        "username": f"用户名-country-cn-city-{city_session}",
        "password": "密码",
    }
    with sync_playwright() as pw:
        browser = pw.chromium.launch(proxy=proxy, headless=True)
        context = browser.new_context(
            locale="zh-CN",
            timezone_id="Asia/Shanghai",
            viewport={"width": 1440, "height": 900},
        )
        page = context.new_page()

        # 用真实搜索路径进入,而不是直接打开落地页
        page.goto("https://www.example-search.com", wait_until="domcontentloaded")
        page.fill("input[name=q]", "目标品牌词")
        page.keyboard.press("Enter")
        page.wait_for_selector("#search-results", timeout=20000)

        page.screenshot(path=shot_path, full_page=False)

        ads = page.eval_on_selector_all(
            "#search-results .ad-block",
            "els => els.map(e => ({text: e.innerText, href: e.querySelector('a')?.href}))",
        )
        browser.close()

    return {
        "city": city_session,
        "ad_count": len(ads),
        "ads": ads,
        "screenshot": shot_path,
        "shot_hash": hashlib.sha256(open(shot_path, "rb").read()).hexdigest()[:16],
    }

几个关键决策:

用真实搜索路径进入,不要直接打开落地页。 直接访问落地页会跳过投放链路,也就跳过了你要验证的东西。而且不带 Referer 的直接访问,本身就可能被判定为异常流量。

截图存档比提取文本更重要。 广告被替换、素材被改动这类问题,文本提取往往看不出来,只有截图比对才能发现。截图哈希可以作为”是否发生变化”的快速判断依据。

出口要固定。 每个城市点位绑定固定的粘性会话,这样每天的检查结果才有可比性。如果出口天天变,你就无法区分”投放策略变了”和”只是出口不同”。

检查频率与覆盖

广告验证不需要高频。合理的做法是按投放周期安排:

  • 投放首日:加密检查,确认素材和落地页正确
  • 稳定期:每天 1–2 次,覆盖主要城市点位
  • 活动期:提高频率,增加长尾城市点位

城市点位的选择应该跟随投放配置,而不是均匀铺开。投放没覆盖的城市不需要检查,投放重点覆盖的城市应该加密。

合规提示

广告验证检查的是公开可见的广告展示,属于正常的品牌保护活动。需要注意的是:不要采集用户个人信息、不要对广告平台进行高频请求(会被判定为异常流量)、以及遵守各平台的服务条款。品牌保护的具体取证方式如果涉及纠纷,应当保留完整的截图、时间戳和出口 IP 记录,以证明数据的可复现性。

小结

广告验证的价值在于从真实用户视角得到可复现的观察。这决定了三个技术选择:住宅代理而非机房代理、城市级定向而非国家级、固定出口而非随机轮换。少了任何一条,结论都不足以支撑投放决策。

取舍结论

维度结论
前提条件投放配置的目标城市清单、素材基线和落地页 URL 已归档,可作为比对基准。
核心取舍固定出口让结果可复现,但牺牲 IP 分散度;随机轮换更隐蔽,却让每天的结果失去可比性。
不适用场景机房 IP 不适合做广告验证——平台会识别并返回占位广告,你验证的是一个不存在的场景。

一句话:住宅网段 + 城市级定向 + 固定出口,三者缺一不可。

在你的目标站点上验证这套方案

文中的做法都可以用试用额度直接跑通。用你自己的目标站点测一轮,成功率数据比任何评测都可靠。