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

目录

STM32CubeMX

前言

QSS

目的

ios解锁大师使用教程

思路

浜戝師鐢?

代码实现

sdk

1. 请求URL,查看源代码

scipy

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

湖仓一体项目

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

Codable自定义解析

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

Stream流

完整源码

企业微信

运行效果

cglib静态代理

总结

wireshark


前言

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

0-1背包

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

小程序常用组件

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

ipidea


目的

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

Java面试总结

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

解决方案


思路

1. 请求URL,查看源代码

人脸口罩检测

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

成员方法

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

系统

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

自学前端

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

springboot


代码实现

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. 源代码中没有就去抓包工具

navicat

静态方法

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)

运行效果

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


总结

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注