开源仓库
https://gitee.com/erma0/douyin
抖音采集
花几秒钟领个支付宝红包吧~
Python
取数据 + Aria2
下载
根据抖音各种链接或各种ID,通过网页接口采集视频作品,并下载作品到本地。
支持用户主页链接或sec_uid、话题挑战和音乐原声链接或ID。
使用须知
此程序为学习Python中调用Aria2的案例,仅供参考,请勿用于非法用途。
2021.10.22测试仍能正常运行。
测试环境:Win10_x64
+ Python3.8
支持采集喜欢列表(只有部分用户可用,原因不明)
TODO
- [x] 采集用户作品
- [x] 调用Aria2下载
- [x] 话题/原声作品采集
- [x] 喜欢作品采集
- [x] 导入文件批量采集
- [x] 命令行调用
- [x]
用pywebview写界面界面写了个大概,后来没时间弄了,放弃了 - [x]
打包exe直接装个Python吧
使用
安装依赖
在程序目录打开命令行,输入
pip install -r requirements.txt
使用命令行:exec.py
直接运行可查看命令列表,或使用
-h
参数查看帮助python exec.py python exec.py download -h
可选参数
--type 指定下载类型,默认值:--type=user(采集用户作品) --limit 指定采集数量,默认值:--limit=0(采集全部)
命令行例子
采集某用户全部作品:
python exec.py download 用户主页链接或secuid
采集某用户喜欢的前10个作品:
python exec.py download 用户主页链接或secuid --type=like --limit=10
采集某音乐原声前10个作品:
python exec.py download 音乐链接或ID --type=music --limit=10
采集某话题挑战全部作品:
python exec.py download 话题挑战链接或ID --type=challenge
批量采集某文件内全部用户作品:
python exec.py download_batch 文件路径(文件内一行一个链接或id) --type=user
知识点
抖音相关
- 网页接口恢复了,一次请求即可取回数据
- UID几乎没用了,拼不成主页链接了,所有接口都是sec_uid
- signature可固定了,不用再扣JS了
- 作品中直接包含无水印视频地址了,不需要移动端UA也可跳转
- 话题/音乐作品数目
- 2021.04.02 喜欢列表也有数据了
Aria2相关
- aria2p库使用体验还不错
- 大部分Aria2下载都是通过rpc接口实现的,这个也一样
- 需要自己下载
Aria2c.exe
来开启服务,所以要用代码实现自动启动服务 若文件已存在则跳过下载的方法:
--auto-file-renaming=false
可行,但控制台使用会报错,虽然报错不影响-c
可行,且控制台不报错
- 添加下载任务时通过指定
options = {'out': filename}
指定文件名,即-d
- Aria2会根据指定路径及指定文件名自动创建下载目录
- Aria2指定路径及文件名中不能传入非法字符串(*|等),所以写了
Download.title2path
静态方法 - 监听事件要手动停止,不停止会阻塞进程,导致程序无法关闭
- 未发现实时获取任务进度及下载速度的函数,自己写了循环监听回调方法
Python相关
- 通过
os.popen
或subprocess.Popen
实现子进程打开程序,无界面,不阻塞 - 继承父类后重写init时,通过super().__init__()调用父类构造方法
- 继承父类后重写方法时,不能重写私有方法,不能读取私有成员
- 参数指定类型提示挺好用,方便调用参数的函数时自动补全
- 可通过
if 'PROGRAMFILES(X86)' in os.environ
简单判断系统是否为64位 - Pylance的自动导入依赖功能很好用,就是感觉时灵时不灵,重新开关后又可以用
- vscode默认启动路径是当前项目路径,在
launch.json
中加一句"cwd": "${fileDirname}",
即可,不过自动补全pylance就无法识别相对目录了 - 用pipreqs一键生成当前项目依赖:cmd切换到项目路径,
pipreqs ./ --encoding=utf-8 --force
命令行模块fire相关
- 最简单的方法就是直接一个fire.Fire(),暴露全部函数
- 如果用类或对象暴露,类参数需要单独指定
- 组合命令需要用不同的类,暴露的类中引入需用组合命令的类,但是在这个批量下载的场景下感觉比较繁琐,所以直接加了个参数,分两个函数来调用
UI模块pywebview相关
- 可以把一个类的实例暴露给页面js_api,通过
pywebview.api.func().then(() => {})
调用Python函数 - 也可以把Flask等服务实例暴露给页面js_api(无需url参数),在内部实现index.html
- Python中通过
window.evaluate_js('JS代码')
调用JS方法 - 在UI中,类的初始化无法传参,所以需要重新定义init
- 在UI中,需要公开的类实例方法不能以下划线
_
开头 - 创建UI时设置的窗口宽高,好像和网页中大小不一样,值需要比网页中大一些
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。