频道 1.1 万条视频,我按「时长」筛 Shorts 筛漏了一半
我一直想把频道里的短视频和正片分开归档。当时手上有 1.1 万条视频的元数据(yt-dlp 抓的 json,频道从 2019 年到今年),想当然觉得 duration <= 60 就是 Shorts,一行过滤就完事。跑完得到 4300 条,跟我肉眼估的差得远——首页明显不止这些短视频。
后来改了两步。第一步先把 duration 为空的捞出来看,有 900 多条,这些是直播回放和首播,yt-dlp 的 json 里当时没写入时长。第二步不再只看 duration,而是看页面结构里能拿到的竖屏标记:
# 只抓需要的字段,别整包 json 下来
yt-dlp --flat-playlist --print "%(id)s\t%(duration)s\t%(webpage_url)s" \
"https://www.youtube.com/@频道/videos" > list.tsv
然后对可疑的条目单独跑一次详情抓取,从返回的 json 里读 thumbnails 的宽高比和 aspect_ratio,宽高比接近 9:16 且 duration ≤ 180 的,才算进短视频候选,最后人工过一遍。为什么把阈值放到 180:我这边确实有超过 60 秒的竖屏视频,60 秒这条线是旧规则,现在不成立。
代价是慢。详情抓取是逐条请求,1.1 万条跑了几轮才完,而且限速得自己压着,别把请求打满。这一步我没法给一个「安全值」,不同网络环境不一样,我是从很低的并发试起来的。
会失效的地方:竖屏不等于 Shorts,横屏的老短视频也存在;直播回放的时长字段经常为空或者给的是「已播时长」,拿它做过滤会误判;还有一部分视频后来被重新剪辑上传,元数据对不上。我自己就踩过一条:把 2 小时的直播回放当成短视频归档了,因为 duration 是 0。
现在我的做法是先按 id 去重、再按页面结构分桶、最后人工抽检,不再指望一个字段解决。你们归档短视频时是按时长、按竖屏比例,还是有别的更稳的判据?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。