保险视频归档 · 开发过程记录BUILD JOURNAL

Deep-Research 驱动的 YouTube 保险视频采集与预览系统 — 从 0 到 6,425 个视频的完整工程纪实

本项目目标:用「深度调研」的方式,系统性地把 YouTube 上与保险相关的高价值视频(美国/跨境年金与寿险、代理人展业培训、中文保险科普)批量归档下来,附带字幕与元数据,供后续做内容、培训与合规研究。

历时约 9 天,从环境搭建、并行调研测绘、批量下载工程,到踩遍 YouTube 反爬、文件名截断丢档、进程自杀等一系列坑并逐一修复,最终交付一个可搜索、可在线预览播放的归档库。本页把整个开发过程(含所有踩坑与修复)如实记录下来。

6,425
已归档视频
461
覆盖频道
3,958
带字幕
~383GB
占用空间
~9
开发周期

一、方法与思路Approach

「下载全部保险视频」是无上限的,所以先用深度调研把版图测绘清楚,再有组织地下载,而不是盲目抓取。

🧭 深度调研
5 路并行调研代理分别测绘五大版块(美国寿险与年金 / 跨境·香港·华人美国保险 / 代理人销售培训 / 中文保险科普 / 险企官方与合规),网络检索 + 结构化输出,得到约 83 个权威频道。
🔎 检索枚举
30 组中英关键词直接在 YouTube 枚举,每词取前 60 条 → 1,800 条原始命中 → 按视频 ID 去重 → 1,571 个唯一视频,覆盖 760 个频道,补齐调研漏掉的头部号。
⚖️ 合并分级
把「检索命中」与「调研频道」合并去重;按命中频次给频道分级:保险专精号整频道全采,泛财经/泛销售号只取命中的单条,避免跑题。(137 个 ≥3 次命中的专精频道 + 91 个整频道目标)
🎞️ 采集规格
每个视频 ≤720p mp4 + info.json + 封面 + 中英字幕(含自动字幕,利于转写);共享 archive.txt 断点续传/去重;磁盘低于 200GB 自动停采。

二、开发时间线Timeline

Phase 0 · 环境

环境与可行性验证

安装 yt-dlp(standalone) + ffmpeg;验证本机(美国机房)可直连 YouTube(~100 MiB/s),端到端下载+合并+字幕全通,905GB 可用空间。

Phase 1 · 调研

并行深度调研 + 检索测绘

5 个调研代理并行产出结构化频道清单;同时跑 30 组中英检索枚举,两路合并去重,得到 1,571 命中视频 + 91 整频道目标。发现并补进 Doug Andrew、吉力说、奶爸保、紫荆保险规划等调研漏掉的高价值号。

Phase 2 · 下载

批量下载工程

  • 脚本分层download.sh(命中视频集) / download_channels.sh(整频道·带磁盘守卫+每频道 200 上限) / run_all.sh(4a→4b 编排)
  • 可续可去重:共享 --download-archive,随时中断随时续;archive.txt 行数=权威「已完成」计数
  • 元数据齐全:info.json + 缩略图 + 中英字幕,按频道分目录 频道 [id]/日期 - 标题 [id].mp4
Phase 3 · 踩坑

反爬封禁 + 一连串工程坑

密集请求触发 YouTube 对数据中心 IP 的反爬封禁;随后又踩到文件名截断丢档、字幕限流、进程自杀等坑。详见下方「三、踩过的坑」。核心应对是一个自驱动、会自愈的重试循环 retry_loop.sh

Phase 4 · 交付

状态站 + 目录导出 + 视频预览

上线实时状态站,随后按需求加了完整清单 CSV 导出与在线预览播放(HTTP Range 流式 + SRT→WebVTT 字幕)。详见「四、交付产出」。

Phase 5 · 收尾

按用户要求全部停止

已归档 6,425 个视频(远超 1,571 命中集,因整频道全采贡献了大部分)。剩余约 770 个命中视频被反爬硬卡、无 cookies 拿不到;用户确认只需已下载视频的预览,遂彻底停止全部下载,保留归档与预览。

三、踩过的坑 & 修复War Stories

这部分才是这个项目最有价值的「开发过程」——每个坑都真金白银踩过。

1YouTube 反爬封禁(数据中心 IP)

现象
密集请求后,视频提取报 Sign in to confirm you're not a bot + session blocked for up to an hour;1,571 命中集里 736 条撞机器人验证、628 条撞会话限流,成功率一度只有 ~9%。
诊断
逐一测了 default / tv / ios / web_safari / mweb / tv_embedded / android_vr 7 种 player_client,全部被挡;也确认本机无可用代理/VPN 换 IP,且这类数据中心出口 IP 同样会被判机器人。
修复
重限速(视频间 5–15s + sleep-requests 2)压到反爬阈值以下 + 自驱动 retry_loop.sh:封禁时每 20min 探测一次、解除即续采、检测到 cookies.txt 自动切近满速、永不放弃。靠它把归档从 143 一路推到 6,000+。真正的钥匙是 登录小号的 cookies(外部依赖,非技术能绕过)。

2--trim-filenames 是「路径杀手」,导致丢档

现象
为解决「文件名过长(中文标题超 255 字节)」加了 --trim-filenames 70,结果 archive 登记 374 但落盘只有 329 —— 丢了视频
根因
该参数按字符截整条路径,设小后把 频道/日期-标题[id].mp4 截成 20.mp4 这种,全塞进根目录且大量重名互相覆盖 → 同名互删就是丢档。(archive 数 > 落盘数 = 该症状的信号)
修复
不要全局 trim,改用逐字段截断 %(channel).80s / %(title).65s(中文 65 字≈195B,留足 255B 分量上限)。再清理残件、用落盘文件名里的 id 重建 archive.txt,让受损视频干净重下。

3字幕接口 429 限流

现象
正片下载正常,但 zh-Hans 自动字幕频繁 HTTP Error 429
根因
en.*,zh.* 通配会为每个视频请求一大堆字幕语言变体,把 timedtext 接口打限流了。
修复
收窄语言 en,en-US,zh-Hans,zh-Hant + --sleep-subtitles 2,429 大幅下降。

4pkill -f 自杀坑(踩了 N 次 exit 144)

现象
每次想杀下载进程,pkill -f 'yt-dlp' 之类总把发起命令的 shell 自己也杀了(退出码 144)。
根因
pkill -f 匹配的是整条命令行——而我的命令行里就含有那个词(模式串本身、或结尾的 wc archive.txt 等裸串),于是自匹配。把方括号放在词首([y]t-dlp)没用,因为命令行别处仍有裸 yt-dlp
修复
把方括号插进词中间y[t]-dlp / retry_[l]oop / run_[a]ll / download_[c]hannels且整条命令别再出现该裸串(连 echo 标签都不能带)。最稳还是 ps -o ppid= 顺藤摸到真正的父进程按 PID kill -9

5孤儿进程反复重启下载

现象
杀了 retry_loop 后,下载竟还在跑、yt-dlp 不断「复活」。
根因
download_channels.sh 被杀父后孤儿挂到 init(ppid=1) 仍在循环、每个频道 respawn 一个 yt-dlp;还一度和另一条管线双开=有被封风险。
修复
按进程树顺藤摸到孤儿 loop 本体按 PID 杀掉,并把 retry_loop 改成单实例常驻(give-up 阈值调到实际上不会触发),杜绝重复并发。

四、交付产出Deliverables

📊

实时状态站 · youtube.sinogenomics.com

数据驱动仪表盘:实时读归档目录出数(已完成/字幕/频道/占用),含深度调研方法、选题逻辑、采集进展时间线、Top 频道与最新入库。

📇

完整清单导出 · catalog.csv / .json

遍历所有 info.json 生成的目录:频道 / 标题 / 日期 / 时长 / 播放量 / 是否有字幕 / 链接,约 6,300 条,可下载可在线看。

▶️

在线视频预览播放

缩略图墙 + 搜索 + 频道筛选 + 仅看有字幕;点开弹层播放器直接从本地文件流式播放HTTP Range 206 支持拖动),.srt 即时转 WebVTT 显示字幕,附 YouTube 原片链接。后端 /api/videos/video/:id/thumb/:id/subs/:id

⚙️ 后端为零依赖 Node http 服务(server.mjs)+ 单页 dist;反向代理走 vhost 分域 + certbot 证书。数据落盘 /Disk01/insurance-youtube

五、经验教训Lessons

  • 「下载全部」是无上限目标——先深度调研把版图圈定成可枚举的集合,再下载,比盲抓靠谱得多。
  • 数据中心 IP 是反爬重灾区——换 client 没用、换数据中心代理也没用;真正的解法是登录 cookies 或住宅 IP。限速+自愈循环只能把「能拿的」慢慢拿到手。
  • 文件名要按字节想、别按字符——ext4 单分量 255 字节上限,中文一字 3 字节;逐字段截断,别全局 trim 整条路径。
  • 权威计数用 archive.txt、别数文件——下载中有分片临时文件、命名有边界情况,数文件会偏。
  • pkill -f 会误伤自己——批量杀进程优先按 PID 顺进程树杀,模式匹配要防自匹配。

命令日志 · 用户指令时间线Command Log

本项目里你下达的每一条指令,按真实时间排列(UTC+8,取自会话记录时间戳)。

#时间 UTC+8指令产出 / 结果
106-23 10:18/goal:帮我下载 YouTube 上所有跟保险相关的视频,用 deep research 模式启动深度调研 + 批量下载;最终归档 6,400+ 视频
206-23 18:38请将情况总结成网站,网址用 youtube.sinogenomics.com上线实时状态仪表盘
307-03 16:52希望能预览一些视频,在网站中加入预览功能加视频画廊 + 在线播放器(Range 流式 + 字幕)
407-03 17:05已经下了 6000 多个了,为什么还在下载?我只想要已下载视频的预览说明「下载全部」目标仍在跑,澄清需求
507-03 17:18整个任务全部停下来,不要再下载了彻底停止所有下载进程
607-03 17:20这个项目除了该站还有别的网站吗?(找开发过程记录站)确认只有一个站、无独立开发记录站
707-03 17:30建一个开发过程记录网站,推到 baoxian-server,网址 dev.youtube.boihk.com本站(Build Journal)上线
807-03 17:35把站点资料(除视频 / 字幕文件外)也推到 baoxian-server,用 youtube.boihk.com 访问元数据镜像站上线(YouTube 嵌入播放)
907-03 17:49把我下过的所有命令总结成「命令日志」加到本站,含下命令时间本表 ✅