# 抖音 **Repository Path**: testphpl/douyin ## Basic Information - **Project Name**: 抖音 - **Description**: 抖音爬虫,调用Aria2下载。 以及远古时期的抖音相关资料。 - **Primary Language**: Python - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: https://erma0.cn/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2021-03-29 - **Last Updated**: 2021-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 抖音采集 ## 介绍 根据抖音各种**链接**或各种**id**,通过网页接口采集用户的作品,下载作品到本地。 支持用户主页链接或用户sec_uid/话题挑战和音乐原声链接或ID ## 使用 ### 0x00 安装依赖 在程序目录打开命令行,输入 ``` pip install -r requirements.txt ``` ### 0x01 直接修改`douyin.py`中相关参数使用 1. 实例化任务对象,可指定采集类型及采集作品数量,默认为用户作品、不限数量全部采集 ``` task = Task() # 用户作品 # task = Task(type='like', limit=10) # 用户喜欢(不可用) # task = Task(type='music', limit=10) # 音乐原声 # task = Task(type='challenge', limit=10) # 话题挑战 ``` 2. 下载 1. 单个下载 ``` target = "要下载的链接或ID" task.download(target) ``` 1. 批量下载 ``` target = 'user.txt' # 文件路径 task.download_batch(target) ``` ### 0x02 从命令行使用`exec.py` 1. 直接运行可查看命令列表,或使用`-h`参数查看帮助 ``` python exec.py python exec.py -h python exec.py download -h python exec.py download_batch -h ``` 2. 使用函数名调用程序 ``` --type 指定下载类型,默认值:--type=user --limit 指定采集数量,默认值:--limit=0(不限制) ``` 例如采集某用户全部作品: ``` python exec.py download https://v.douyin.com/xxxx/ python exec.py download 用户的secuid ``` 例如采集某音乐原声前10个作品: ``` python exec.py download https://v.douyin.com/xxxx/ --type=music --limit=10 python exec.py download 音乐ID --type=music --limit=10 ``` ## TODO - [x] 采集用户作品 - [x] 调用Aria2下载 - [x] 话题/原声作品采集 - [x] ~~喜欢作品采集~~ 官方接口暂时不能用 - [x] 导入文件批量采集 - [x] 命令行调用 - [ ] 用webview写界面 - [ ] ~~打包exe~~ 不打包了,感觉直接装个Python环境更简单 ## 知识点 ### 抖音相关 - 网页接口恢复了,一次请求即可取回数据 - UID几乎没用了,拼不成主页链接了,所有接口都是sec_uid - signature可固定了,不用再扣JS了 - 作品中直接包含无水印视频地址了,不需要移动端UA也可跳转 - 话题/音乐作品数目 ### Aria2相关 - [aria2p](https://pawamoy.github.io/aria2p/)库使用体验还不错 - 大部分Aria2下载都是通过rpc接口实现的,这个也一样 - 需要自己下载`Aria2c.exe`来开启服务,所以要用代码实现自动启动服务 - 若文件已存在则跳过下载的方法: 1. `--auto-file-renaming=false` 可行,但控制台使用会报错,虽然报错不影响 2. `-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就无法识别相对目录了 ### 命令行模块fire相关 - 最简单的方法就是直接一个fire.Fire(),暴露全部函数 - 如果用类或对象暴露,类参数需要单独指定 - 组合命令需要用不同的类,暴露的类中引入需用组合命令的类,但是在这个批量下载的场景下感觉比较繁琐,所以直接加了个参数,分两个函数来调用 ## 笔记 偶然发现抖音网页的接口恢复了(不用频繁请求就有数据),就想修复一下[之前做的采集工具](https://www.52pojie.cn/thread-1143075-1-1.html),奈何代码实在是太乱了,自己看的头疼,只好[稍微改了一下就扔出去了](https://www.52pojie.cn/thread-1387094-1-1.html)。 近期也比较无聊,就打算用Python重写一版,于是就有了这篇介绍。 Python入门水平加懒癌晚期的我,从10号开始有具体想法,用了差不多3天的碎片化时间构思了程序结构(主要是了解面向对象思维),看了不少文档。 私以为自己写一个下载功能不如直接调用Aria2,毕竟功能强大且稳定,但是网上没有找到多少Python调用Aria2的示例,只好在pypi找了个还在维护的看起来不错的库([aria2p](https://pawamoy.github.io/aria2p/)),把文档翻了一遍,强行学习了一波。 我还从来没有写过类,这是第一次,对着文档和网上的各种文章,勉强按照理解写了出来。现在觉得,其实写不写类都一样能写出同样的功能,代码也差不了多少,不过函数比较多的时候,如果不用类,会比较乱(上一版易语言的就是,很长时间不看,自己再看都头疼),类的优势还有一点,就是公有属性。 面向对象编程确实有优势,先抽象化出类,再去实例化对象,代码结构一目了然,再加上继承什么的,确实很强大。 12号晚上开始敲代码,13号差不多写出来用户作品采集和下载功能,接着14号写了话题和音乐下载,同时完成了命令行。测试通过后,就不太想动了,直到今天16号,终于把介绍写出来了。界面暂时不写了,打包exe等明天后天或者大后天晚上再做。 可以说这次重新学了很多东西,不过根据过往经验,大概没几天就全忘了,没办法,就这样吧。 2021.03.16 ## 支持作者 ### 有条件的朋友请扫收款码 ![支付宝微信收款][1] ### 也可扫描下方各二维码领红包 ![红包码][2] ### 如果能帮我助力一下就更好了 1. 淘宝特价版0.1元购(新用户邀请) > 4¥xRMWXaaZ3W2¥ [点击跳转:https://m.tb.cn/h.4NLHzcz][3] 新人0.1元购 速来抢 1. 淘宝特价版帮我助力 ![淘宝特价版][4] [1]: https://erma0.cn/images/qrcode/shouqianma.png [2]: https://erma0.cn/images/qrcode/hongbao.png [3]: https://m.tb.cn/h.4NLHzcz [4]: https://erma0.cn/images/qrcode/tb.jpg