体育爬虫策略包运营平台 PRD V2.0
0. 一句话结论
平台以后只围绕策略包运营。策略包下面只有两种抓取能力:
- 爬取:最小执行单元是 Query。
- 订阅:最小执行单元是账号。
每个 Query 和账号都有自己的优先级与调度执行周期;抓取单元与周期组合后成为定时任务。系统根据每次任务通过业务过滤的有效视频量逐档升频或降频,并记录每次变化。所有抓回、去重、业务过滤、下载和写库数据最终按策略包汇总,同时可以下钻到具体 Query、账号、任务和原始视频。

1. 背景与问题
现有页面以“抓取方向”和“实体覆盖”为核心,已经能展示每日抓取、Query、视频和处理链路,但实际运营逻辑发生了变化:
- 运营真正创建和维护的是一批有共同目标的抓取配置,不需要再通过“实体”解释。
- 搜索与订阅是两种不同的抓取能力,但最终都服务同一个业务目标。
- Query 和账号的抓取价值会随时间变化,固定每天抓取会浪费任务预算。
- 现有统计容易混用品类、方向、Query 和视频,无法稳定回答“这个策略包是否有效”。
- Query、账号、任务、过滤和视频之间虽然能技术追踪,但运营无法在一个页面完成查看、判断和调整。
因此,需要把平台的业务主线收敛为:
策略包 → Query / 账号 → 调度执行周期 → 定时任务 → 抓回视频 → 规范化去重 → 业务过滤 → 下载 → 写库
2. 产品目标
2.1 业务目标
- 运营可以独立创建、查看、修改、暂停、恢复和删除策略包。
- 所有 Query 和账号必须绑定策略包,禁止出现游离数据。
- 运营可以按策略包判断抓取量、过滤损耗、入库量和入库率。
- 运营可以下钻到具体 Query 或账号,继续查看任务和原始视频。
- 系统可以根据当次有效视频量自动调整 Query 或账号的调度周期。
- 每次配置、频率变化、任务执行和过滤结果都可以追踪与复现。
2.2 用户体验目标
- 老板打开首页,可以迅速判断当前有多少策略包运行、近 7 天抓回和入库多少、哪些包需要调整。
- 运营进入策略包,可以直接看到两种能力各自贡献多少,不需要理解研发内部表结构。
- 运营查看 Query 或账号时,可以看到当前周期、优先级、下次执行和实际产出。
- 研发可以从策略包一路追到 Query/账号、任务、候选视频、过滤记录、下载和资产。
2.3 非目标
- 平台不负责自动生成 Query 文案;运营直接上传最终 Query List。
- “特定组合”不作为第三种抓取能力。组合逻辑只负责生成 Query,生成后仍进入 Query 爬取流程。
- 平台不负责定义内容品类本身;品类沿用既有四类定义。
- 本期不做跨策略包自动搬迁 Query 或账号。
- 本期不删除历史已入库视频;删除策略包只停止未来任务并移除运营配置。
3. 核心概念
3.1 策略包
策略包是一批 Query 和账号的共同业务父级,也是平台唯一的上层运营统计维度。
策略包回答四个问题:
- 这批抓取服务什么业务目标?
- 包里配置了哪些 Query 和账号?
- 这些抓取单元当前以什么频率执行?
- 最终抓回、过滤和入库效果怎么样?
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 关系结构
- 一个策略包关联一个或多个内容品类。
- 一个策略包包含零到多个 Query。
- 一个策略包包含零到多个账号。
- 一个 Query 只属于一个策略包。
- 一个账号只属于一个策略包。
- 一个 Query 或账号只有一个当前生效调度周期。
- 一个 Query 或账号可以产生多条定时任务运行记录。
- 一次任务可以抓回零到多条候选视频。
- 一条候选视频可以产生多条过滤步骤记录。
- 通过处理和下载的视频最终写入内容库资产。
4.2 强约束
package_id是 Query 和账号的必填字段。- 不允许一个 Query 或账号同时归属多个策略包。
- 需要跨策略包复用时,必须复制为新的抓取单元,并保留来源引用。
- 策略包暂停时,包内 Query 和账号全部停止创建新任务。
- 单个 Query 或账号暂停时,只影响该抓取单元。
- 已发生的任务和已入库内容不随配置删除。
5. 用户与权限
| 角色 | 查看 | 创建/编辑 | 发布 | 暂停/恢复 | 删除 | 查看技术记录 |
|---|---|---|---|---|---|---|
| 老板/管理者 | 全部 | 否 | 否 | 否 | 否 | 汇总 |
| 内容运营 | 全部业务数据 | 是 | 需权限 | 是 | 需二次确认 | 业务级 |
| 产品管理员 | 全部 | 是 | 是 | 是 | 是 | 全部 |
| 爬虫研发 | 全部 | 技术配置 | 否 | 技术急停 | 否 | 全部 |
| 数据研发 | 全部 | 统计配置 | 否 | 否 | 否 | 全部 |
6. 信息架构
6.1 首页
首页继续保留当前已经评审通过的布局:
- 核心指标
- 最近 7 天 / 今日趋势
- 品类下钻
- 品类下的策略包列表
- 内容分布
- 研发技术基建监控
首页不新增复杂概念,只把旧“抓取方向”替换为“策略包”。
6.2 策略包详情
策略包详情保留五个页签:
- 概览:策略包信息、包级漏斗、两种抓取能力和频率分布。
- 每天:日级抓回与入库、平台分布、Query 执行情况、频控变化。
- 抓取详情:按“全部、Query 爬取、账号订阅”切换,查看包内的具体 Query 和订阅账号。
- 视频:查看包内或指定 Query 抓回的视频。
- 配置:编辑策略包、导入 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 包级漏斗
概览首先展示包级运营数据:
- Query 数
- 订阅账号数
- 近 7 天抓回视频
- 近 7 天未入库总量
- 近 7 天入库视频
- 昨日入库视频
总未入库量计算:
总未入库 = 抓回视频 - 最终入库视频
总未入库包含规范化去重、业务规则淘汰、下载失败和写库失败,不能直接命名为“业务过滤掉”。
概览继续展示处理漏斗:
- 平台抓回
candidate_count - 规范化去重后
canonical_count - 业务规则通过
business_pass_count - 下载成功
download_success_count - 写入内容库
asset_write_count
当前快照缺少中间事实时,页面只能展示真实首尾值,并将中间节点标为“待接入”;禁止按比例估算。
入库率计算:
策略包入库率 = 最终入库视频 / 抓回视频
8.3 两种抓取能力
| 抓取能力 | 最小单元 | 配置量 | 运行中 | 当前周期 | 7 天抓回 | 7 天入库 | 昨日入库 | 入库率 |
|---|---|---|---|---|---|---|---|---|
| 爬取 | Query | Query 总数 | 活跃 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_idtask_id- 原始视频 List
- 按业务日汇总的抓回、过滤、入库和有结果 Query
- 按执行时间倒序的任务记录
每条任务记录展示:
- 执行时间
run_id- 抓回量
- 未入库
- 入库量
- 入库率
- 当次调度周期
- 调频结果
- 执行状态
- 本次入库视频入口
“按天”用于看趋势,“按次”用于定位一次具体执行。两者必须来自同一份 task_run 事实数据,不能分别维护口径。
10.4 详细过滤原因
每个 Query 下提供“详细过滤原因”,默认收起。
当前只在有真实数据的节点展示:平台抓回、规范化去重、业务过滤合计、最终入库。
接入 processing_result 后,再按真实处理顺序展开黑名单、游戏排除、质量、热度、语言、年份、访问和下载失败等规则级原因。每一步展示数量、占抓回量比例、rule_id 和 rule_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_idpackage_idsource_typesource_idold_schedule_periodnew_schedule_periodreason_codebusiness_pass_countrule_versiontriggered_bynext_run_atcreated_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 |
platform | 是 | YouTube / TikTok / Instagram |
priority | 是 | high / normal / low |
schedule_period | 是 | 1 / 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 |
platform | 是 | YouTube / TikTok / Instagram |
priority | 是 | high / normal / low |
schedule_period | 是 | 1 / 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_id | string | 主键 |
name | string | 策略包名称 |
description | text | 业务说明 |
owner_id | string | 负责人 |
status | enum | 生命周期状态 |
current_version_id | string | 当前版本 |
created_at | timestamp | 创建时间 |
updated_at | timestamp | 更新时间 |
deleted_at | timestamp | 软删除时间 |
15.2 策略包类目聚合
策略包本身不重复维护运动和内容类目。页面按包内 Query / 账号携带的 category_l1 / category_l2 / category_l3 聚合分布;需要加速时可以建设派生汇总表,但事实来源仍是抓取单元。
15.3 crawl_query
核心字段:
query_idpackage_idquery_textplatformcategory_l1category_l2category_l3source_typeversion_idstatus(业务身份状态快照,调度态以schedule_policy为准)deleted_at
15.4 subscription_account
核心字段:
account_idpackage_idaccount_urlaccount_nameplatformcategory_l1category_l2category_l3version_idstatus(业务身份状态快照,调度态以schedule_policy为准)deleted_at
15.5 schedule_policy
核心字段:
schedule_policy_idpackage_idsource_typesource_idprioritystatus:draft / pending / active / paused / completed / deleted / errorprevious_schedule_periodschedule_periodnext_run_atrule_versionenabledconsecutive_low_yield_runscompleted_atdeleted_atidempotency_key
同一 source_type + source_id 只允许一条当前生效策略。Query / 账号接口展示的优先级、调度周期、状态和下次执行均由本表联表读取,不在多张表上双写。
15.6 task_run
核心字段:
run_idschedule_policy_idpackage_idsource_typesource_idscheduled_atstarted_atfinished_atstatuscandidate_countcanonical_countbusiness_pass_countdownload_success_countasset_write_countschedule_period_beforeschedule_period_aftererror_coderetry_count
15.7 candidate_video
保留:
- 平台原始 ID
- 原始 URL
- 标题
- 作者
- 发布时间
- 抓回时间
package_idsource_typesource_idrun_id
15.8 processing_result
每一步一条记录:
processing_result_idrun_idcandidate_idstage_orderstagerule_idrule_versionresultreason_codeprocessed_atcreated_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_at、run_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_id、run_id、candidate_id、asset_id 和平台原始 URL。
19. 接口需求
19.1 策略包
POST /strategy-packagesGET /strategy-packagesGET /strategy-packages/{package_id}PATCH /strategy-packages/{package_id}POST /strategy-packages/{package_id}/publishPOST /strategy-packages/{package_id}/pausePOST /strategy-packages/{package_id}/resumeDELETE /strategy-packages/{package_id}
19.2 Query 与账号
POST /strategy-packages/{package_id}/queries:importPOST /strategy-packages/{package_id}/queries:validate-importGET /strategy-packages/{package_id}/queriesPATCH /queries/{query_id}GET /queries/{query_id}/task-runsPOST /strategy-packages/{package_id}/accounts:importPOST /strategy-packages/{package_id}/accounts:validate-importGET /strategy-packages/{package_id}/accountsPATCH /accounts/{account_id}GET /accounts/{account_id}/task-runsGET /imports/{batch_id}/errors
19.3 数据
GET /strategy-packages/{package_id}/metricsGET /strategy-packages/{package_id}/dailyGET /strategy-packages/{package_id}/videosGET /queries/{query_id}/videosGET /accounts/{account_id}/videosGET /queries/{query_id}/filter-breakdownGET /task-runs/{run_id}/videosGET /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 历史数据
- 为每个历史抓取方向创建
package_id。 - 为历史 Query 回填
package_id。 - 为历史账号回填
package_id。 - 为任务、候选视频和资产回填可追踪的策略包来源。
- 无法归属的记录进入“待归属”,不计入策略包效果。
- 完成率达到 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. 产品决策摘要
- 策略包是唯一上层运营对象。
- 只有两种抓取能力:Query 爬取和账号订阅。
- 特定组合只负责生成 Query,不形成第三种能力。
- Query 或账号配置
schedule_period后成为定时任务。 - 动态频控基于当次业务过滤后可入库视频量,而不是原始抓回量。
- Query 和账号必须绑定
package_id。 - 页面统计以策略包为主,并允许下钻到 Query、账号、任务和视频。
- 不再维护产品侧“实体覆盖”概念。