# 无标签页网页采集与 AI 分析开发公约

修订日期：2026-09-21。适用于需要在用户无感知的情况下，通过目标网站现有登录会话采集多批数据，并交给网页 AI 服务分析的脚本。

本文的“无标签页”指任务运行时不创建、不导航、不复用目标网站标签页。用户为了登录目标网站或刷新已失效的 AI 会话而主动打开网页，不属于任务自动打开标签页。

## 1. 先确认无标签页是否成立

`offscreen` 适合“后台请求 + 响应解析”。它可以用 `DOMParser` 解析返回的 HTML，但拿不到目标网站真实页面的 DOM，也不存在可以模拟的鼠标滚轮。

- 只要业务能够通过 HTML、JSON、SSE 或网站连续加载接口完成，就应使用 `offscreen`。
- 必须操作真实控件、页面 JS 对象、Canvas 状态或只能由前端交互产生的数据时，才使用 `page`。
- 不得把创建 `active:false` 标签页描述成无标签页；它仍会出现在标签栏。
- 用户明确要求无标签页时，接口失效应返回明确错误，不得静默降级为打开后台标签页。

## 2. 无限滚动的后台等价实现

无标签页模式不能真实下滑。它应复现下滑触发的“加载下一批数据”网络链路：

1. 请求第一批搜索 HTML，并携带当前浏览器会话。
2. 优先读取响应里的 continuation URL、next token、load-more URL 或 AJAX URL。
3. 传统分页页面应跟随响应中的真实下一页链接，不要先猜 `page=2`。
4. 只有响应没有暴露下一批地址时，才尝试已验证的页码参数兼容路径。
5. 限制最大批次数、最大商品数、单次响应大小和总超时。
6. 记录已经访问的 URL、continuation token 与批次指纹；地址或结果重复时停止，避免死循环。
7. continuation 地址必须重新做协议、同源和授权范围检查，不能把页面返回的任意 URL 直接交给网络桥。

如果站点把下一批逻辑完全藏在运行时 JavaScript 中，响应里没有可验证的地址或 token，后台任务应报告“无法继续加载”。开发者应重新取得网络证据后升级解析规则，而不是虚构后续页数据。

## 3. 排名、重复展示和商品去重必须分层

搜索结果里的“展示记录”和“商品实体”不是同一个概念。一个 ASIN 可能同时出现在广告位和自然位，也可能在相邻批次边界重复。

正确顺序如下：

1. 每张搜索卡片先保存为展示记录，保留 ASIN、展示类型、结果标识、商品规范路径和原始顺序。
2. 无限加载的累积快照使用公共前缀识别新增部分。
3. 分页或 continuation 批次使用上一批尾部与下一批头部的序列重叠识别边界重复。
4. 先为展示记录计算展示排名和自然排名，再按 ASIN 聚合商品实体。
5. 同一 ASIN 的广告位、自然位及所有位置应分别保留，不能用一个 `Set(ASIN)` 提前删除。
6. 变体必须以真实 ASIN 区分；标题或图片相同不能作为商品身份。

采集与聚合阶段应保留 `ad_positions`、`organic_positions` 和完整 `placements`，再从中生成最终商品对象的 `search_rank`、`ad_rank`、`natural_rank` 与 `rank_type`。用户选择“仅自然排名”时只改变纳入分析的口径，不能篡改原始展示事实。

## 4. AI 只能判断图片，不能生成采集事实

ASIN、标题、图片链接、商品链接、价格、评分、Review 数量、广告标识和排名必须来自采集结果。AI 只负责根据实际可见的商品主体完成全局互斥款式聚类。

- 提示词必须给出带图片可用状态的 ASIN 白名单，并要求只返回一个严格 JSON 对象。
- 每个图片可用的 ASIN 必须恰好进入一个款式组，包括没有相似款的单独组；图片不可用的商品不得进入聚类。
- 固定 Prompt 必须要求全量盘点、视觉结构指纹、候选组、代表款、组内冲突检查、链式合并拆分和互斥完备复核；用户 Prompt 不能覆盖固定协议。
- 返回后必须验证顶层只有 `assignments`、每项只有 `asin`/`cluster_id`、ASIN 白名单完整、无重复成员、无遗漏且组编号格式合法。
- 同质化分数、覆盖率、关键词集中度和主要款式占比全部由脚本按照公开公式计算，不能接受 AI 自报分数。
- 标题、价格、材质、尺寸、功能和商品质量等事实不得由 AI 补全或评分。
- AI 会话是否删除与业务记录是否保留是两件事；删除临时对话不能删除任务和分析结果。

## 5. 图片与二进制只在任务期间存在

批量图片分析可以把商品图分批拼成对比图，但二进制内容只用于本次上传：

- 控制图片下载并发、单图大小、拼图商品数和总批次数。
- Blob、ArrayBuffer 和 Multipart 使用运行时二进制通道，不要转成巨大 JSON 字符串。
- 不要把拼图转换成 Base64 塞进任务报告或本地业务记录。
- 上传结束后释放 ImageBitmap、Blob 引用和临时传输记录。
- 结果只保存原始图片 URL、加载状态和必要的短错误摘要。

## 6. 本地数据必须按真实容量设计

当前本地业务数据单条记录上限为 1 MiB。任务成功、AI 返回成功或任务报告可下载，不代表业务记录已保存。

对于业务上要求“一次任务是一份报告”的场景，可以把最多 100 个商品保存为一条聚合记录：顶层保留任务编号、关键词、站点、排名口径、统计和采集时间，`products` 数组内每个 ASIN 只出现一次，页面事实和 AI 视觉分析在同一对象中合并。

聚合不等于无限增大：写入前必须对实际 UTF-8 JSON 字节数做预检，并预留封装开销。超过安全上限时明确要求用户减少商品数，不得静默截断、拆成用户未要求的多条记录，也不得重复保存 `products`、等价的 `analysis_text` 或图片 Base64。保存回执必须核对数据集、插入/更新/跳过数量和错误数组；保存失败要让任务明确显示失败原因，不得只返回 AI 成功消息。

## 7. 登录会话与安全边界

需要网页 AI 登录态时，页面注入只捕获完成后台协议所需的最小字段，并写入按脚本隔离的 Session Bridge。

- 后台任务可以读取自己的会话快照，普通网页捕获端不能回读。
- 会话快照必须有大小和有效期限制，过期后要求用户重新登录并刷新目标网站。
- Cookie、Token、机器人授权信息和完整请求头不得进入日志、任务报告、本地业务数据或 Worker。
- 网络桥对初始 URL、重定向和 continuation 地址逐次校验 `@match` / `@connect` 权限。
- AI 平台协议变化时应返回结构化登录或协议错误，不能输出原始认证响应。

## 8. 发布前验收

至少覆盖以下验证：

| 场景 | 必须验证的结果 |
|---|---|
| 传统分页 | 跟随真实下一页地址，达到数量后停止 |
| continuation | 优先使用同源连续加载地址或 token |
| 地址重复 | 不死循环，不重复累计排名 |
| 批次边界重复 | 只去除经序列确认的重叠 |
| 广告与自然位同 ASIN | 两类排名均保留 |
| AI 编造 ASIN | 拒绝结果，不写入业务数据 |
| 1 张或多张拼图 | 不把 Base64 写入任务或本地记录 |
| 100 个商品 | 单份聚合 JSON 在安全容量内写入并可读回；超限时不截断不拆分 |
| 登录失效、验证码、限流 | 明确错误，不偷偷打开标签页 |
| 跨域 continuation | 网络请求被拒绝 |

单元测试只能证明解析和边界逻辑。目标网站经常进行 A/B 发布，正式上线前仍应使用已登录浏览器完成一次真实端到端验收，并在文档中区分“仓库测试通过”和“真实站点已验证”。

## 9. 本次 Amazon AI 脚本经验

Amazon 搜索同质化分析脚本 `3.2.6` 使用 `offscreen` 模式：任务不创建 Amazon 标签页；后台优先识别 continuation，再兼容传统下一页和页码参数；展示记录完成排名后才按 ASIN 聚合。DeepSeek/豆包只返回每个可见 ASIN 的唯一 `cluster_id`，不返回商品事实、主观质量分、两两配对或最终百分比。脚本负责 ASIN 白名单、聚类完备性、互斥性、字段封闭性和图片可用性校验；任何遗漏、重复、编造、额外字段或把图片失败商品加入聚类的结果都会整份拒绝，避免污染数据。

运行设置会预填完整的聚类 Prompt，用户可以修改“什么算同款”的业务标准；JSON 结构、全局互斥聚类步骤、ASIN 白名单和反幻觉约束属于脚本固定契约，不能被自定义 Prompt 覆盖。`3.2.3` 将口径从“几乎完全同款”校准为“消费者视角的市场款式族”：以宏观架构/拓扑、核心功能组成和整体形态为主要依据，忽略颜色、纹理、品牌、拍摄背景和局部配件小幅差异；模型必须先建立市场结构原型，再对每个单例与所有原型进行二次复核，同时保留防传递链误合并规则。最终仍只能输出 `assignments`，本次用户 Prompt 写入 `analysis_prompt_used`，便于复现和审计。

DeepSeek 网页协议的“文件上传成功”不等于“模型已可读”。`3.2.4` 起，脚本会按网页端同样的流程调用 `GET /api/v0/file/fetch_files`，等待每张拼图从 `PENDING/PARSING` 进入 `SUCCESS` 后才发起 completion。任一附件解析失败或 90 秒超时时，应直接使任务失败并报告附件状态，不得在模型未读取图片的情况下保存“全部单例 / 0 分”结果。

`3.2.5` 起，视觉聚类必须启用模型推理，并采用“两阶段全局聚类”：先合并同型号/系列、仅颜色材质等非结构差异的兄弟变体，再归纳更广义的市场结构原型。提示清单可以携带页面采集的标题作为型号与变体辅助证据，但主图仍是结构判定的主要证据；不得仅因标题文字接近而合组。每个单例必须与所有已有组和其他单例复核，避免把明显的系列变体错误拆成大量单例。

`3.2.6` 起，聚类输入清单彻底移除标题，AI 只接收商品主图及用于映射的序号/ASIN。默认规则改为“动态原型锚定 + 全局桶分配 + 组内纯度回查”：从当前图片动态推导结构维度和硬/软差异，不预设原型数量，不使用固定权重、80% 阈值或模型自报百分比；每个成员必须直接符合真实代表原型，禁止链式传递合并。拍摄角度、背景、颜色和非核心局部通常视为软差异，但在遮挡导致证据不足时不得猜测不可见结构后强行合组。

最终商品对象只保留必要页面事实、广告/自然排名与 `homogeneity_score`，不重复输出 `product_url`、`price_amount`、`currency`、`rating_text` 和 `review_count_text`。当 ASIN 所属款式族仅有自己时，`homogeneity_score=0`；存在近似款时为 `所属款式族商品数 / 有效视觉样本数 × 100`。关键词汇总同时给出非单例组商品覆盖率，以及按归一化 HHI 形式计算的 `keyword_homogeneity_score = (Σ款式占比² - 1/N) / (1 - 1/N) × 100`。所有商品互不相似时集中度为 0，全部属于同一款式时为 100；`major_styles` 只列出商品数不少于 2 的前 10 个主要款式、代表商品、占比和成员 ASIN。每张拼图从 25 个商品降为 16 个，以保留 AI 缩放后的主体结构细节；拼图只在内存中上传，每次任务只保存一条聚合 JSON，写入前使用 900 KiB 安全线预检。

这些结论已由仓库单元测试和静态检查覆盖；Amazon 当前线上 A/B 结构仍需在每次重大改版后重新取证。
