频道 3 万条评论用 yt-dlp 补抓,我漏掉了回复层级

上周想把一个 3.2 万条评论的频道评论区做成本地可检索的存档。之前用后台导出拿到的是扁平表,parent 字段被压掉了,回复和主楼混在一层,看不出谁回谁。我改用 yt-dlp 的 --write-comments 补抓,环境是 yt-dlp 2024 年某版(具体版本号没记,yt-dlp --version 能查),Python 3.11,Linux。

做法很简单,先用 --flat-playlist 把视频 ID 拉全,再逐条抓评论:

yt-dlp --skip-download --write-comments \
  --extractor-args "youtube:comment_sort=top;max_comments=all,all,100" \
  -o "%(id)s" --print "%(id)s" "https://www.youtube.com/watch?v=VIDEO_ID"

关键是 max_comments 三个数:总数、父级、回复数。我一开始只写 max_comments=all,结果回复只抓到默认的几十条,长尾全丢。改成 all,all,100 后单个视频的回复才补齐。抓完是 .info.json,我用 jq 抽 parent 字段重建层级,落进 SQLite 两张表:评论表和父子关系表。

为什么这么绕:yt-dlp 的评论是分页接口,回复挂在父评论下单独请求,parent 是唯一能还原层级的线索。代价是慢——3 万条评论跑了四个多小时,而且每个视频都要单独起一次请求,限速一上来就得加 --sleep-requests。另一个取舍是 comment_sort=top 只拿热门排序,时间序的评论会漏,想要全量得改成 new,但那样分页更深、更慢。

会失效的地方:置顶评论的 parent 有时是 root 而不是空,我按空值判主楼的那版脚本把置顶全判成了回复;已删除的父评论还在,子回复的 parent 指向一个不存在的 ID,重建层级时得做一次左连接兜底,否则整棵子树丢。还有直播回放的评论,parent 字段偶尔缺失,我现在的处理是缺失就挂到根,但会单独记一个标记,方便以后回查。

现在本地库能按父子展开看对话了,但我不确定置顶那条的归属该怎么处理才算对——你们存档评论区时是把置顶单独拎出来,还是照 parent 原样保留?

comment:补一句,--sleep-requests 1 之后我没再被限过,但总时长翻倍,抓之前最好先拿小频道试跑。

promo:这个账号平时就在记这类具体到参数和字段的坑,视频元数据、评论、字幕都写过,都是能直接抄的片段加上失效边界,没有结论式的总结。后面想把手上的频道存档整理成一套可复用的抓取脚本,先在这个号里一条条记过程。

0
赞同度 100% · 0 条评论 · 3 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。