体育爬虫策略包运营平台 PRD V2.0

文档状态:评审稿
产品负责人:Tang
更新时间:2026-07-17
适用对象:内容运营、产品、爬虫研发、数据研发、内容处理研发

0. 一句话结论

平台以后只围绕策略包运营。策略包下面只有两种抓取能力:

  • 爬取:最小执行单元是 Query。
  • 订阅:最小执行单元是账号。

每个 Query 和账号都有自己的优先级与调度执行周期;抓取单元与周期组合后成为定时任务。系统根据每次任务通过业务过滤的有效视频量逐档升频或降频,并记录每次变化。所有抓回、去重、业务过滤、下载和写库数据最终按策略包汇总,同时可以下钻到具体 Query、账号、任务和原始视频。

策略包到入库的自动化抓取链路
图 1:策略包、Query / 账号、调度周期、定时任务、抓回视频、标准化、业务过滤、下载与入库的完整链路

1. 背景与问题

现有页面以“抓取方向”和“实体覆盖”为核心,已经能展示每日抓取、Query、视频和处理链路,但实际运营逻辑发生了变化:

  • 运营真正创建和维护的是一批有共同目标的抓取配置,不需要再通过“实体”解释。
  • 搜索与订阅是两种不同的抓取能力,但最终都服务同一个业务目标。
  • Query 和账号的抓取价值会随时间变化,固定每天抓取会浪费任务预算。
  • 现有统计容易混用品类、方向、Query 和视频,无法稳定回答“这个策略包是否有效”。
  • Query、账号、任务、过滤和视频之间虽然能技术追踪,但运营无法在一个页面完成查看、判断和调整。

因此,需要把平台的业务主线收敛为:

策略包 → Query / 账号 → 调度执行周期 → 定时任务 → 抓回视频 → 规范化去重 → 业务过滤 → 下载 → 写库

2. 产品目标

2.1 业务目标

  1. 运营可以独立创建、查看、修改、暂停、恢复和删除策略包。
  2. 所有 Query 和账号必须绑定策略包,禁止出现游离数据。
  3. 运营可以按策略包判断抓取量、过滤损耗、入库量和入库率。
  4. 运营可以下钻到具体 Query 或账号,继续查看任务和原始视频。
  5. 系统可以根据当次有效视频量自动调整 Query 或账号的调度周期。
  6. 每次配置、频率变化、任务执行和过滤结果都可以追踪与复现。

2.2 用户体验目标

  • 老板打开首页,可以迅速判断当前有多少策略包运行、近 7 天抓回和入库多少、哪些包需要调整。
  • 运营进入策略包,可以直接看到两种能力各自贡献多少,不需要理解研发内部表结构。
  • 运营查看 Query 或账号时,可以看到当前周期、优先级、下次执行和实际产出。
  • 研发可以从策略包一路追到 Query/账号、任务、候选视频、过滤记录、下载和资产。

2.3 非目标

  • 平台不负责自动生成 Query 文案;运营直接上传最终 Query List。
  • “特定组合”不作为第三种抓取能力。组合逻辑只负责生成 Query,生成后仍进入 Query 爬取流程。
  • 平台不负责定义内容品类本身;品类沿用既有四类定义。
  • 本期不做跨策略包自动搬迁 Query 或账号。
  • 本期不删除历史已入库视频;删除策略包只停止未来任务并移除运营配置。

3. 核心概念

3.1 策略包

策略包是一批 Query 和账号的共同业务父级,也是平台唯一的上层运营统计维度。

策略包回答四个问题:

  1. 这批抓取服务什么业务目标?
  2. 包里配置了哪些 Query 和账号?
  3. 这些抓取单元当前以什么频率执行?
  4. 最终抓回、过滤和入库效果怎么样?

3.2 Query

Query 是“爬取”能力的最小执行单元。每条 Query 必须明确:

  • 所属策略包
  • 具体搜索文字
  • 执行平台
  • 优先级:high / normal / low
  • 调度执行周期:1 / 3 / 5 / 7 / 14 / 30 / 0 / -1
  • 一级类目、二级类目、三级运动
  • 删除指令需要的稳定 source_id(只在 schedule_period=-1 时必填)

一条 Query 只在一个平台执行。相同搜索意图如果要在三个平台执行,需要配置三条平台 Query。

3.3 账号

账号是“订阅”能力的最小执行单元。每个账号必须明确:

  • 所属策略包
  • 账号原始 URL
  • 账号名称
  • 平台
  • 优先级:high / normal / low
  • 调度执行周期:1 / 3 / 5 / 7 / 14 / 30 / 0 / -1
  • 一级类目、二级类目、三级运动
  • 删除指令需要的稳定 source_id(只在 schedule_period=-1 时必填)

账号 URL 是唯一识别依据,账号显示名允许随后同步更新。

3.4 调度执行周期

schedule_period 表示 Query 或账号的执行间隔。可填写 8 个值:

含义是否参与自动调频
1每 1 天执行
3每 3 天执行
5每 5 天执行
7每 7 天执行
14每 14 天执行
30每 30 天执行
0一次性任务,完成后不再调度
-1删除指令;爬虫系统删除对应种子并保留操作审计

暂停属于 Query / 账号状态,不属于调度周期。-1 也不是运行频率,而是导入时传给爬虫系统的删除命令。导入服务必须通过 source_id 找到稳定目标,不允许用 Query 文本或账号显示名模糊删除。

3.5 定时任务

定时任务由“抓取单元 + 当前调度周期”生成:

  • Query + schedule_period → Query 定时任务
  • 账号 + schedule_period → 账号订阅任务

调度周期改变后,系统更新下一次执行时间,不修改历史任务记录。

schedule_policy 是优先级、当前调度周期、下次执行时间和调度生命周期的唯一事实源。Query 和账号表只保留业务身份与归属,页面所见的优先级、周期和状态均从当前生效调度策略读取。

  • schedule_period=0:创建一次性调度策略;任务结束后状态转为“已完成”,不再计算 next_run_at
  • schedule_period=-1:不创建任务;服务在同一事务内软删除 Query / 账号及其当前调度策略,写入删除时间和操作审计。重复提交同一幂等键不得重复删除。

4. 对象关系

4.1 关系结构

  1. 一个策略包关联一个或多个内容品类。
  2. 一个策略包包含零到多个 Query。
  3. 一个策略包包含零到多个账号。
  4. 一个 Query 只属于一个策略包。
  5. 一个账号只属于一个策略包。
  6. 一个 Query 或账号只有一个当前生效调度周期。
  7. 一个 Query 或账号可以产生多条定时任务运行记录。
  8. 一次任务可以抓回零到多条候选视频。
  9. 一条候选视频可以产生多条过滤步骤记录。
  10. 通过处理和下载的视频最终写入内容库资产。

4.2 强约束

  • package_id 是 Query 和账号的必填字段。
  • 不允许一个 Query 或账号同时归属多个策略包。
  • 需要跨策略包复用时,必须复制为新的抓取单元,并保留来源引用。
  • 策略包暂停时,包内 Query 和账号全部停止创建新任务。
  • 单个 Query 或账号暂停时,只影响该抓取单元。
  • 已发生的任务和已入库内容不随配置删除。

5. 用户与权限

角色查看创建/编辑发布暂停/恢复删除查看技术记录
老板/管理者全部汇总
内容运营全部业务数据需权限需二次确认业务级
产品管理员全部全部
爬虫研发全部技术配置技术急停全部
数据研发全部统计配置全部

6. 信息架构

6.1 首页

首页继续保留当前已经评审通过的布局:

  1. 核心指标
  2. 最近 7 天 / 今日趋势
  3. 品类下钻
  4. 品类下的策略包列表
  5. 内容分布
  6. 研发技术基建监控

首页不新增复杂概念,只把旧“抓取方向”替换为“策略包”。

6.2 策略包详情

策略包详情保留五个页签:

  1. 概览:策略包信息、包级漏斗、两种抓取能力和频率分布。
  2. 每天:日级抓回与入库、平台分布、Query 执行情况、频控变化。
  3. 抓取详情:按“全部、Query 爬取、账号订阅”切换,查看包内的具体 Query 和订阅账号。
  4. 视频:查看包内或指定 Query 抓回的视频。
  5. 配置:编辑策略包、导入 Query / 账号、设置频控并发布。

6.3 策略包独立管理

运营可以:

  • 新建策略包
  • 查看策略包
  • 修改策略包并发布新版本
  • 暂停策略包
  • 恢复策略包
  • 删除策略包
  • 搜索策略包
  • 只看异常策略包
  • 导出策略包当前数据

7. 首页需求

7.1 核心指标

指标定义计算
近 7 天抓回视频所有运行策略包任务返回的视频量SUM(candidate_count)
近 7 天入库视频通过业务过滤并成功入库的视频量COUNT(DISTINCT canonical_asset_key)
今日入库视频当日截至统计时间的入库量当日 asset_created_at
运行中的策略包当前状态为运行中的策略包running / total
本周动态调频近 7 天发生频率变化的抓取单元数COUNT(DISTINCT source_id)

7.2 趋势图

  • 最近 7 天按自然日展示。
  • 今日按小时展示。
  • 支持按策略包、内容品类或渠道堆叠,默认按策略包展示。
  • 按策略包时,每个堆叠色块代表一个策略包,用于直接比较各包对每日抓回量的贡献。
  • 鼠标悬浮展示日期、总量和每个构成的具体数量及占比。
  • 切换统计口径时,图例、堆叠数据和悬浮明细同步变化。

7.3 品类下钻

左侧选择内容品类,右侧显示:

  • 全库累计
  • 最近 7 天入库
  • 今日入库
  • 昨日入库
  • 运行中的策略包
  • 关联 Query
  • 订阅账号
  • 近 7 天入库率

策略包列表字段:

字段说明
策略包名称和 package_id
描述业务目标与范围
版本当前生效版本
状态当前生命周期状态
Query当前配置数量
账号当前配置数量
当前周期分布1、3、5、7、14、30 天、一次性;暂停单列为状态
累计入库策略包历史累计入库
近 7 天抓回包内任务返回量
近 7 天入库包内最终入库量
昨日入库上一完整自然日的最终入库量
入库率入库 / 抓回
查看进入策略包详情

8. 策略包概览

8.1 基础信息

  • 策略包名称
  • package_id
  • 当前版本
  • 状态
  • 负责人
  • 关联品类
  • 运动
  • 策略包描述
  • 最近运行时间

8.2 包级漏斗

概览首先展示包级运营数据:

  1. Query 数
  2. 订阅账号数
  3. 近 7 天抓回视频
  4. 近 7 天未入库总量
  5. 近 7 天入库视频
  6. 昨日入库视频

总未入库量计算:

总未入库 = 抓回视频 - 最终入库视频

总未入库包含规范化去重、业务规则淘汰、下载失败和写库失败,不能直接命名为“业务过滤掉”。

概览继续展示处理漏斗:

  1. 平台抓回 candidate_count
  2. 规范化去重后 canonical_count
  3. 业务规则通过 business_pass_count
  4. 下载成功 download_success_count
  5. 写入内容库 asset_write_count

当前快照缺少中间事实时,页面只能展示真实首尾值,并将中间节点标为“待接入”;禁止按比例估算。

入库率计算:

策略包入库率 = 最终入库视频 / 抓回视频

8.3 两种抓取能力

抓取能力最小单元配置量运行中当前周期7 天抓回7 天入库昨日入库入库率
爬取QueryQuery 总数活跃 Query各周期档位Query 贡献Query 入库Query 昨日入库Query 入库/抓回
订阅账号账号总数活跃账号各周期档位账号贡献账号入库账号昨日入库账号入库/抓回

概览在表格下提供“两种能力近 7 天贡献”对比图:

  • 每种能力同时展示抓回量和过滤后入库量。
  • 两种能力使用相同标尺,便于判断策略包主要依赖哪种能力。
  • 点击“Query 爬取”进入抓取详情并筛选 Query。
  • 点击“账号订阅”进入抓取详情并筛选账号。
  • 图表总量必须与策略包近 7 天抓回和入库总量对账。

8.4 调度周期分布

按 1、3、5、7、14、30 天、一次性展示数量和占比;暂停作为状态单独展示。

频率分布的分母是:

策略包抓取单元数 = Query 数 + 账号数

9. 每天页面

9.1 数据概览

  • 7 天入库视频
  • 昨日入库视频
  • 今日当前值
  • 日环比
  • 有结果 Query

9.2 平台堆叠柱状图

  • 每日柱按 TikTok、YouTube、Instagram 堆叠。
  • 悬浮展示平台具体量级。
  • 点击日期查看当天随机入库视频。
  • 当日未结束时使用斜线填充并标注当前时点。

9.3 日期列表

字段定义
日期Asia/Singapore 自然日
抓取视频当天平台返回总量
入库视频业务过滤后实际入库量
执行中 Query正在执行但未结束
已完成 Query当天已结束
待执行 Query当天计划内尚未开始
有结果 Query已完成 Query 中抓回量大于 0 的比例

有结果 Query 只统计已完成 Query:

有结果 Query 率 = 抓回量 > 0 的已完成 Query / 已完成 Query

9.4 动态频控变化

每天页面底部展示近 7 天频率变化:

  • 变化时间
  • Query 或账号
  • 变化前频率
  • 变化后频率
  • 变化原因
  • 规则版本
  • 是否人工覆盖

10. 抓取详情

10.1 查看结构

抓取详情不拆成新的独立业务页面,在同一页提供三个切换项:

  • 全部:先展示 Query List,再展示账号订阅 List。
  • Query 爬取:只展示 Query List。
  • 账号订阅:只展示账号 List。

搜索框根据当前类型切换搜索口径。切换类型不改变当前策略包,所有明细都必须限定在当前 package_id 内。

10.2 Query List

默认按最近运行时间倒序,每页最多 50 条,支持关键词搜索。

字段:

  • 平台
  • Query 原文
  • Query ID
  • 内容品类
  • 来源类型:直接导入 / 组合生成
  • 当前调度周期
  • 优先级
  • 下次执行时间
  • 连续低产次数
  • 近 7 天抓回
  • 近 7 天入库
  • 昨日入库
  • 入库率
  • 查看视频

10.3 Query 详情

点击 Query 后进入视频页,默认筛选当前 Query。

详情展示:

  • Query 原文
  • 所属策略包
  • 平台
  • 当前调度周期
  • 优先级
  • 抓回量
  • 入库量
  • 昨日入库量
  • 入库率
  • seed_id
  • task_id
  • 原始视频 List
  • 按业务日汇总的抓回、过滤、入库和有结果 Query
  • 按执行时间倒序的任务记录

每条任务记录展示:

  • 执行时间
  • run_id
  • 抓回量
  • 未入库
  • 入库量
  • 入库率
  • 当次调度周期
  • 调频结果
  • 执行状态
  • 本次入库视频入口

“按天”用于看趋势,“按次”用于定位一次具体执行。两者必须来自同一份 task_run 事实数据,不能分别维护口径。

10.4 详细过滤原因

每个 Query 下提供“详细过滤原因”,默认收起。

当前只在有真实数据的节点展示:平台抓回、规范化去重、业务过滤合计、最终入库。

接入 processing_result 后,再按真实处理顺序展开黑名单、游戏排除、质量、热度、语言、年份、访问和下载失败等规则级原因。每一步展示数量、占抓回量比例、rule_idrule_version

禁止根据总过滤量按比例估算规则原因;缺少规则级事实时必须明确写“尚未接入明细”。

11. 账号订阅详情

账号 List 与 Query 同页展示。

字段:

  • 账号名称
  • 账号 handle
  • 平台
  • 账号原始 URL
  • 当前调度周期
  • 优先级
  • 下次执行时间
  • 连续低产次数
  • 近 7 天抓回
  • 近 7 天入库
  • 昨日入库
  • 入库率

点击账号 URL 直接打开平台账号。

点击“查看详情”后,在当前页面展开账号详情:

  • 账号名称、平台、handle 和原始 URL
  • 当前调度周期
  • 优先级
  • 下次执行时间
  • 连续低产次数
  • 近 7 天抓回、近 7 天入库、昨日入库和入库率
  • 按业务日汇总的抓回、过滤和入库趋势
  • 按执行时间倒序的任务记录
  • 下一次计划任务

每条已执行任务展示执行时间、run_id、抓回、未入库、入库、入库率、当次调度周期、调频结果和状态。账号详情默认只展开一个,再点击其他账号时替换为新的账号详情,避免页面过长。

12. 动态频控

12.1 设计原则

  • 频控对象是单个 Query 或账号,不是整个策略包。
  • 策略包暂停时,包内所有抓取单元整体暂停。
  • 人工暂停优先级最高。
  • 每次调频必须留下事件记录。
  • 调频依据使用当次 business_pass_count,不是平台原始返回量,也不是下载或写库结果。

12.2 默认规则

触发条件动作说明
当次有效视频 < 5降一档1→3→5→7→14→30 天,最低保持 30 天
当次有效视频 > 20升一档30→14→7→5→3→1 天,最高保持 1 天
当次有效视频 5–20保持不调整当前周期
人工暂停立即暂停暂停是状态,不改变原周期
策略包暂停全部暂停保留原周期,恢复后继续
schedule_period = 0不调频一次性任务执行完成后结束
schedule_period = -1删除种子删除指令必须留审计,不创建运行任务

12.3 频率状态机

循环档位只允许相邻变化:

1 天 ↔ 3 天 ↔ 5 天 ↔ 7 天 ↔ 14 天 ↔ 30 天

任意循环档位可以人工暂停;恢复时回到暂停前档位。不允许自动跨档,避免任务量突然放大。

12.4 低产定义

本次有效视频 = business_pass_count

低产判断必须在规范化去重和业务过滤后、下载前完成,避免网络下载失败干扰抓取价值判断。

12.5 调频事件

每次变化记录:

  • frequency_event_id
  • package_id
  • source_type
  • source_id
  • old_schedule_period
  • new_schedule_period
  • reason_code
  • business_pass_count
  • rule_version
  • triggered_by
  • next_run_at
  • created_at

13. 策略包配置与 CRUD

13.1 新建

必填:

  • 策略包名称
  • 负责人
  • 策略包描述

保存草稿后生成 package_id

一级、二级、三级类目由每条 Query 或账号携带;策略包的类目与运动分布由包内抓取单元聚合得出,不在包级重复配置。

13.2 编辑

编辑策略包时创建草稿版本,不直接修改线上版本。

草稿可以调整:

  • 基础信息
  • Query List
  • 账号 List
  • 动态频控规则
  • 平台启用范围

13.3 发布

发布前检查:

  • 策略包必填项完整
  • 每条 Query 有 package_id
  • 每个账号有 package_id
  • 平台合法
  • 优先级合法
  • schedule_period 合法
  • Query/账号无重复
  • 规则版本存在

13.4 暂停与恢复

暂停策略包后:

  • 不创建新任务
  • 已运行任务允许完成
  • 保留数据、版本和历史频率
  • 支持恢复

恢复时:

  • 抓取单元恢复到暂停前频率
  • 重新计算 next_run_at
  • 不补跑暂停期间所有历史周期,除非人工选择补跑

13.5 删除

  • 删除需要二次确认。
  • 运行中策略包必须先暂停。
  • 删除只移除运营配置,不删除历史任务和已入库资产。
  • 已删除策略包仍可通过审计记录查询。

14. 导入格式

14.1 Query List

字段必填说明
query最终搜索文字
strategy_package策略包名称,导入时解析为 package_id
platformYouTube / TikTok / Instagram
priorityhigh / normal / low
schedule_period1 / 3 / 5 / 7 / 14 / 30 / 0 / -1;0 一次性,-1 删除
category_l1固定为体育
category_l2纯享集锦 / 混剪集锦 / 画面讲解 / 人物故事 / 运动教学
category_l3具体运动,例如篮球、足球
source_id条件必填普通新增/更新留空;schedule_period=-1 时必须填已存在的 query_id

14.2 账号 List

字段必填说明
account_url平台原始账号 URL
strategy_package策略包名称,导入时解析为 package_id
platformYouTube / TikTok / Instagram
priorityhigh / normal / low
schedule_period1 / 3 / 5 / 7 / 14 / 30 / 0 / -1;0 一次性,-1 删除
category_l1固定为体育
category_l2纯享集锦 / 混剪集锦 / 画面讲解 / 人物故事 / 运动教学
category_l3具体运动,例如篮球、足球
source_id条件必填普通新增/更新留空;schedule_period=-1 时必须填已存在的 account_id

14.3 导入校验

  • 文件支持 .xlsx.xls.csv
  • 表头大小写不敏感,保存时统一为标准字段。
  • 错误行必须显示行号、字段、原值和错误原因。
  • 整批发布前,错误行必须全部处理。
  • 平台与 URL 不匹配时阻断发布。
  • 策略包名称无法唯一解析为 package_id 时阻断发布。
  • 服务端按“package_id + source_type + platform + 规范化 Query/URL”检查文件内与数据库已存在重复,不依赖前端抽样。
  • 账号 URL 的域名必须与平台一致;YouTube、TikTok 和 Instagram 不允许交叉填写。
  • schedule_period=-1 时必须提供当前策略包下已存在的 source_id;目标不存在或归属不匹配时阻断。
  • 每个导入批次保存 batch_id、文件 SHA-256、原始行号和行级幂等键;同一幂等键重放时返回原结果。
  • 导入结果必须分别展示解析总行数、可导入、重复跳过和错误行。
  • 错误行必须支持下载,便于运营修复后再次导入。
  • 新策略包至少成功导入一条 Query 或一个账号,才允许确认创建。

15. 数据模型

15.1 strategy_package

字段类型说明
package_idstring主键
namestring策略包名称
descriptiontext业务说明
owner_idstring负责人
statusenum生命周期状态
current_version_idstring当前版本
created_attimestamp创建时间
updated_attimestamp更新时间
deleted_attimestamp软删除时间

15.2 策略包类目聚合

策略包本身不重复维护运动和内容类目。页面按包内 Query / 账号携带的 category_l1 / category_l2 / category_l3 聚合分布;需要加速时可以建设派生汇总表,但事实来源仍是抓取单元。

15.3 crawl_query

核心字段:

  • query_id
  • package_id
  • query_text
  • platform
  • category_l1
  • category_l2
  • category_l3
  • source_type
  • version_id
  • status(业务身份状态快照,调度态以 schedule_policy 为准)
  • deleted_at

15.4 subscription_account

核心字段:

  • account_id
  • package_id
  • account_url
  • account_name
  • platform
  • category_l1
  • category_l2
  • category_l3
  • version_id
  • status(业务身份状态快照,调度态以 schedule_policy 为准)
  • deleted_at

15.5 schedule_policy

核心字段:

  • schedule_policy_id
  • package_id
  • source_type
  • source_id
  • priority
  • statusdraft / pending / active / paused / completed / deleted / error
  • previous_schedule_period
  • schedule_period
  • next_run_at
  • rule_version
  • enabled
  • consecutive_low_yield_runs
  • completed_at
  • deleted_at
  • idempotency_key

同一 source_type + source_id 只允许一条当前生效策略。Query / 账号接口展示的优先级、调度周期、状态和下次执行均由本表联表读取,不在多张表上双写。

15.6 task_run

核心字段:

  • run_id
  • schedule_policy_id
  • package_id
  • source_type
  • source_id
  • scheduled_at
  • started_at
  • finished_at
  • status
  • candidate_count
  • canonical_count
  • business_pass_count
  • download_success_count
  • asset_write_count
  • schedule_period_before
  • schedule_period_after
  • error_code
  • retry_count

15.7 candidate_video

保留:

  • 平台原始 ID
  • 原始 URL
  • 标题
  • 作者
  • 发布时间
  • 抓回时间
  • package_id
  • source_type
  • source_id
  • run_id

15.8 processing_result

每一步一条记录:

  • processing_result_id
  • run_id
  • candidate_id
  • stage_order
  • stage
  • rule_id
  • rule_version
  • result
  • reason_code
  • processed_at
  • created_at

同一 run_id 的阶段顺序固定为:candidate_saved → canonicalized → business_passed → downloaded → asset_written。每个阶段的分母必须等于上一阶段通过量。

15.9 其他事实表

  • download_task:下载状态、重试次数、失败原因和媒体引用。
  • asset_attribution:资产与策略包、Query / 账号、run_id 的多来源归因。
  • frequency_event:调频前后值、原因、规则版本、触发人和下一次执行时间。
  • operation_audit:策略包配置、导入、发布、暂停、恢复和删除的操作审计;导入操作保存 batch_id / file_sha256 / row_number / idempotency_key / before_value / after_value

16. 状态

16.1 策略包状态

  • 草稿:正在配置,尚未发布。
  • 待启动:已发布,等待首次任务。
  • 运行中:正常创建任务。
  • 需关注:运行超过 1 天,但入库率低于配置阈值或连续异常。
  • 已暂停:不再创建任务,可恢复。
  • 已完成:一次性目标已经结束,只读。
  • 已删除:软删除,只在审计中可见。

16.2 Query / 账号状态

  • 启用
  • 暂停
  • 待执行
  • 执行中
  • 异常
  • 已完成:一次性任务已结束,不再调度。
  • 已删除:软删除,仅审计可见。

视频列表不展示“可用 / 待确认”等状态标签,避免与内容审核状态混淆。

17. 统计口径

17.1 归因

  • 每条候选视频保留原始 Query 或账号。
  • 每条候选视频通过 package_id 归因到策略包。
  • 同一视频可能被多个策略包抓回,各策略包均保留贡献记录。
  • 全库视频总量按规范化资产键去重。
  • 单策略包内的视频量按规范化资产键去重。
  • 单策略包内同一规范化资产只有一个“主归因”:优先归给首个成功 asset_written 的 Query / 账号;如果同时,按 started_atrun_id 升序确定。
  • 其他命中来源作为“辅助归因”保留在 asset_attribution,用于追溯,不重复增加 Query / 账号贡献量。
  • Query 贡献与账号贡献之和必须等于策略包去重入库量;各 task_run.asset_write_count 是执行事件量,可因多源命中而大于包级去重入库量。

17.2 主要公式

抓回视频 = 平台任务返回并成功保存的候选记录

规范化去重丢弃 = candidate_count - canonical_count

业务规则淘汰 = canonical_count - business_pass_count

下载失败 = business_pass_count - download_success_count

写库失败 = download_success_count - asset_write_count

总未入库 = candidate_count - asset_write_count

入库率 = asset_write_count / candidate_count

有结果 Query 率 = 抓回量 > 0 的已完成 Query / 已完成 Query

活跃 Query = enabled=true 且状态不是暂停/删除

活跃账号 = enabled=true 且状态不是暂停/删除

本周动态调频 = 近 7 天至少产生一条 frequency_event 的抓取单元数

17.3 时间

  • 业务日使用 Asia/Singapore。
  • 当日数据每 15 分钟更新。
  • D-1 在次日 02:00 固化。
  • 迟到数据回补时保留修订记录。

17.4 对账与演示数据

  • 策略包近 7 天抓回合计必须等于 7 个业务日抓回合计。
  • 策略包近 7 天入库合计必须等于 Query 主归因贡献 + 账号主归因贡献;昨日入库必须与上一完整自然日的包级去重明细对账。
  • 每日、策略包、Query / 账号和 task_run 共享候选、处理和归因事实;策略包展示规范化资产去重量,task_run 展示执行事件量,前端不得直接相加二者或分别硬编码。
  • 每条 Query 和每个账号必须有明确 package_id;缺失时进入 unassigned 异常队列,不允许默认归到某个策略包。
  • 原始视频必须使用平台内容 URL,不允许用搜索结果 URL 代替。
  • 接口尚未接入的列表、任务记录或调频记录必须标注“结构样例”或“快照样例”,不得伪装为线上全量数据。
  • 页面当前快照仅用于验证策略包映射;正式上线后,所有指标由事实表自动回写。
  • 每个 run_id 必须满足 candidate_count ≥ canonical_count ≥ business_pass_count ≥ download_success_count ≥ asset_write_count;不满足时进入数据质量告警。

18. 过滤与技术追踪

策略包页面以大白话展示漏斗,研发监控保留详细技术原因。

必要追踪链:

package_id → version_id → query_id/account_id → task_id → run_id → candidate_id → processing_result → download_task_id → asset_id → original_url

原始 URL 必须在候选视频和资产层都可查。Query 、账号和每次运行都必须能下钻到视频列表;每条视频展示策略包/版本、来源类型、task_idrun_idcandidate_idasset_id 和平台原始 URL。

19. 接口需求

19.1 策略包

  • POST /strategy-packages
  • GET /strategy-packages
  • GET /strategy-packages/{package_id}
  • PATCH /strategy-packages/{package_id}
  • POST /strategy-packages/{package_id}/publish
  • POST /strategy-packages/{package_id}/pause
  • POST /strategy-packages/{package_id}/resume
  • DELETE /strategy-packages/{package_id}

19.2 Query 与账号

  • POST /strategy-packages/{package_id}/queries:import
  • POST /strategy-packages/{package_id}/queries:validate-import
  • GET /strategy-packages/{package_id}/queries
  • PATCH /queries/{query_id}
  • GET /queries/{query_id}/task-runs
  • POST /strategy-packages/{package_id}/accounts:import
  • POST /strategy-packages/{package_id}/accounts:validate-import
  • GET /strategy-packages/{package_id}/accounts
  • PATCH /accounts/{account_id}
  • GET /accounts/{account_id}/task-runs
  • GET /imports/{batch_id}/errors

19.3 数据

  • GET /strategy-packages/{package_id}/metrics
  • GET /strategy-packages/{package_id}/daily
  • GET /strategy-packages/{package_id}/videos
  • GET /queries/{query_id}/videos
  • GET /accounts/{account_id}/videos
  • GET /queries/{query_id}/filter-breakdown
  • GET /task-runs/{run_id}/videos
  • GET /strategy-packages/{package_id}/frequency-events

所有列表接口支持分页、关键词搜索、平台、日期和状态筛选。

生产接口约束:

  • 列表默认 page_size=50,使用游标 page_token 翻页;前端不把全量 Query、账号或视频一次性加载到浏览器。
  • Query / 账号导入由服务端解析 .xlsx / .xls / .csv,先返回校验批次,再由运营确认提交;校验结果必须来自真实文件行,禁止固定演示数字。
  • 导入校验返回 total_rows / valid_rows / duplicate_rows / error_rows 及行级错误下载地址。
  • 导入校验和提交都接收 batch_id + idempotency_key;服务端使用规范化唯一键对数据库全量检重,不信任前端的重复判断。
  • schedule_period=-1 的行必须指定 source_id,服务端验证策略包归属后执行软删除;该操作不创建 task_run
  • GET /strategy-packages/{package_id} 遇到不存在的 ID 返回 404 PACKAGE_NOT_FOUND,前端回到总览,不得静默显示另一个策略包。
  • 指标、每日、任务明细和视频列表必须共享同一 run_id 与阶段事实,不允许各接口独立拼一套数字。

20. 审计与安全

必须记录:

  • 创建、编辑、发布、暂停、恢复、删除策略包
  • 导入 Query / 账号的文件摘要和行级结果
  • 导入批次 ID、文件 SHA-256、原始行号、幂等键、稳定 source_id 以及增删改前后值
  • 人工修改频率
  • 自动修改频率
  • 规则版本
  • 操作人
  • 操作前后值
  • 时间

删除、暂停和发布必须二次确认。

21. 迁移方案

21.1 迁移原则

旧页面中的“抓取方向”一对一迁移为策略包。

旧“实体”不再作为产品概念:

  • 原有最终平台搜索文字迁移为 Query。
  • 原有订阅源迁移为账号。
  • 原有实体仅保留在历史字段或 Query 生成来源中,不参与新页面统计。

21.2 历史数据

  1. 为每个历史抓取方向创建 package_id
  2. 为历史 Query 回填 package_id
  3. 为历史账号回填 package_id
  4. 为任务、候选视频和资产回填可追踪的策略包来源。
  5. 无法归属的记录进入“待归属”,不计入策略包效果。
  6. 完成率达到 100% 后,禁止新数据缺少 package_id

21.3 兼容

  • 历史 direction_id 只读保留。
  • 新接口以 package_id 为准。
  • 数据仓库在过渡期保留映射表。

22. 异常与空状态

22.1 策略包无 Query、无账号

允许保存草稿,不允许发布。

22.2 Query 无结果

展示抓回 0、连续低产次数、当前调度周期和下次执行。

22.3 账号无法访问

记录访问错误;连续失败达到阈值后暂停账号并通知负责人。

22.4 数据延迟

页面明确最后更新时间;不使用未完成自然日做完整日同比。

22.5 频控服务异常

保留原调度周期,不自动扩大任务量;恢复后按事件时间补算。

23. 验收标准

23.1 策略包

  • 可以新建、查看、编辑、发布、暂停、恢复和删除。
  • 新建时策略包名称、负责人和描述为必填;品类与运动由包内 Query / 账号聚合。
  • 删除和暂停有二次确认。
  • 策略包详情展示包级漏斗和两种抓取能力。

23.2 Query

  • 可以导入 Query List。
  • 每条 Query 必须绑定策略包。
  • 可以看到平台、原文、优先级、调度周期、下次执行和产出。
  • 可以展开详细过滤原因。
  • 可以查看对应原始视频。
  • 可以查看按天汇总和按次执行记录。
  • 每次执行可以看到 run_id、抓回、过滤、入库、入库率、频率变化和本次视频。
  • Query List 展示近 7 天抓回、近 7 天入库、昨日入库和入库率。

23.3 账号

  • 可以导入账号 List。
  • 每个账号必须绑定策略包。
  • 可以看到账号 URL、频率、下次执行和产出。
  • 可以从策略包概览直接进入账号订阅视图。
  • 可以展开单个账号并查看按天汇总、每次任务和下一次计划任务。
  • 账号 List 展示近 7 天抓回、近 7 天入库、昨日入库和入库率。

23.4 频控

  • 支持 1 / 3 / 5 / 7 / 14 / 30 天、0 一次性和 -1 删除。
  • 当次有效视频 <5 逐档降频,>20 逐档升频,5–20 保持。
  • 每次变化有事件记录和原因。
  • Query 或账号加调度周期后产生定时任务。

23.5 数据

  • 策略包、Query 和账号三层数据可对账。
  • 策略包近 7 天合计、每日合计和任务明细可对账。
  • 抓回、规范化、业务过滤、下载和写库满足逐段单调漏斗关系。
  • 所有视频保留原始 URL。
  • 所有任务可追到策略包和具体抓取单元。
  • 缺失 package_id 的数据不得静默归入默认策略包。
  • 没有真实规则级过滤事实时不得估算拆分。
  • CSV 校验结果必须由测试文件真实解析;Excel 由生产导入接口真实解析。

23.6 UI

  • 首页沿用已评审布局。
  • 桌面和移动端无页面级横向溢出。
  • 宽表格在容器内横向滚动。
  • 图表悬浮可见具体量级。
  • 策略包概览可以对比 Query 爬取与账号订阅的抓回和入库贡献。
  • 抓取详情可以在全部、Query 爬取和账号订阅之间切换。
  • Query 过滤原因默认收起。
  • 视频页不展示“可用 / 待确认”状态列。
  • 样例数据和全量数据在页面上有明确标识。

24. 上线顺序

第一阶段:数据模型与回填

  • 建策略包、Query、账号、频控事件表。
  • 回填历史 package_id
  • 打通任务和资产追踪。

第二阶段:运营查看

  • 首页
  • 策略包概览
  • 每天
  • Query / 账号
  • 视频

第三阶段:配置与发布

  • 新建策略包
  • 导入 Query / 账号
  • 草稿、发布、暂停、恢复和删除

第四阶段:动态频控

  • 低产识别
  • 自动降频和升频
  • 频控事件
  • 告警与人工覆盖

25. 产品决策摘要

  1. 策略包是唯一上层运营对象。
  2. 只有两种抓取能力:Query 爬取和账号订阅。
  3. 特定组合只负责生成 Query,不形成第三种能力。
  4. Query 或账号配置 schedule_period 后成为定时任务。
  5. 动态频控基于当次业务过滤后可入库视频量,而不是原始抓回量。
  6. Query 和账号必须绑定 package_id
  7. 页面统计以策略包为主,并允许下钻到 Query、账号、任务和视频。
  8. 不再维护产品侧“实体覆盖”概念。