feat: add zero-argument douyin target detection

This commit is contained in:
2026-04-20 10:11:34 +08:00
parent d910d6f6b9
commit 84bcc4ac71
14 changed files with 1512 additions and 45 deletions
@@ -2,7 +2,7 @@
## Goal
在现有“登录浏览器后附着抓取”的基础上,扩展为支持更明确的目标选择能力,使系统不仅能抓默认博主主页,还能:
在现有“登录浏览器后附着抓取”的基础上,扩展为支持更明确、但尽量少参数的目标选择能力,使系统不仅能抓默认博主主页,还能:
- 指定某个博主主页进行抓取
- 直接抓当前浏览器里正在查看的博主主页
@@ -24,15 +24,19 @@
## Target Modes
新版本必须同时支持以下三种目标模式
从实现视角看,新版本仍需同时支持以下三种目标模式;但默认用户交互应尽量自动判断,不要求用户每次显式传模式参数。
### 1. `creator-url`
用户显式传入某个博主主页 URL,系统以该博主主页为目标进行抓取。
### 2. `current-creator`
### 2. `current-page`
系统直接读取当前已附着浏览器正在查看的页面。如果当前页面是博主主页,则以该页面为目标进行抓取。
系统直接读取当前已附着浏览器当前活动标签页正在查看的页面:
- 如果当前页面是博主主页,则以该页面为目标进行抓取
- 如果当前页面是单视频页,则按单视频方式抓取
- 如果当前页面不是支持的抖音页面,则提示用户手动传入链接或 `aweme_id`
### 3. `single-video`
@@ -75,20 +79,33 @@
登录完成后,再运行抓取命令。
未来命令行接口应支持显式目标模式,例如
默认抓取命令应尽量零参数
```bash
./.venv/bin/python Douyin.py --mode creator-url --target "https://www.douyin.com/user/..."
./.venv/bin/python Douyin.py --mode current-creator
./.venv/bin/python Douyin.py --mode single-video --target "https://www.douyin.com/video/..."
./.venv/bin/python Douyin.py --mode single-video --target "7619989983668240802"
./.venv/bin/python Douyin.py
```
上面只是推荐交互形态,具体参数名可在实现设计阶段微调,但必须满足以下原则
其推荐行为为
- 模式必须显式可区分
- “当前浏览器页面”与“传入 URL”不能混淆
- 单视频目标与博主目标不能混淆
- 默认附着已启动的登录浏览器
- 默认读取当前活动标签页 URL
- 自动判断当前页是博主主页还是单视频页
- 若当前页不是支持页面,则报错并提示用户手动传入链接或 `aweme_id`
同时系统必须保留一个简单的手动兜底入口,例如单个位置参数:
```bash
./.venv/bin/python Douyin.py "https://www.douyin.com/user/..."
./.venv/bin/python Douyin.py "https://www.douyin.com/video/..."
./.venv/bin/python Douyin.py "7619989983668240802"
```
具体参数名可在实现设计阶段微调,但必须满足以下原则:
- 默认路径应尽量不需要复杂参数
- “当前浏览器页面自动判断”与“手动传入目标”不能混淆
- 单视频目标与博主目标在内部逻辑上不能混淆
- 用户一旦需要手动兜底,输入形式应尽量简单
## Functional Requirements
@@ -102,15 +119,16 @@
- 浏览器打开或切换到该 URL
- 系统只抓当前页面已加载的作品
### Requirement B: Current Browser Creator Crawling
### Requirement B: Current Browser Page Auto Detection
系统必须允许用户不手输目标 URL,而是直接当前浏览器页面对应的博主主页
系统必须允许用户不手输目标 URL,而是直接当前已附着浏览器的活动标签页进行自动判断
完成条件:
- 系统能读取当前浏览器页 URL
- 系统能读取当前浏览器活动标签页 URL
- 若当前页面是博主主页,则正常抓取
- 若当前页面不是博主主页,则明确报错并退出
- 若当前页面是单视频页,则按单视频逻辑抓取
- 若当前页面不是支持的抖音页面,则明确报错,并提示用户手动传链接或 `aweme_id`
### Requirement C: Single Video Download
@@ -138,7 +156,7 @@
### Current Creator Errors
- 当前页面不是博主主页:报错并退出
- 当前页面不是受支持的抖音博主页或单视频页:报错并提示手动传链接或 `aweme_id`
- 当前页面虽然像博主页,但未加载出可用作品数据:提示用户先完成页面操作后重试
### Single Video Errors
@@ -195,21 +213,23 @@
至少覆盖以下测试:
- `creator-url` 模式下,合法博主主页 URL 能被识别并生成正确抓取目标
- `current-creator` 模式下,当前页面是博主主页时可抓取
- `current-creator` 模式下,当前页面不是博主主页时明确报错
- 默认零参数模式下,当前页面是博主主页时可抓取
- 默认零参数模式下,当前页面是单视频页时可抓取
- 默认零参数模式下,当前页面不是支持页面时明确报错并提示手动输入
- `single-video` 模式支持视频 URL
- `single-video` 模式支持 `aweme_id`
- 创作者抓取默认只处理当前已加载内容,不自动继续翻页
- 目标模式错误时的报错路径
- 手动输入目标无法识别时的报错路径
- 浏览器端口不可用时的报错路径
## Acceptance Criteria
需求完成后,应满足以下验收标准:
1. 用户可以显式指定博主主页 URL 抓取
2. 用户可以直接抓当前浏览器中的博主主
3. 用户可以指定单个视频 URL 或 `aweme_id` 下载单条视频
1. 用户在最常见场景下可以直接执行 `./.venv/bin/python Douyin.py`
2. 系统可以自动识别当前浏览器活动标签页是博主主页还是单视频
3. 用户可以手动指定博主主页 URL、单视频 URL 或 `aweme_id`
4. 当目标是博主时,默认只抓当前页面已加载作品
5. 关键失败场景都有明确报错
6. 实现过程遵循 TDD,并有对应自动化测试覆盖
5. 当前页面不受支持时,系统会明确提示手动传入链接或 `aweme_id`
6. 关键失败场景都有明确报错
7. 实现过程遵循 TDD,并有对应自动化测试覆盖
@@ -0,0 +1,196 @@
# README And Beginner Guide Requirements
## Goal
为当前抖音视频爬取项目补齐两层面向用户的文档,使一个不懂代码的 Mac 用户也能按照步骤执行,并最终成功下载出抖音视频。
本次文档需求包含两部分:
- 仓库根目录的 `README.md`
- `externaldocs/` 下的详细图文操作手册
本需求文档只定义文档目标、范围、结构、截图策略和约束,不直接修改实现代码。
## Target Audience
目标读者是:
- 使用 macOS 的用户
- 不懂代码
- 不熟悉 Python
- 不熟悉虚拟环境
- 但已经把项目放到了本地机器上
本次文档不负责指导用户如何 `git clone` 或下载项目源码到本地。
## Documentation Strategy
采用双层文档结构:
### 1. Root `README.md`
`README.md` 作为导航版首页,职责是:
- 简要说明项目是什么
- 说明项目能做什么
- 说明项目不能做什么
- 告诉用户从哪里开始
- 引导用户查看详细图文手册
`README.md` 不承担完整教学职责,不写成超长操作文档。
### 2. Detailed Guide In `externaldocs/`
详细图文手册作为主操作文档,职责是:
- 面向完全不会代码的用户
- 从环境准备开始写
- 一步一步带到成功下载出视频
- 给出执行命令、预期结果和失败时的处理方式
## Scope
### Included
详细图文手册必须覆盖以下内容:
1. 项目简介
2. 使用前准备
3. 如何确认本机已安装 Python
4. 如何打开终端
5. 如何进入项目目录
6. 如何创建或使用虚拟环境
7. 如何安装依赖
8. 如何启动登录浏览器
9. 如何在浏览器中完成抖音登录和验证码
10. 如何运行抓取命令
11. 如何确认抓取成功
12. 下载结果保存在哪里
13. 常见错误及处理办法
### Excluded
本次文档明确不包含以下内容:
- 如何从远端拉取项目代码到本地
- Git 基础教学
- 任意网页抓取教学
- 非 Mac 平台的安装说明
- 抖音接口原理深度分析
## README Requirements
`README.md` 必须满足以下要求:
1. 用非技术语言介绍项目用途
2. 明确说明这是一个“登录浏览器后附着抓取”的工具
3. 简短说明当前项目的主要能力
4. 简短说明当前项目的限制
5. 提供“最快开始”入口
6. 链接到 `externaldocs/` 下的详细图文手册
### Recommended README Sections
- 项目简介
- 适用人群
- 当前支持的能力
- 快速开始
- 详细使用说明
- 常见注意事项
## Detailed Guide Requirements
详细图文手册必须写成严格的步骤式说明,适合完全不会代码的读者照做。
### Writing Style
- 不使用不必要术语
- 每一步只做一件事
- 每一步都给出要执行的命令
- 每一步都给出“执行后应该看到什么”
- 若这一步常见失败,则紧跟“如果失败怎么办”
### Required Workflow Coverage
详细手册必须按以下顺序组织主流程:
1. 确认 Python 是否已安装
2. 打开终端
3. 进入项目目录
4. 创建或启用虚拟环境
5. 安装依赖
6. 启动登录浏览器
7. 在浏览器中完成抖音登录
8. 运行抓取命令
9. 查看终端成功提示
10. 在本地查看下载出来的 mp4 文件
## Screenshot Strategy
本次截图必须重新拍摄,不直接复用旧图。
### Principles
- 只截关键步骤
- 每张图只服务一个步骤
- 截图内容要与最终文档步骤严格一致
- 优先保证“能照着做”,而不是“图多”
### Required Screenshot Topics
至少应考虑覆盖以下截图:
1. 项目目录结构
2. 打开终端并进入项目目录
3. 安装依赖命令
4. 运行 `login_douyin.py`
5. 浏览器登录后的状态
6. 运行抓取命令
7. 成功下载后的 `video/` 目录
### Screenshot Placement
- `README.md` 只放少量必要截图或不放截图
- 主要截图集中放在详细图文手册中
## Success Signals In The Guide
文档里必须明确告诉用户如何判断是否成功,至少包括:
- 终端中会出现哪些关键信息
- 抓取完成后会看到哪些成功提示
- 本地哪个目录里能看到下载结果
- 下载出的文件是什么格式
## Common Error Handling
详细图文手册必须包含至少以下常见错误的处理建议:
1. 系统找不到 `python``.venv`
2. 依赖安装失败
3. Chrome 调试端口未就绪
4. 抖音登录未完成或验证码未通过
5. 运行抓取后没有下载出视频
6. 看不到 `video/` 目录或目录为空
## TDD Constraint
本次文档需求本身不要求用 TDD 编写文档。
但如果为了让文档步骤成立而需要修改代码,则后续代码改动必须遵循 TDD:
1. 先写失败测试
2. 确认测试因功能未实现而失败
3. 再写最小实现让测试通过
4. 最后再重构
## Acceptance Criteria
该需求完成后,应满足以下标准:
1. 仓库首页有清晰的 `README.md`
2. `README.md` 能让用户快速理解项目并找到详细手册
3. `externaldocs/` 下存在一份完整的面向小白的图文操作手册
4. 一个不会代码的 Mac 用户可以按手册独立完成操作
5. 手册能从环境准备一路带到视频下载成功
6. 手册包含关键截图、预期结果和常见错误处理
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 KiB

+329
View File
@@ -0,0 +1,329 @@
# 抖音视频下载小白图文手册
> 适用人群:Mac 用户、项目已经在本地、不会代码也可以照着做。
## 这份手册能帮你做什么
照着这份手册执行,你可以完成下面这件事:
- 打开项目
- 安装运行所需环境
- 登录抖音
- 启动抓取
- 在本地找到下载好的 mp4 视频
## 你开始前要知道的事
这个项目不是“自动登录”的。
你需要自己在浏览器里完成:
- 登录抖音账号
- 验证码
脚本负责做的是:
- 打开浏览器
- 连接到浏览器
- 读取当前浏览器页面里的作品数据
- 下载视频文件
## 第 1 步:确认 Mac 上已经安装了 Python
打开“终端”应用。
在终端里输入下面的命令:
```bash
python3 --version
```
你应该看到类似这样的结果:
```text
Python 3.11.0
```
如果你看到了版本号,说明可以继续。
如果提示找不到 `python3`
- 先安装 Python 3
- 安装完成后重新执行上面的命令
## 第 2 步:进入项目目录
假设你的项目放在桌面目录下,那么在终端里输入:
```bash
cd ~/Desktop/MiaoSi/Study/douyin-crawler-poc
```
你也可以把上面的路径换成你自己的项目路径。
然后输入:
```bash
pwd
```
如果输出结果里能看到 `douyin-crawler-poc`,说明你已经进入了正确目录。
## 第 3 步:创建虚拟环境
在项目目录里执行:
```bash
python3 -m venv .venv
```
这个命令的作用是:
- 给当前项目准备一个独立的 Python 运行环境
- 避免你的系统里其他 Python 包互相影响
如果这一步没有报错,就继续下一步。
## 第 4 步:激活虚拟环境
在终端里执行:
```bash
source .venv/bin/activate
```
成功后,你会看到终端左边通常多出一个类似 `.venv` 的提示。
如果你没有看到,也不用太紧张,只要命令没有报错,也通常可以继续。
## 第 5 步:安装依赖
在终端里执行:
```bash
pip install requests DrissionPage
```
如果安装成功,终端会显示若干 `Successfully installed` 或安装完成信息。
如果安装失败,常见处理方式:
- 检查网络是否可用
- 确认前一步虚拟环境已经激活
- 再执行一次命令
## 第 6 步:启动登录浏览器
在终端里执行:
```bash
./.venv/bin/python login_douyin.py
```
如果成功,你会看到类似提示:
```text
[INFO] Chrome 已启动。请在打开的浏览器中完成抖音登录和验证码。
```
这一步会做两件事:
- 打开一个新的 Chrome 浏览器窗口
- 给后面的抓取脚本准备调试端口
如果这一步失败,常见原因是:
- Chrome 没有安装
- 调试端口没能准备好
## 第 7 步:在浏览器里登录抖音
浏览器打开后,请你自己完成:
- 登录抖音账号
- 完成验证码
- 确认你已经进入想抓取的页面
这个页面可以是:
- 某个博主主页
- 某个单独视频页面
建议此时先不要关闭这个浏览器窗口。
## 第 8 步:运行抓取命令
回到终端,执行:
```bash
./.venv/bin/python Douyin.py
```
这条命令的意思是:
- 附着到刚才打开的浏览器
- 自动读取你当前打开的页面
- 如果当前页是博主主页,就下载当前已加载的视频
- 如果当前页是单视频页,就只下载这一条视频
如果自动判断失败,或者你不想切换浏览器页面,也可以手动传一个目标:
```bash
./.venv/bin/python Douyin.py "https://www.douyin.com/user/你的博主主页"
./.venv/bin/python Douyin.py "https://www.douyin.com/video/某个视频ID"
./.venv/bin/python Douyin.py "7619989983668240802"
```
## 第 9 步:判断是否抓取成功
抓取成功时,终端一般会看到类似输出:
```text
[INFO] 正在处理第 1 页
[OK] 已保存: video/某个视频标题-1234567890.mp4
[INFO] 处理结束,共下载 18 个视频。
```
如果你当前打开的是单视频页,也可能看到类似:
```text
[OK] 已保存: video/某个视频标题-1234567890.mp4
[INFO] 处理结束,共下载 1 个视频。
```
其中最关键的是:
- 出现 `[OK] 已保存`
- 最后一行出现 `处理结束`
如果看到这些内容,说明视频已经成功下载。
## 第 10 步:去本地查看下载好的视频
下载成功后,视频会保存在项目目录下的:
```text
video/
```
你可以用以下任一方式查看:
- 在 Finder 里打开项目目录,进入 `video/`
- 在 VS Code 左侧资源管理器中打开 `video/`
- 在终端里执行 `ls video`
视频文件格式是:
```text
.mp4
```
## 常见问题
### 1. 终端提示找不到 `python3`
说明你的 Mac 还没有安装可用的 Python 3。
先安装 Python 3,再重新执行:
```bash
python3 --version
```
### 2. 终端提示找不到 `.venv`
说明你还没有成功创建虚拟环境。
请先执行:
```bash
python3 -m venv .venv
```
然后再执行:
```bash
source .venv/bin/activate
```
### 3. 启动浏览器后提示调试端口未就绪
常见处理方法:
- 先确认 Chrome 已正常打开
- 不要立即关闭浏览器
- 重新运行 `login_douyin.py`
### 4. 运行抓取命令后提示无法连接浏览器
说明抓取脚本没有连上登录浏览器。
请按顺序重试:
1. 重新执行 `./.venv/bin/python login_douyin.py`
2. 确认浏览器保持打开
3. 再执行 `./.venv/bin/python Douyin.py`
### 5. 登录后还是没有下载出视频
可能原因:
- 你还没有真正登录成功
- 验证码还没完全通过
- 当前页面不是作品页
- 当前页面没有加载出作品数据
建议:
- 先确认浏览器里已经能正常看到博主主页和作品
- 再重新执行抓取命令
### 6. 我看不到 `video/` 文件夹
先在终端执行:
```bash
ls video
```
如果这里能看到很多 `.mp4` 文件,说明视频已经下载成功。
如果 VS Code 左侧看不到 `video/`,请刷新资源管理器。
## 建议你第一次就这样操作
把下面这几条命令按顺序执行:
```bash
cd ~/Desktop/MiaoSi/Study/douyin-crawler-poc
python3 -m venv .venv
source .venv/bin/activate
pip install requests DrissionPage
./.venv/bin/python login_douyin.py
./.venv/bin/python Douyin.py
```
## 附:当前项目的实际工作方式
当前版本的逻辑是:
- 默认读取当前浏览器页面
- 如果当前页是博主主页,就监听该页面的作品列表接口
- 如果当前页是单视频页,就下载这一条视频
- 传入链接或 `aweme_id` 时,也可以按指定目标抓取
所以它更适合抓:
- 博主主页当前页面里已经能看到的作品
- 当前打开的单视频页面
而不是:
- 自动抓完整个博主所有历史视频
- 抓任意网页
## 进一步阅读
- [README 首页说明](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/README.md)
- [当前项目需求说明](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/externaldocs/2026-04-17-readme-and-beginner-guide-requirements.md)
- [定向抓取后续需求](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/externaldocs/2026-04-17-douyin-targeted-crawling-requirements.md)