Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手把手教你抖音系列视频批量下载器开发

手把手教你抖音系列视频批量下载器开发

作者头像
Python进阶者
发布于 2022-03-10 07:51:39
发布于 2022-03-10 07:51:39
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

📢博客主页:https://blog.csdn.net/as604049322 📢本文由 小小明-代码实体 原创,首发于 CSDN🙉 📢未来很长,值得我们全力奔赴更美好的生活✨

程序使用演示

大家好,我是小小明。这里开发了一个抖音视频下载器,打开效果如下:

如果本地的谷歌游览器之前从来没有访问过抖音主页,点击开始下载按钮会有如下输出:

此时我们只需要点击 访问抖音主页,程序则会使用本地的谷歌游览器访问抖音主页。再次点击下载按钮:

可以看到该视频是一个合集视频:

那么程序只需要勾选第一个选项即可下载整个合集:

这样一次性就将整个合集都下载下来了:

开发流程

首先根据上一篇文章:提取谷歌游览器Cookie的五重境界

读取谷歌游览器安装的位置和本地抖音相关的cookie:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
__time__ = '2022/1/23'

import base64
import json
import os
import sqlite3
import winreg

import win32crypt
from cryptography.hazmat.primitives.ciphers.aead import AESGCM


def load_local_key(localStateFilePath):
    "读取chrome保存在json文件中的key再进行base64解码和DPAPI解密得到真实的AESGCM key"
    with open(localStateFilePath, encoding='u8') as f:
        encrypted_key = json.load(f)['os_crypt']['encrypted_key']
    encrypted_key_with_header = base64.b64decode(encrypted_key)
    encrypted_key = encrypted_key_with_header[5:]
    key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
    return key


def decrypt_value(key, data):
    "AESGCM解密"
    nonce, cipherbytes = data[3:15], data[15:]
    aesgcm = AESGCM(key)
    plaintext = aesgcm.decrypt(nonce, cipherbytes, None).decode('u8')
    return plaintext


def fetch_host_cookie(host):
    "获取指定域名下的所有cookie"
    userDataDir = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data'
    localStateFilePath = userDataDir + r'\Local State'
    cookiepath = userDataDir + r'\Default\Cookies'
    # 97版本已经将Cookies移动到Network目录下
    if not os.path.exists(cookiepath) or os.stat(cookiepath).st_size == 0:
        cookiepath = userDataDir + r'\Default\Network\Cookies'
    # print(cookiepath)
    sql = f"select name,encrypted_value from cookies where host_key like '%.{host}'"
    cookies = {}
    key = load_local_key(localStateFilePath)
    with sqlite3.connect(cookiepath) as conn:
        cu = conn.cursor()
        for name, encrypted_value in cu.execute(sql).fetchall():
            cookies[name] = decrypt_value(key, encrypted_value)
    return cookies


def get_chrome_path():
    try:
        key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r"ChromeHTML\Application")
        path = winreg.QueryValueEx(key, "ApplicationIcon")[0]
        chrome_path = path[:path.rfind(",")]
        return chrome_path
    except FileNotFoundError as e:
        return


if __name__ == '__main__':
    print(fetch_host_cookie("douyin.com"))
    print(get_chrome_path())

有了这个工具类,我们就不再需要使用selenium。

然后是视频解析的核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_video_url(url, cookies):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
        "referer": "https://www.douyin.com"
    }
    res = requests.get(url, headers=headers, cookies=cookies)
    if res.status_code == 200:
        RENDER_DATA, = re.findall(
            r'<script id="RENDER_DATA" type="application/json">([^<>]+)</script>', res.text)
        data = json.loads(unquote(RENDER_DATA))
        key = '8' if url.find("collection") != -1 else '34'
        try:
            detail = data[key]['aweme']['detail']
            title = detail['desc']
        except Exception as e:
            print(f"{url}无效,报错的key:", e)
            return
        if not title:
            title, = re.findall("<title[^>]+>\s*([^>]+)\s*</title>", res.text)
        video_url = urljoin(url, detail['video']['playApi'])
        collection_urls = set(re.findall("//www.douyin.com/collection/\d+/\d+", res.text))
        collection_urls = [urljoin("https://www.douyin.com", url) for url in collection_urls]
        collection_urls.sort(key=lambda s: int(s[s.rfind("/") + 1:]))

        collection_title = re.findall("<h2 [^>]+>([^<>]+)</h2>", res.text)[0]
        return video_url, title, collection_urls, collection_title
    else:
        print('视频链接请求失败!!!')

视频下载的核心代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def download_video(video_url, title, folder):
    start_time = time.time()
    res = requests.get(url=video_url, stream=True)
    done_size, total = 0, int(res.headers['content-length'])
    chunk_size = 1024 * 1024
    title = format_filename(title)
    file_size = round(int(res.headers['content-length']) / 1024 / 1024, 2)
    basename = f"{title}.mp4"
    filename = f"{folder}/{title}.mp4"
    if os.path.exists(filename):
        print(basename, "已存在,跳过...")
        return
    print("-----------------------------------")
    print(f'开始下载文件:{basename}\n当前文件大小:{file_size}MB')
    with open(filename, 'wb') as f:
        for chunk in res.iter_content(chunk_size):
            f.write(chunk)
            done_size += len(chunk)
            cost_time = time.time() - start_time
            yield done_size, cost_time, total
            # print(f"进度:{done_size / total:.2%},{done_size / cost_time / 1024 / 1024:.2f}MB/s")
    cost_time = time.time() - start_time
    print(f'文件:{basename} 下载完成!\n耗时:{cost_time:0.2f} 秒')

关于视频链接的分析,大家可以参考才哥的文章: 《用Python搞定抖X无水印短视频下载》 链接:https://mp.weixin.qq.com/s/NNVT6IH6dpT0rTeu1-oD6w

UI界面设计核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layout = [
    [sg.Text('抖音视频地址:', font=("楷体", 12)),
     sg.In(key='url', size=(70, 1), text_color="#bb8b59",
           default_text="https://www.douyin.com/video/6803929443069988103")],
    [sg.Checkbox('如果是一个合集则下载整个合集', key="download_collection", default=False),
     sg.Button('开始下载'),
     sg.Button('清空输出'),
     sg.Button('访问抖音主页'),
     sg.Button('访问当前地址'),
     ],
    [sg.Output(size=(85, 10), key="out", text_color="#15d36a")],
    [
        sg.ProgressBar(1000, size=(20, 20), key='video_bar', bar_color=("#bb8b59", "#295273")),
        sg.Text('000.0MB,00/00\n00:00<00:00', key="message_video"),
        sg.ProgressBar(1000, size=(20, 20), key='progressbar', bar_color=("#15d36a", "#295273")),
        sg.Text('00.00MB/00.00MB\n00.00MB/s', key="message")
    ],
    [sg.Text('输出目录:', font=("楷体", 12)),
     sg.In(size=(35, 1), key="save_dir"),
     sg.FolderBrowse('...', target='save_dir', initial_folder="."),
     sg.Checkbox(' 下载完毕后 \n打开所在目录', key="open_folder", default=True),
     sg.Button('打开输出目录'),
     ],
    [sg.Text("@小小明:https://blog.csdn.net/as604049322"), ],
]

程序下载

该工具的完整代码和已打包的工具下载地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://gitcode.net/as604049322/python_gui/-/tree/master/douyin

小伙伴们,快快用实践一下吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用Python搞定抖X无水印短视频下载
有时候刷抖音,遇到喜欢的视频保存在本地,然后都是带有水印的,作为有一点“洁癖”的小编,不太喜欢。索性就自己用Python制作了这个简单的小工具,用于下载抖音无水印短视频!
可以叫我才哥
2022/04/12
9130
用Python搞定抖X无水印短视频下载
用Python制作一个B站视频下载小工具(文末附完整代码)
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
可以叫我才哥
2022/04/12
4.1K1
用Python制作一个B站视频下载小工具(文末附完整代码)
用Python制作一个B站视频下载小工具
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
查理不是猹
2022/01/11
9901
抖音爬虫 | 手把手教你下载指定的Douyin)号的视频
https://github.com/LoadChange/amemv-crawler
昱良
2019/03/07
9.7K0
Python爬虫学习教程,批量爬取下载抖音视频
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/18
3K0
Python爬虫学习教程,批量爬取下载抖音视频
【Python爬虫】如何把抖音美女小姐姐视频数据(高清、无水印)保存到硬盘里
现在自媒体平台上经常有一些视频素材需要保存下来,但是大部分平台下载下来都带上了平台水印,影响视频美观。这次我们用爬虫,可以爬到高清无水印的视频
松鼠爱吃饼干
2021/10/26
2.4K1
【Python爬虫】如何把抖音美女小姐姐视频数据(高清、无水印)保存到硬盘里
Python实现过验证码,自动登录抖音,采集无水印视频
数据: 视频链接 / 视频标题 2. 抓包分析 通过开发者工具进行抓包分析 I. 打开开发者工具: F12 II. 刷新网页 III. 找到数据链接
松鼠爱吃饼干
2023/09/02
1.9K0
Python实现过验证码,自动登录抖音,采集无水印视频
抖音小姐姐属于你的四种姿势
上周看到一个有趣的项目是使用Python+ADB做一个Python 抖音机器人 Douyin-Bot,自动翻页+颜值识别,自动点赞加关注,效果如下图,可以说是非常秀了。
咸鱼学Python
2019/10/09
9610
抖音小姐姐属于你的四种姿势
手把手教你爬取某酷音乐付费歌曲~
爬取酷我音乐相比网易云音乐、酷狗音乐以及QQ音乐来说容易很多,没有加密算法,而且在反爬虫中不存在一些难理解的逻辑,只需要理清思路即可!本文会用爬虫+GUI制作酷我音乐下载工具
Python与Excel之交
2021/08/05
3.4K0
手把手教你使用PySimpleGUI库打造一款轻量级计算器
前言 前几天在Python交流群里边,【🌑(这是月亮的背面)】大佬分享了一个有趣的代码,用于PySimpleGUI库打造了一款简易计算器,觉得挺有意思,非常适合入门PySimpleGUI的小伙伴们学习,这里拿出来给大家分享一波。 实现过程 这里直接上代码,如下所示: import PySimpleGUI as sg # 定义主窗口布局,确定行数 def window_main(): layout = [ [sg.Text('计算结果:', font=("微软雅黑", 10))
Python进阶者
2022/03/07
6950
手把手教你使用PySimpleGUI库打造一款轻量级计算器
python爬虫教程:抖音无水印视频批量下载
抖音越来越火,感觉它有毒,越刷越上瘾,总感觉下一个视频一定会更精彩,根本停不下来。想将抖音里喜欢的小哥哥/小姐姐的视频全部存到电脑硬盘里该如何操作?不想有抖音的视频水印该如何处理?
机器学习AI算法工程
2019/10/28
4.4K1
python爬虫教程:抖音无水印视频批量下载
Python实现超简单【抖音】无水印视频批量下载
导读:本文介绍了如何使用简单的Python爬虫爬取抖音上你喜欢的拍客的所有视频(包含有水印和无水印两种)。
我被狗咬了
2020/05/29
5K1
Python实现超简单【抖音】无水印视频批量下载
「docker实战篇」python的docker- 抖音视频抓取(中)(25)
本次主要针对python对上次抖音分享的页面中的_signature进行解析并完成抖音视频的下载。源码:https://github.com/limingios/dockerpython.git (源
IT架构圈
2019/04/26
1K0
「docker实战篇」python的docker- 抖音视频抓取(中)(25)
无水印抖~~音video下载
想下载无水印视频当然要找到无水印的视频的地址 于是在抖音的视频右下方点击分享 会弹出很多的分享的方式 这里我们选择复制链接 这样就会得到这个
润森
2022/08/18
5130
无水印抖~~音video下载
Python爬取抖音短视频(无水印版)
在我之前的一篇博客中,我用了构造网址的方法来获取抖音短视频,但是在今天我又一次的研究抖音短视频的时候发现了一个更加简单的方法,发现我之前的分析实在是太过繁琐了,所以有写了一篇博客来记录下这个方法。
龙哥
2022/01/19
8.9K0
Python爬取抖音短视频(无水印版)
用Python下载抖音无水印视频!
接下来就是重点了,首先你需要让你的浏览器能够修改UA,即爬虫经常用到的「User-Agent」。
小F
2020/10/09
1.5K0
用Python下载抖音无水印视频!
用Python下载抖音无水印视频!
接下来就是重点了,首先你需要让你的浏览器能够修改UA,即爬虫经常用到的「User-Agent」。
yz_weixiao
2021/12/22
5700
Python 批量下载BiliBili视频 打包成软件
有一天,我突然想找点事做,想起一直想学但是没有学的C语言,就决定来学一下。 可是怎么学呢?看书的话太无聊,报班学呢又快吃土了没钱,不如去B站看看? 果然,关键字C语言搜索,出现了很多C语言的讲课视频:
cutercorley
2020/07/23
2.1K0
Python 批量下载BiliBili视频 打包成软件
批量爬取抖音个人主页视频
码农GT038527
2024/11/18
3690
批量爬取抖音个人主页视频
用Python开发的抖音评论区采集软件,批量爬取评论(含二级)
采集软件的主要目标是实现笔记数据的自动化采集,包括笔记正文、发布时间、以及转评赞藏等关键信息。通过设计直观的界面,旨在让即使是技术小白也能轻松使用这款工具。
马哥python说
2024/01/27
10.9K3
用Python开发的抖音评论区采集软件,批量爬取评论(含二级)
推荐阅读
相关推荐
用Python搞定抖X无水印短视频下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验