用 python 给抖音视频去个水印吧!
程序员文章站
2022-04-11 15:50:56
...
用 python 给抖音视频去个水印吧!
python 作为非常轻便的编程语言,经常被我在工作中用于自动化测试和制作一些小工具。今天我发现了我经常用的一个小程序,你只用复制抖音链接,看下他的广告,他就给你下载下来无水印的抖音视频。可是作为一个连 pron 都4倍速的我,怎么会看广告?于是,就有了这一次尝试。
思路复盘
技术服务于业务,我们使用技术首先是要考虑实现一个业务。
1. 打开浏览器访问我们复制的抖音链接
2. 找到视频播放按钮的位置,点击播放
3. 播放后找到 JS 加载到网页中的动态网址
4. 找到水印和非水印网址区别
5. 访问非水印的源网址,下载视频
打开浏览器访问网址
模拟浏览器,卧槽这个作为软件测试我老内行了。selenium 走起!对了,不想让浏览器打开,就给他设置一个无头吧~
pip install selenium
from selenium import webdriver # 导入 selenium 组件库
# 设置并获取无头浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=chrome_options)
browser.implicitly_wait(10) # 等待元素加载
browser.get(url) # 访问抖音的网址
找到视频播放按钮
browser.find_element_by_css_selector(".xgplayer-start").click()
找到视频的真实地址
real_src = browser.find_element_by_tag_name("video").get_attribute("src")
找到水印和非水印网址区别
这可是需要耐性的,我作为老白嫖直接在 CSDN 找到了别人的经验借鉴了。 playwm替换为 play,字节的员工还是很文艺,wm 就是 waterMark 水印的意思。
# 找到真实视频的src
real_src = browser.find_element_by_tag_name("video").get_attribute("src") # type:str
# 替换为无水印的视频源
video_desc = browser.find_element_by_css_selector(".desc").text # type:str
访问非水印的源网址,下载视频
不能让抖音知道我们是代码,那就给他加个请求头模拟浏览器吧。
# 存入本地
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
with open(f"{video_desc}.mp4", "wb") as fp:
fp.write(requests.get(real_src, headers=headers).content)
源码函数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: raolong
# datetime: 2021/4/3 21:03
# ide: PyCharm
import requests
from selenium import webdriver
def remove_the_watermark(url):
# 设置并获取无头浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=chrome_options)
browser.implicitly_wait(10)
# 访问抖音的网址,解决掉重定向问题
browser.get(url)
# 找到播放按钮点击播放
browser.find_element_by_css_selector(".xgplayer-start").click()
# 找到真实视频的src
real_src = browser.find_element_by_tag_name("video").get_attribute("src") # type:str
# 替换为无水印的视频源
video_desc = browser.find_element_by_css_selector(".desc").text # type:str
real_src = real_src.replace("playwm", "play")
# 存入本地
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
with open(f"{video_desc}.mp4", "wb") as fp:
fp.write(requests.get(real_src, headers=headers).content)
if __name__ == '__main__':
test_url = "https://v.douyin.com/e2xhgvA/"
remove_the_watermark(test_url)