35. 实战:Python实现视频去水印(文末源码)

news2024/9/22 9:56:39

目录

前言

目的

思路

代码实现

1. 请求URL,查看源代码

2. 源代码中没有就去抓包工具

3. 拿到视频源链接,继续检索来源

4. 拿到数据和链接,二进制写入到本地

完整源码

运行效果

总结


前言

我们在刷某短视频平台时,有些视频我们想保存到本地观看,但未开放下载渠道,或者我们想下载来收藏或者做成动态壁纸,但是有水印,就很恼火。

网页连接放评论区  网页连接放评论区  网页连接放评论区  网页连接放评论区

就这个问题,我们写一个小小的程序来实现去水印的功能。


目的

给定URL,实现去除水印下载视频的操作。

网页连接放评论区  网页连接放评论区  网页连接放评论区  网页连接放评论区


思路

1. 请求URL,查看源代码

2. 源代码中没有就去抓包工具

3. 拿到视频源链接,继续检索来源

4. 拿到数据和链接,二进制写入到本地

网页连接放评论区  网页连接放评论区  网页连接放评论区  网页连接放评论区


代码实现

1. 请求URL,查看源代码

请求到主页,检查元素,看视频是否包含在源代码中,结果发现是没有的。

当然,请求URL也少不了必要的请求头,伪装请求头如下:

url = '见评论区'
headers = {
    'cookie': 'douyin.com; __ac_nonce=063d749310021f8bd394b; __ac_signature=_02B4Z6wo00f01R8urHgAAIDBnyxWOmwmfMUfDqjAACQfd6; ttwid=1%7CtRZY98IpvYfhjM-VRDQHgX3mgPcfWwWxylxnwwC7fFk%7C0%7C9af2c384c7d2b4e10ec0497fce797af996c72dd3868ec040595de36132c01ad0; home_can_add_dy_2_desktop=%220%22; passport_csrf_token=ee0cbadbf97ac430daac207c46997ca1; passport_csrf_token_default=ee0cbadbf97ac430daac207c46997ca1; strategyABtestKey=%221675053365.079%22; s_v_web_id=verify_ldibiwgl_ycqaypzT_aJxd_4ZEW_9iGD_XkAPFGlhzwd3; AB_LOGIN_GUIDE_TIMESTAMP=%221675053363589%22; msToken=L3xfxnCP4kW9_qabjW3S1cud_5DmI99tIEOw1_lJDMgdp1GJ9KQd6HWXKepYY-7iLlj4SR_V02zL3lYO6FVnXoPPVNneC5bD9cEnYN4nNpXzaNmvq7oA; ttcid=a598309ef5f3442b95f1d979574083f925; tt_scid=Px0Q21O38QIdeziR7nBXUqfZYJaS4qKakt5Zkfio72r9U4XaJdOYTb37LsjIrRLQca96; msToken=xibNm7RgEpzX8c6UaAgkzAOHMr5TcWNmNbfFR1vD-3uNUhtRXEqVQrmPIV6iDsnsA3WhMCTIOGDtST_F9GEyq8In6Dj7ug-RXsQ6dWDIjzE3OXKr5dlj',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
resp = requests.get(url=url, headers=headers)

其中最重要的就是CookieUser-Agent 

2. 源代码中没有就去抓包工具

3. 拿到视频源链接,继续检索来源

4. 拿到数据和链接,二进制写入到本地

下面可以用正则表达式获取视频标题作为一会保存到本地的文件名

还是用正则抓取刚刚script部分包裹的视频信息,url解码后用pprint将字典美观打印

发现有规律可循,一层一层扒开以后找到了视频url的精准位置

# 正则抓标题
obj = re.compile(r"<span><span><span><span>(?P<title>.*?)</span></span></span></span>", re.S)
title = obj.search(resp.text).group("title")
# print(title)

# 正则抓视频信息
info = re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script', resp.text)[0]
# print(info)

# url解码
html_data = urllib.parse.unquote(info)
html_data = json.loads(html_data)
# pprint(html_data)  # 让字典更加美观

# 字典取值,拿视频播放链接
video_url = 'https:' + html_data['41']['aweme']['detail']['video']['bitRateList'][0]['playAddr'][0]['src']
print(video_url)

最后就是最简单的保存视频

# 获取视频二进制数据
video_content = resp = requests.get(url=video_url, headers=headers).content

# 保存视频
if not os.path.exists('./4_video_without_watermark'):
    os.mkdir('./4_video_without_watermark')
with open('./4_video_without_watermark/' + title + '.mp4', mode='wb') as f:
    f.write(video_content)

完整源码

import requests
import re
import json
import urllib
from urllib import parse
import os
from pprint import pprint

"""
    常规找视频资源:到Network --> Media里面抓包,就能得到地址
    然后在Media里面拿到地址,去全局搜索URL来源
"""

url = '见评论区'
headers = {
    'cookie': 'douyin.com; __ac_nonce=063d749310021f8bd394b; __ac_signature=_02B4Z6wo00f01R8urHgAAIDBnyxWOmwmfMUfDqjAACQfd6; ttwid=1%7CtRZY98IpvYfhjM-VRDQHgX3mgPcfWwWxylxnwwC7fFk%7C0%7C9af2c384c7d2b4e10ec0497fce797af996c72dd3868ec040595de36132c01ad0; home_can_add_dy_2_desktop=%220%22; passport_csrf_token=ee0cbadbf97ac430daac207c46997ca1; passport_csrf_token_default=ee0cbadbf97ac430daac207c46997ca1; strategyABtestKey=%221675053365.079%22; s_v_web_id=verify_ldibiwgl_ycqaypzT_aJxd_4ZEW_9iGD_XkAPFGlhzwd3; AB_LOGIN_GUIDE_TIMESTAMP=%221675053363589%22; msToken=L3xfxnCP4kW9_qabjW3S1cud_5DmI99tIEOw1_lJDMgdp1GJ9KQd6HWXKepYY-7iLlj4SR_V02zL3lYO6FVnXoPPVNneC5bD9cEnYN4nNpXzaNmvq7oA; ttcid=a598309ef5f3442b95f1d979574083f925; tt_scid=Px0Q21O38QIdeziR7nBXUqfZYJaS4qKakt5Zkfio72r9U4XaJdOYTb37LsjIrRLQca96; msToken=xibNm7RgEpzX8c6UaAgkzAOHMr5TcWNmNbfFR1vD-3uNUhtRXEqVQrmPIV6iDsnsA3WhMCTIOGDtST_F9GEyq8In6Dj7ug-RXsQ6dWDIjzE3OXKr5dlj',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
resp = requests.get(url=url, headers=headers)
# resp = urllib.parse.unquote(resp.text)
# print(resp.text)

# 正则抓标题
obj = re.compile(r"<span><span><span><span>(?P<title>.*?)</span></span></span></span>", re.S)
title = obj.search(resp.text).group("title")
# print(title)

# 正则抓视频信息
info = re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script', resp.text)[0]
# print(info)

# url解码
html_data = urllib.parse.unquote(info)
html_data = json.loads(html_data)
# pprint(html_data)  # 让字典更加美观

# 字典取值,拿视频播放链接
video_url = 'https:' + html_data['41']['aweme']['detail']['video']['bitRateList'][0]['playAddr'][0]['src']
print(video_url)

# 获取视频二进制数据
video_content = resp = requests.get(url=video_url, headers=headers).content

# 保存视频
if not os.path.exists('./4_video_without_watermark'):
    os.mkdir('./4_video_without_watermark')
with open('./4_video_without_watermark/' + title + '.mp4', mode='wb') as f:
    f.write(video_content)

运行效果

运行后输出视频直链,并已经将视频保存到本地指定文件夹。


总结

本节实战了某短视频平台视频去水印的过程,较为综合,适合巩固爬虫基础知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud搭建微服务之Vault密钥管理

1. 概述 Vault是一款管理密钥和保护敏感数据的组件&#xff0c;用于保护、存储和严格控制对令牌、密码、证书和加密密钥的访问&#xff0c;可以使用UI客户端、CLI和HTTP API访问密钥和其他敏感数据。更多详细介绍&#xff0c;可以参阅vault官网 2. Vault下载与安装 本文以wi…

【Python学习笔记】6. Python3 基本数据类型(下)——列表、元组、集合、字典、数据类型转换

前言 本文介绍Python3基本数据类型——列表、元组、集合、字典、数据类型转换。 List&#xff08;列表&#xff09; List&#xff08;列表&#xff09; 是 Python 中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0…

MySQL存储结构

数据结构 数据结构可视化&#xff1a;https://www.cs.usfca.edu/~galles/visualization/ 树 二叉树缺点&#xff1a; 单边节点过多时无法提高效率 红黑树&#xff1a; 具有平衡功能的二叉树&#xff0c;解决了单边节点过多导致的效率无法提高的问题&#xff0c;缺点是平衡算法…

移动端 自适应布局方案

文章目录DPRrem布局实现机理优点缺点相关技术方案viewport 布局优点缺点相关技术方案媒体查询等比缩放原理DPR DPR 设备物理像素 / CSS像素 DPR 2 为例&#xff0c;把 4&#xff08;2x2&#xff09;个物理像素当一个 CSS 像素使用 rem布局 rem 就是相对于根元素 html 的…

【正点原子FPGA连载】第二十章Linux图形化配置及其原理 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十章Linux图…

Python获取信用企业的数据

文章目录前言一、需求二、分析三、测试运行前言 本系列文章来源于真实的需求本系列文章仅供学习参考本系列文章你来提我来做 one:Leave a message at the end of the article two:Get wechat contact information 一、需求 需求 URL&#xff1a;https://szxt.zjamr.zj.gov.cn…

如何保持线上安全:你们的个人网络安全指南

在互联网上保持安全的最佳做法。 我们之前写过关于保护你们的加密资产的文章——你们可以在此处查看我们的加密操作安全指南。现在是时候准备一组更通用的提示来帮助你们保持线上安全。我们知道你们可能大部分的购物都是在网上进行的&#xff0c;我们真的不希望你们被黑客攻击。…

HTB_Funnel_ssh隧道转发

文章目录信息收集hydra ssh 暴破ssh 隧道转发 postgresql 流量postgresql 使用动态端口转发信息收集 nmap -sC -sV 10.129.143.249 账号密码 Anonymous:ftp 发现两个文件&#xff0c;下载 默认密码 funnel123#!# 一封邮件 邮箱名可能是用户名 hydra ssh 暴破 hydra -L userna…

Redis_主从复制

一、介绍主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。二、作用读写分离&#xff0c;性能拓展容灾快速恢复&#xff08;一主多从&#xff09;三、搭建配置1、创建/myredis文件夹2、复制Re…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (二)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

【GPLT 二阶题目集】L2-041 插松枝

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; --->每人手边有一只小盒子&#xff0c;初始状态为空。 --->每人面前有用不完的松枝干和一个推送器&#xf…

[NSSRound#7 Team]Web学习

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录一、ecRCE二、Shadowflag三、[NSSRound#7 Team]新的博客四、[NSSRound#7 Team]0o0提示&#xff1a;以下是本篇文章正文内容&#xff0c;下…

【异常】发送失败,此请求可能存在风险,已被微信拦截

一、背景说明 今天上线了新年红包的功能&#xff0c;但是部分用户提示了如下的异常&#xff0c;没有明显的异常提示&#xff0c;就是在查询ELK时&#xff0c;看了如下的错误提示&#xff0c;错误截图如图 提示“发送失败&#xff0c;此请求可能存在风险&#xff0c;已被微信拦…

【Redis】hmdp点赞、排行榜、分页功能的实现

【Redis】hmdp点赞、排行榜、分页功能的实现 文章目录【Redis】hmdp点赞、排行榜、分页功能的实现1.点赞功能实现1.1 需求1.2 实现步骤1.3 思路分析1.4 代码实现1.5 逻辑解析2. 排行榜功能实现2.1 需求2.2 实现步骤2.3 思路分析2.4 代码实现2.5 逻辑解析3. 分页功能实现3.1 需求…

算法之美~贪心算法

如何理解贪心算法&#xff1f;假设有一个可以容纳100kg物品的背包&#xff0c;可以装各种物品。有以下5种豆子&#xff0c;每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大&#xff0c;如何选择在背包中装哪些豆子&#xff1f;每种豆子又该装多少呢&#…

Pikachu靶场攻略(代码分析)

2023年将会持续于B站、CSDN等各大平台更新&#xff0c;可加入粉丝群与博主交流:838681355&#xff0c;为了老板大G共同努力。 一、安装 Phpstudy_pro设置数据库用户名密码 root 123456 更改\pikachu\inc\config.inc.php 访问pikachu页面点击配置即可。 二、 攻略(包含审计…

BiQuadDesigner相关算法研究

一、获取相关源码方法如下 1、打开BiQuadDesigner相关网页如下 2、菜单:更多工具->开发者工具 3、在此重点研究BiQuadDesigner,选择BiQuadDesigner下的javascript,分别查看BiQuad.js和BiQuadFilter.js 二、研究频响曲线生成步骤如下 1、参数输入及换算滤波器系数如下参…

【数据结构基础】线性表 - 栈和队列

知识点栈 - LIFO示意图实现使用数组实现的叫静态栈使用链表实现的叫动态栈队列 - FIFO示意图实现使用数组实现的叫静态队列使用链表实现的叫动态队列栈和队列相关题目用栈实现队列232. Implement Queue using Stacks (Easy)栈的顺序为后进先出&#xff0c;而队列的顺序为先进先…

【前端设计】复位保护模块的整体设计思路

前言 复位保护模块,是在单系统进行动态复位的过程中,对接口进行硬性逻辑保护,避免异步复位过程中的毛刺对周围系统产生影响的模块。一般而言,简单的单系统动态复位流程可以归纳为: 停止业务功能,收齐接口上的rsp,进入待复位状态;使能复位保护,通过逻辑避免毛刺和误触…

【SCL】博图SCL语言回顾和第一个面向对象程序

西门子SCL语言回顾复习和编写第1个面向对象程序 &#xff08;形参&#xff1a;形参指的是指令上标记该指令要使用的数据位置的标识符;简单来说就是只有数据类型&#xff0c;没有实际的地址&#xff0c;在调用时可以写入&#xff09;。 &#xff08;实参&#xff1a;实参指的是包…