3条命令提取抖音视频封面:douyin-downloader 封面批量下载完整教程
【免费下载链接】douyin-downloaderA practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具,去水印,支持视频、图集、合集、音乐(原声)。项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader
需要把抖音视频封面成批拿下来吗?比如给一个账号的全部作品收集封面做对比分析,或者搭一个自己的素材库——用截图的方式往往分辨率低、还带水印,根本没法用。douyin-downloader 是一个偏实用的抖音批量下载工具,默认就支持视频、图文、合集、音乐下载,把配置里的cover开关打开,它还会把每个视频的原始封面一并存盘,文件名自动带_cover后缀,一眼就能认出来。下面从装环境到批量提取封面,3条命令就能跑通。
这个工具还能顺带干什么
封面只是它的一个附属开关,主线能力其实更宽:
- 单链接直接下:粘贴
/video/、/note/(图文)、/collection/(合集)、/music/(音乐)链接都能识别,v.douyin.com短链自动解析 - 作者主页批量拉取:
post(作品)、like(点赞)、mix(合集)、music(音乐)四种模式,封面跟着每条作品一起落盘 - 无水印 + 自动挑清晰度:优先选无水印视频源,从
video.bit_rate档位里自动挑最高码率 - SQLite 去重和增量:
dy_downloader.db记录已下载的作品 ID,重复运行只补新内容,跨模式也不会重复下载同一个 aweme_id
3步跑通:安装、登录、出第一张封面
第 1 步,装环境:
git clone https://gitcode.com/GitHub_Trending/do/douyin-downloader cd douyin-downloader pip install -r requirements.txt cp config.example.yml config.yml第 2 步,拿 Cookie(批量抓主页必需要,单视频可跳过):
python -m tools.cookie_fetcher --config config.yml按提示在弹出的浏览器里登录抖音,回终端按 Enter,Cookie 会自动写进配置,不用手动复制粘贴。
第 3 步,把config.yml里的cover改成true,然后跑第一条下载命令:
python run.py -c config.yml -u "https://v.douyin.com/xxxx/" -p ./Downloaded单视频会同时产出..._cover.jpg;批量场景则把link换成https://www.douyin.com/user/xxxx主页链接、mode设为post、number.post填 50,它就把最近 50 条作品的封面按"作者名/post/日期_标题_ID/"的目录结构存下来。跑完在终端里执行find ./Downloaded -name "*_cover.jpg",能看到文件列表就说明出图了。
下载目录和数量改在哪
真正需要动的配置就 5 个,都在 config.example.yml 里:
| 配置项 | 默认值 | 改成什么、为什么 |
|---|---|---|
cover | false | 改成true,本文的主角,不开就不会存封面 |
path | ./Downloaded/ | 改成你的素材库目录,视频和封面都落在这里 |
number.post | 0(不限) | 批量场景建议填 50/100,先试小值再放大 |
thread | 5 | 并发下载数,3-8 之间比较稳 |
retry_times | 3 | 失败重试次数,按 1s/2s/5s 指数退避 |
不想改文件的话,命令行也能临时覆盖:-p ./covers改目录、-t 8改并发,优先级高于配置文件。
封面是怎么选出来的
程序拿到一条作品后,会在返回数据的video节点里按顺序找封面:先找origin_cover(原图),没有就找cover_original_scale,最后才是预览用的cover。哪个字段有值就用哪个,取它的url_list作为下载地址;图文作品没有视频封面,工具会自动回退到图集第一张图,所以图文链接也能出_cover.jpg。
for key in ("origin_cover", "cover_original_scale", "cover"): source = video.get(key) if isinstance(source, Mapping): urls = source.get("url_list") or source.get("urlList") if urls: return urls return []核心逻辑就这一小段,实现在 core/metadata.py 的extract_video_cover_urls里。
跑批前先看这4条
排查问题按顺序来:
- 只抓到 20 条左右就停了:翻页被风控。确认
browser_fallback.enabled: true且headless: false,浏览器弹窗出来后手动完成验证,别急着关窗口 - 报未登录或请求 403:Cookie 过期,重跑第 2 步的 cookie_fetcher 命令即可
- 视频下了、封面没有:检查
cover是不是还是false,默认值就是关的 - 进度条刷屏看不清:保留
progress.quiet_logs: true即可,调试时再加--show-warnings
提高成功率的经验:
- 并发别贪大,
thread放在 3-8,工具本身默认限速 2 请求/秒 - 大批量任务挑凌晨跑,白天高峰更容易触发风控
- 重复运行不用清理文件,数据库加本地文件名双重去重,天然增量
- 走代理的话填
proxy配置项,API 请求和媒体下载都会走
关键文件去哪找
- config.example.yml:全部开关和默认值,复制一份改名就能用
- core/metadata.py:封面 URL 提取逻辑,
origin_cover优先级在这里 - core/downloader_base.py:下载主流程,
_cover.jpg就是在这里保存的 - tools/cookie_fetcher.py:自动获取 Cookie,登录态失效就重跑它
- run.py:命令行入口,
-u、-p、-t都从这里生效
【免费下载链接】douyin-downloaderA practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具,去水印,支持视频、图集、合集、音乐(原声)。项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考