剧院演出动态每日观察
核心判断(先读这段,否则会做错方向)
日报与榜单不是产品,数据库才是。 全国约 2000 家专业剧场、约 2000 家国有文艺院团、每年数千个巡演剧目 IP——这些不需要"抓完":实体信息属于冷数据,建一次、慢慢补;真正日更的只有场次事件表。
因此永远不要:
- 先穷举院团清单或剧目 IP 清单再开始采集(中途停摆即作废)
- 把场馆名、城市、类型每天重复写进每条记录(改为外键引用)
- 追求单期条目数量堆到几十条(核验深度换数量,必然出错票价)
- 用票房/评分/上座率"估算"好看榜(白名单抓不到,必须投稿)
应当:实体库跟随事件表生长(事件驱动补全);公开信号能算的榜(最新、性价比)用算法代理,真实质量信号(口碑、票房)只走【人工投稿专区】。
四表结构
| 表 | 性质 | 作用 |
|---|---|---|
dim_venue |
冷 | 场馆主数据,含演出厅、运营方(院线)、官微入口 |
dim_troupe |
冷 | 院团主数据,含级别、剧种、属地 |
dim_show_ip |
冷 | 剧目 IP 主数据,含品类 |
fact_performance |
热(日更) | 场次事件,日报与榜单唯一数据源 |
dim_tag + fact_performance_tag |
字典 | 14 项固定标签,多对多 |
完整 DDL、字段映射、枚举字典见 @references/schema.md;四维榜单算法见 @references/ranking.md;采集白名单/配额/去重/JSONL 格式见 @references/collect-rules.md;A 层 60 家场馆池见 @references/venue-pool.md。
工作流程
1. 初始化数据库(一次性)
python scripts/init_db.py --db theater_observe.db
建表、灌 14 项标签字典、导入 A 层场馆池(60 家 + 演出厅子行)。加 --reset 重建。
2. 计算当日采集名单(每日)
python scripts/next_batch.py --date 2026-11-01 --size 30 --expand 15
按日期确定性轮转,输出当日应采的场馆清单与院线入口提示;--expand 额外给出 15 家扩展候选(基础批新作品不足 5 个时继续采,优先未覆盖城市/场馆)。同一日期多次运行结果一致,可复现。
3. 白名单采集并入库
按 @references/collect-rules.md 的白名单与配额规则检索官宣,把结果写成 JSONL(一行一条剧目),再入库:
python scripts/ingest.py --db theater_observe.db --input today.jsonl --dry-run
python scripts/ingest.py --db theater_observe.db --input today.jsonl
ingest.py 会:
- 拒绝 source_url 为空的记录(硬约束,非提示)
- 按名称自动 upsert 场馆 / 院团 / 剧目 IP,缺失实体自动建档
- 用 venue_id + ip_id + show_time 生成 dedup_key,重复入库直接跳过
- 校验枚举值(venue_type、show_category、source_type、tag),非法值拒收并报告
- 打印 accepted / rejected / skipped 汇总,逐条给出拒绝原因
JSONL 字段清单与示例见 @references/collect-rules.md(含 on_sale_date 公开开票日)。
入库后必查新作品配额:本批「新作品」(此前库中不存在的 venue_id+ip_id+show_time)必须 ≥5 个。不足时不得收工:按 @references/collect-rules.md 第 2.1 节的三路扩展顺序(新城市 → 新场馆 → 新票务平台/渠道 → 院团巡演公告)从 --expand 候选继续采集;扩两轮仍不足,才在报告头注明「全网可核验新作品仅 X 个」并附检索范围与证据。禁止用旧作品重复播报凑数。
4. 渲染日报(Markdown + 公众号版)
python scripts/render_report.py --db theater_observe.db --date 2026-11-01 \
--report-no 第3期 --out 每日观察-第3期.md --wechat
标题区固定结构(每期必须):固定主标题「剧院演出每日观察」+ 当日提炼副标题 + 期号日期行。副标题是对当日内容提炼的一句话(如「音乐会 43 台居首,17 城 114 台剧目同期开票」),脚本按类型/城市/条目数自动生成,也可用 --subtitle "..." 传入更编辑化的一句;绝不允许只出标题不出副标题。
按 @templates/report.md 渲染:固定头部口径说明 + 每条剧目一个区块 + 溯源 URL + 末尾【人工投稿专区】保持空白。加 --wechat 同时产出 每日观察-第3期.html(全内联样式,可直接全选粘贴进公众号编辑器,见 @templates/report-wechat.html)。
5. 生成四维优选榜
python scripts/rank_engine.py --db theater_observe.db --out 优选榜.md --top 3
四个维度(剧院 / 剧目 / 演员 / 观众)交叉形成四张核心榜单 + 演员维度透视:
| 榜单 | 服务维度 | 数据层 | 说明 |
|---|---|---|---|
| 🆕 最新作品榜 | 剧院/剧目 | Tier-1 | 按公开开票日降序,最新公开演出并售票 |
| 💰 性价比榜 | 剧目/演出商 | Tier-1 透明代理 | 运营性价比指数 VPI,演出商视角的盈利空间 |
| ⭐ 观众口碑榜 | 观众 | Tier-2 投稿 | 观众评分降序,无投稿显示"待投稿" |
| 🎫 票房榜 | 剧目 | Tier-2 投稿 | 票房×上座综合,无投稿显示"待投稿" |
| 🎭 演员维度透视 | 演员 | Tier-1 | 参演价值 CVI,供演员选剧目/履历参考 |
详细算法、权重、信号映射见 @references/ranking.md。
6. 生成品牌 banner(可选,发布用)
python scripts/make_brand.py --out ./brand --no 3 --date 2026-11-01
# 或用自有 logo:python scripts/make_brand.py --out ./brand --logo ./my-logo.png
产出公众号首图 banner-周X-900x383.png(七色光谱按星期切换底色 + 当日色标签),以及 favicon.ico / icon-*.png 通用图标、7天配色总览.png。依赖 Pillow;中文渲染需系统中文字体(自动探测,找不到会提示)。右上角默认用通用拱门标识,传 --logo 可换成自有 logo(白底图自动去底)。
硬约束(不可违背)
- 无溯源链接不入库:数据库层
source_url NOT NULL,脚本层二次拦截。拿不到原文链接 → 整条跳过,不生成。 - 白名单限定:剧院官网/官微、院团官方渠道、官方售票平台、巡演公告。自媒体、短视频、聚合票务站、评论区一律不采;聚合站只能当线索索引,必须回溯到官方原文才能入库。
- 禁止主观与估算:不写"待定/未知/大概/预计",缺数据直接留白。票价原文不完整时只记可确认档位,其余留白。
- Tier-2 不自动填:票房、上座率、观众评分白名单抓不到,仅【人工投稿专区】经复核后写入;无投稿时榜单显示"待投稿",AI 绝不脑补、不估算。
- 人工投稿专区 AI 完全隔离:不读取、不编辑、不填充。
- 标签只从字典取:14 项固定枚举,不发明新标签;无匹配则留空,不为凑字段硬贴。
- 每期新增 ≥5 个新作品:新作品指库中此前不存在的
venue_id+ip_id+show_time。不足时按「新城市 → 新场馆 → 新票务平台/渠道 → 院团巡演公告」逐级扩展检索,扩两轮仍不足方可在报告头注明具体数量与检索范围;禁止旧作品重复凑数、禁止降低溯源标准。 - 标题区固定:每期报告与公众号版必须是「主标题:剧院演出每日观察」+「副标题:对当日内容提炼的一句话」+「期号日期行」,缺副标题视为不合格产出。
常见错误
| 错误做法 | 后果 | 正确做法 |
|---|---|---|
| 把场馆/院团名当自由文本天天重抓 | 同一实体多种写法,无法聚合 | 外键引用 dim_venue / dim_troupe |
| 先建"全国院团大全" | 建完就过期,永远建不完 | 事件驱动补全,遇到才建档 |
| 一次跑 2000 家 | 核验被压缩,错票价错场次 | 单次 30–50 家,按日轮转 |
| 票价原文有缺字就猜 | 对外发布即事故 | 留白,或只记确定档位 |
| 用标签字段存多值 | 多标签剧目被覆盖 | 多对多关联表 |
| 用票房/评分估算榜单 | 产出"假精确"误导选戏 | 走【人工投稿专区】,无投稿标"待投稿" |
规模参考
| 层级 | 数量 | 策略 |
|---|---|---|
| 全国专业剧场 | 约 2000 家 | 实体库覆盖 10% 即可用 |
| 其中可稳定采到"官宣+票价+场次+链接" | 200–300 家 | 这就是采集上限的真实盘子 |
| 单次运行可核验 | 30–50 家 + 扩展 15 家 | 产出 ≥15 条入库,其中新作品 ≥5 条 |
| 按月轮转覆盖 | 900–1500 家次 | A+B 层两个月全量过一遍 |
A 层 60 家名单见 @references/venue-pool.md;B/C 层扩展路径见 @references/collect-rules.md。