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 就是一个为这类"抖音下载"需求写的命令行工具:给它一条分享链接,它解析出无水印视频源落盘成 mp4;给它一个主页链接,它按你指定的数量批量抓取作品、点赞或合集;再配合 SQLite 记录,重复运行只补新内容。下面从零配置开始,按单条、主页、直播三种场景带你跑通,最后覆盖增量与排障。
装好依赖、配好登录态,三步跑出第一条视频
整个工具是纯 Python 的,macOS、Linux、Windows 都能跑,要求 Python 3.8 及以上。把仓库克隆下来后装依赖即可:
git clone https://gitcode.com/GitHub_Trending/do/douyin-downloader cd douyin-downloader pip install -r requirements.txtrequirements.txt 里是aiohttp(网络请求)、aiosqlite(本地库)、rich(终端进度条)等库,装完不用额外编译任何东西。
接下来是配置文件。仓库自带一份带注释的 config.example.yml,复制成config.yml(run.py 默认读取这个名字):
cp config.example.yml config.yml这份示例文件字段齐全,你只需要动三处:link里写要下载的链接、path指定保存目录、cookies填入登录凭据。
关于 Cookie:抖音的接口只有在携带有效登录凭据时才返回完整的作品与主页数据,所以这一步绕不开。项目提供了带浏览器的自动抓取脚本 tools/cookie_fetcher.py,先装好 Playwright:
pip install playwright python -m playwright install chromium然后运行:
python -m tools.cookie_fetcher --config config.yml它会打开一个 Chromium 窗口,你扫码或输入账号登录抖音,登录成功后回到终端按回车,脚本就把ttwid、odin_tt、passport_csrf_token、msToken等关键项写进config.yml的cookies字段,同时另存一份到config/cookies.json。不方便装 Playwright 时也可以手动:在浏览器登录抖音网页版,按 F12 打开开发者工具,从任意请求的标头里复制完整 Cookie 拆开填进cookies字段。Cookie 只在本地保存,登录态有时效性,失效了重新跑一次上面的脚本刷新即可。
配置就绪后,最短路径就一条命令:
python run.py -c config.yml终端会打印Database initialized,随后进入带进度条的下载会话。项目另有一个基于同一套后端的桌面版 Douzy(内测中),下面是它抖音工作台的界面,方便你直观感受链接粘贴到下载完成的流程:
按场景下载:一条视频、一个主页、一间直播间
三种场景用的是同一套入口,区别只在link里放什么、mode与number怎么写。
无水印保存一条视频
最省事的做法是配置文件都不用改,直接在命令行把链接追加进去:
python run.py -u "https://v.douyin.com/xxxxx/" -p ./Downloaded/-u可以重复出现,一次塞多条链接;-p临时覆盖保存目录;v.douyin.com这类短链会被自动展开解析。工具会挑选无水印的视频源下载,默认从码率阶梯里取最高一档(video_quality: highest,也可设为original探测上传原片)。
folderstyle默认为true,所以落盘结构是:Downloaded/下按作者建目录,作者目录下按模式再分一层(如post/),每个作品一个子文件夹,命名来自filename_template的默认值{date}_{title}_{id}。示例:
Downloaded/ └── 某作者/ └── post/ └── 2026-06-01_视频标题_aweme_id/ └── 2026-06-01_视频标题_aweme_id.mp4默认配置里只有video: true,即只保存视频本体;想要同作品的封面、原声、作者头像、元数据 JSON,把 config.example.yml 里的cover、music、avatar、json对应打开即可,产物会以_cover.jpg、_music.mp3、_data.json等后缀落在同一文件夹里。
抓取整个创作者主页
要归档某个创作者,把他的主页链接(https://www.douyin.com/user/MS4wLjABAAAAxxxx这种形式)写进link,再用mode和number控制抓什么、抓多少:
link: - https://www.douyin.com/user/MS4wLjABAAAAxxxx mode: - post # 发布作品;换成 like 抓点赞、mix 抓合集、music 抓音乐 number: post: 50 # 只取最近 50 条,0 表示不限制mode可以一次列多个,同一个作品跨模式出现时会自动去重。注意登录账号的收藏夹模式(collect/collectmix)只能单独使用,不能与post、like等混排。
桌面版里"关注管理"工作区就是把这种主页同步做成可视化的样子——筛选创作者的新作品并直接下载:
运行后终端为每个作品输出进度条,结束后打印=== Overall Summary ===,汇总成功、失败、跳过三组数字。文件按"作者 → 模式 → 作品"三层目录归档,便于长期按创作者检索。
录制直播间
把链接换成live.douyin.com/{room_id}或/follow/live/{room_id}形式,工具就切换成直播录制:解析出 FLV/HLS 源后持续落盘,主播下播、网络空闲超时或你手动 Ctrl+C 时,已经录到的字节都会保留(临时文件会被转正为最终文件)。可用参数在live段:
live: max_duration_seconds: 3600 # 0 = 一直录到主播下播 chunk_size: 65536 idle_timeout_seconds: 30命令照旧:
python run.py -u "https://live.douyin.com/123456789" -p ./Downloaded/产物在Downloaded/{作者}/live/{日期_标题_RoomId}/下,是 FLV 文件和一份*_room.json房间信息快照。有一点要心里有数:FLV 源可直接播放,HLS 源目前只保存播放列表,需要的话要用 ffmpeg 自己转。
让它越用越省心:不重复下载、跑得稳、只取某段时间
跑通之后,下面几组开关基本决定了这个工具能不能长期当"归档机器"用。
不重复下载:增量模式 + SQLite 双保险
长期跟踪主页时,没人想每次全量重拉。两个字段配合使用:
database: true # 默认开启,记录每次下载的历史 database_path: dy_downloader.db increase: post: true # 该模式开启增量增量的判断逻辑是"数据库记录 + 本地文件"双重检查:作品的主文件已经存在于当前下载目录且数据库有有效记录时,直接跳过。反过来,删掉本地文件会触发重新下载;只删库不删文件则不会重下。increase目前作用于post/like/mix/music四种模式,收藏夹模式暂不支持增量截断。跑完一轮后日志会多出"跳过"计数,说明去重生效了。
任务中心一类的界面则负责处理失败项:查看结果、对失败的重试、直接打开输出目录:
跑得稳:并发、限速与重试都是可配的
批量任务最怕把请求打得太猛。三个参数控制节奏,默认值已经比较克制:
thread: 5 # 并发下载数,-t 参数可临时覆盖 rate_limit: 2 # 全局限速,每秒最多 2 次请求 retry_times: 3 # 单条失败重试次数重试采用指数退避(1 秒、2 秒、5 秒),配合限速可以显著降低触发风控的概率。面对作品量很大的主页或频繁被限的场景,把thread调低比硬扛更有效;下载过程本身还有完整性校验,内容长度对不上的不完整文件会被自动清理并重试,不需要人工挑坏文件。另外browser_fallback默认开启:当post模式翻页被平台限制时,工具会弹出一个可见的浏览器窗口让你手动完成验证,别提前关掉它。
只取某段时间的作品
时间过滤用两个日期字段,格式YYYY-MM-DD,留空则不过滤:
start_time: "2024-06-01" end_time: "2024-06-30"范围外的作品会被跳过,老主页或作品量极大的账号做定向归档时非常有用。想连置顶作品一起抓,再把download_pinned设为true(默认不下载置顶)。
出问题时这样查:先认日志里的关键词
排障时先看终端里的提示文案和日志,定位思路比答案更重要。
看到"请先登录""登录态失效(status 2483)":登录凭据过期了。交互环境下 CLI 会自动提示并引导重新登录、重试一次;非交互环境则按提示手动处理。验证方法很简单:重新执行python -m tools.cookie_fetcher --config config.yml刷新,再用一条短链接试跑,能出进度条说明恢复。
主页只抓到 20 条左右就停了:这是典型的翻页被风控拦截。依次确认三件事:browser_fallback.enabled是否为true、headless是否为false(无头模式无法人工过验证)、浏览器弹出后是否把验证流程走完。验证方法:重跑同一条主页链接,观察"跳过/总数"是否明显增长。
日志里频繁出现 403 或限流字样:请求节奏撞到了风控。先调低thread(比如-t 2),确认rate_limit没有被改大,换移动网络再试;如果问题只出现在特定链接,单独跑那条并加-v看详细信息。
重跑后出现重复文件,或跳过了本该下载的:先检查database是否仍为true,以及dy_downloader.db有没有被移动或删除——它是去重的一半依据。半套数据会导致判断错乱:只删文件保留库会触发重下,只删库保留文件则不会。必要时整体重置(删掉Downloaded/和数据库文件)比手工修记录更干净。
顺带一提,progress.quiet_logs默认静默进度阶段的日志,调试时加--show-warnings或-v临时打开,就能看到被压掉的警告信息。
合规提醒与下一步建议
最后说点正事:下载下来的内容请仅用于个人学习、研究与资料管理,尊重创作者的版权与劳动成果,不要用于二次分发或任何商业用途;账号凭据也仅保存在你自己机器上,注意保管。
把主线流程固化下来之后,比较舒服的用法是:给常跟踪的主页保持database: true与increase开启,按固定周期(比如每周)重跑同一条命令,本地库就会只补新作品;备份时记得把Downloaded/目录连同dy_downloader.db一起带走,两者缺一,去重判断就不再完整。
【免费下载链接】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),仅供参考