2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python_python批量下载抖音视频-程序员宅基地

技术标签: python  音视频  开发语言  

这里以鞠婧祎的个人主页为demo
【2023-11-4 23:02:52 星期六】可能后面随着官方的调整, 方法不再适用, 请注意

URL地址:
aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQUNWNUVtMTEwU2l1c0Vsd0tsSXBVZC1NUlNpOHJCWXlnME5mcFBycVpteWtIWTh3TFBROE80cHYzd1BMNkEtb3o=

在这里插入图片描述

找到接口

找到/aweme/v1/web/aweme/post/路劲的接口

image-20231104230515850

预览响应数据, 应该是能跟所发布视频的描述所对应的就OK, 但是只只有18条数据

余下的数据, 滚动进度条的时候就会出来了

接口整整37个参数, 随便改一个都会导致请求不到数据(返回状态码200, 但就是没数据), 没想到解决办法…

image-20231104230815754

将返回的数据保存到json文件中

image-20231104231435708

下载视频

import requests
import json
import os

# todo 错误处理
def download_video(url, path):
    print('\n开始下载视频...', path.split('/')[-1])
    r = requests.get(url, stream=True)
    with open(path, 'wb') as f:
        # 进度条
        total_length = int(r.headers.get('content-length'))
        print('视频大小:', total_length)
        for chunk in r.iter_content(chunk_size=1024 * 1024):
            if chunk:
                f.write(chunk)
            # 打印进度条
            print('\r' + '[下载进度]:%s%.2f%%' % (
                '>' * int((f.tell() / total_length) * 50), float(f.tell() / total_length) * 100), end='')


index = 0

# json_file, 接口返回的json文件位置
# save_file_dir, 保存视频的文件夹路径
def save_video_batch(json_file, save_file_dir):
    global index
    if not os.path.exists(save_file_dir):
        os.makedirs(save_file_dir)
    # 读取json文件
    with open(json_file, 'r', encoding='utf-8') as f:
        json_data = json.load(f)
        aweme_list = json_data['aweme_list']
        for aweme in aweme_list:
            video_url_list = aweme['video']['play_addr']['url_list']
            video_name = aweme['desc']
            # 一个视频有三个地址, 成功一个就break
            index += 1
            for video_url in video_url_list:
                # print(video_url)
                try:
                    download_video(video_url, f'{
      save_file_dir}{
      index}-{
      video_name}.mp4')
                    break
                except Exception as e:
                    print('下载失败')


save_video_batch('../params/鞠婧祎主页.json', '../data/鞠婧祎主页/')

下载结果

image-20231104232212786

尝试直接去获取html页面, 解析html页面, 但是获取的html页面并不是实际浏览器中浏览的页面(不是验证码界面我看了)

请求接口也是, API调试工具中能请求到, 但是使用代码就不行了, 也是返回200状态, 但是没有数据, 下面是代码, 不知道缺了什么
响应200但是没有数据, 试试param参数使用拼接到url后面的形式, 避免=被转义%3D
(有些敏感的数据, 需要自己替换)

现在的方法还很麻烦, 有待改进,

设想我只需要输入主页的url地址, 比如``, 自动下载主页中所有视频

改进更新

【2023-11-7 17:02:20 星期二】
已经改进了, 只需输入aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQUNWNUVtMTEwU2l1c0Vsd0tsSXBVZC1NUlNpOHJCWXlnME5mcFBycVpteWtIWTh3TFBROE80cHYzd1BMNkEtb3o= 主页的url地址, 即可下载视频

演示视频地址
aHR0cHM6Ly93d3cuZG91eWluLmNvbS92aWRlby83Mjk4Mzg2OTIyNzk4NDY4NDA2

项目地址: https://github.com/tiam-bloom/DouyinSpider

X-Bogus纯算签名
侵权请联系我删除, V: Moment_Shiny

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_50969362/article/details/134225161

智能推荐

端口扫描技术_在端口扫描中隐蔽扫描能够更精准的判断出端口是否开启-程序员宅基地

文章浏览阅读3.6k次。(79条消息) 端口扫描原理和划分_HideInTime的博客-程序员宅基地_扫描器通过什么来判断端口的状态一、端口分类固定端口(0-1023):TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等动态端口(1024-49151):这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程, 同一进程两次分配有可能分配到不同的端口二、常用端口扫描技术1. 全TCP连接Connect()扫描此扫描试图与每一..._在端口扫描中隐蔽扫描能够更精准的判断出端口是否开启

Android apk 分析工具:APK Analyzer_什么工具可以比较两个apk 之间的差异-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏6次。前言Android studio 2.2 版本后自带有一个分析工具:APK Analyzer。这是一个专门分析 apk 的神器,主要作用如下: 1. (重要) 直观的看到 apk 中各个文件的大小 (比如 DEX,resource 等等)。我们可根据文件大小信息,减小 apk 的大小; 2. (重要) 学习大企业 app 的命名规范和目录架构规范,还可以查看大公司 app 使用了什么技术和第三方_什么工具可以比较两个apk 之间的差异

web使用自动扫描器_web目录扫描器-程序员宅基地

文章浏览阅读448次。4、有了关于现有漏洞的信息,我们可以跟踪引用并搜索已发布的漏洞,例如,如果我们在用户注册表中搜索CVE-2007-5106,这是一个XSS 漏洞,我们将在Security Focus中找到一个漏洞:https://www.securityfocus.com/bid/25769/exploit。1、我们将扫描Pruggia 漏洞应用程序,并将结果导出到一个HTML报告文件,该命令为:nikto -h http://192.168.120.129/peruggia/-o result.html。_web目录扫描器

解决升级JDK后:找不到sun.misc.Unsafe的类文件_jdk.unsupported位置-程序员宅基地

文章浏览阅读1.1k次。JDK9以后已经将sun.misc.Unsafe弃用,同时改进了lib文件的存储方式,将sun.misc.Unsafe全部存储在了jdk.unsupported里面。_jdk.unsupported位置

C++字符串相加出错:invalid operands of types ‘const char [759]‘ and ‘const char [15]‘ to binary ‘operator+‘_invaild operands oftypes-程序员宅基地

文章浏览阅读1.2k次。但“”括起来的字符串被当成是字符串类型的,而非string类型,而字符串类型与C语言一样是不允许相加的,因此需要强制将其中一个字符串转为String类型。在C语言中字符串是不能直接相加的,在C++中,字符串是一个String类,允许相加。_invaild operands oftypes

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母-程序员宅基地

文章浏览阅读1.9k次。C++信息学奥赛1138:将字符串中的小写字母转换成大写字母该段代码实现了将输入字符串中的小写字母转换为大写字母的功能。_信息学奥赛1138

随便推点

树莓派宝塔搭建NAS私有云盘nextcloud_宝塔做nas-程序员宅基地

文章浏览阅读2.2k次。宝塔新建网站:假设文件夹根目录为/home/nextcloud创建FTP,数据集。并且选择php版本。删除文件夹根目录/home/nextcloud下的两个html文件。下载nextcloud文件:官网链接可以使用wget:wget https://download.nextcloud.com/server/releases/nextcloud-20.0.0.zip,或者本地端下载后拖过去。多线程下载:sudo apt install axel axel -n 20 ht.._宝塔做nas

快学Scala 第一课 (变量,类型,操作符)-程序员宅基地

文章浏览阅读41次。Scala 用val定义常量,用var定义变量。常量重新赋值就会报错。变量没有问题。注意:我们不需要给出值或者变量的类型,scala初始化表达式会自己推断出来。当然我们也可以指定类型。多个值和变量可以一起声明:Scala 类型:Byte, Char, Short, Int, Long, Float, Double, BooleanScala不区分基...

Oracle分区查询_oracle查询分区数据-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏19次。根据分区查询速度会快很多:分区查询:SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = '表名'分区键查询:SELECT * FROM all_PART_KEY_COLUMNS where name='表名';根据分区名查询:select * from 表名 partition('分区名');根据分区键查询:select * from 表名 partition where ACTDATETIME>=to_date('2022_oracle查询分区数据

使用JS判断移动设备的终端类型(浏览器UserAgent)_user-agent判断终端类型-程序员宅基地

文章浏览阅读8.5k次。JavaScript 是如何判断移动设备的类型呢?答案是:User Agent。什么是 User Agent?懂一点网页制作的人应该都明白。简单的说,User Agent 就是用来识别浏览器名称、版本、引擎以及操作系统等信息的内容。 User Agent 的判断是识别浏览器的关键,不仅仅如此,移动互联网开发势头迅猛,通过 User Agent 判断桌面端设备或移动设备就变的很为重要。当然,通过_user-agent判断终端类型

gz文件合并解压_hic的两个r1 gz文件合并-程序员宅基地

文章浏览阅读2.6k次。从veritas网站下载一个storage foundation 5.0的软件,for solaris的,下载了三段文件:sxrt5.0.dvd1.tar.gzaa sxrt5.0.dvd1.tar.gzab sxrt5.0.dvd1.tar.gzac gzcat sxrt5.0.dvd1.tar.gza[a-c]|tar xvf -二楼的办法_hic的两个r1 gz文件合并

SpringBoot:起步依赖-自动配置_spring-configuration-metadata.json-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏8次。SpringBoot:起步依赖-自动配置_spring-configuration-metadata.json

推荐文章

热门文章

相关标签