工具下载链接:https://www.lanzous.com/ia4vgfg
视频创作不易,希望各位小伙伴尊重他人的作品哦
————————————————————————————————————————
python实现抖音无水印下载
之前总是看到ios的快捷指令中有抖音短视频无水印下载,但是我每一次试用都没有成功,还以为是提取视频的方式容易失效,其实并不是并且实现起来特别简单。
起因
这段时间在学习python网络爬虫,因为最近的疫情,在看了各种各样的消息之后,每天晚上不想睡觉,也没有妹子聊天,就每天晚上刷抖音,刷到可爱的妹子就保存下来,慢慢地有了一些想法,想要下载一些视频剪辑,水印多少有一些影响观感(当然也要尊重原作者,我也会在视频的最后加上妹子们的ID),然后上网查了资料,发现实现无水印下载很简单,便开始着手了。
实现过程
1.打开链接观察
这个url没有什么特别之处,接下来我们看看这个视频的地址。
2.查看视频地址
打开浏览器的审查元素(F12),用选择工具(快捷键ctrl+shift+c)选中播放器之后可以看得到有一个链接。
https://aweme.snssdk.com/aweme/v1/playwm/?s_vid=93f1b41336a8b7a442dbf1c29c6bbc56574d7b82246202e7c23fe2d127baa6221fdca81fd932cfd300d95351ba6c48801d09bcb4961f63c9e48237e7f6a0f4b1&
观察链接,前面是一级一级的目录,后面有一个get请求,参数名是s_vid,这会不会就是视频的id了?可是我们拿到视频id也没用啊,这时候开发经验丰富的老师傅发现了,最后一级目录的名字叫playwm,wm会不会是watermark(水印)的缩写呢,我们尝试将wm删除,访问一次我们构造的url
https://aweme.snssdk.com/aweme/v1/play/?s_vid=93f1b41336a8b7a442dbf1c29c6bbc56574d7b82246202e7c23fe2d127baa6221fdca81fd932cfd300d95351ba6c48801d09bcb4961f63c9e48237e7f6a0f4b1&
访问发现是一片空白,不过页面没有报错,说明play这个目录是存在的
这个时候就有点难受了,不知道接下来还能搞些设么操作。不过,想一想我们在手机上看抖音时看到的视频都是无水印的,可以尝试用fiddler抓包,看看手机是怎么请求的(我比较懒,接下来直接说结果),手机请求与我们电脑请求的不同在于user-agent(用户代理,用来识别你是什么浏览器),那么接下来我们尝试用手机的UA来访问下我们构造的链接。
3.成功看到无水印视频
更改UA我们可以用fiddler、burpsuite等抓包工具,也可以用hackbar之类的小插件,之前我自己尝试的时候用的是fiddler,但是这里演示起来会比较麻烦,所以直接用一个比较方便地方法,我们去百度找到一些手机的UA,随便复制一个到UA的框里,把我们构造的网址放在url框里,然后点击excute执行,就得到了无水印视频,在这个页面单击鼠标右键就可以保存视频到本地了(到这里就实现了手动实现无水印下载抖音视频了!)。
4.代码实现
接下来用比较简单的代码写一下,整体思路也简单,就是像前面说的那样,从最开始的链接里提取到视频id,构造成无水印的视频地址,再用移动端的UA去访问。代码注释比较多,看代码就够了。
import re #导入正则表达式模块,用来匹配和提取相应内容(相关知识不是一句话说得清的,想了解就百度)
import urllib.request #爬虫常用包
#这里是给header赋值一个移动端的UA,其格式是字典
header = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/72.0.3626.101 Mobile/15E148 Safari/605.1"}
#下面三行代码的作用是将urllib.request.urlopen的UA设为移动端UA
opener = urllib.request.build_opener()
opener.addheaders = header
urllib.request.install_opener(opener)
#我们复制过来的抖音链接
str="#在抖音,记录美好生活#你以为你是陈美嘉,可最后还是成了他脑海里的扑克牌 https://v.douyin.com/gEa819/ 复制此链接,打开【抖音短视频】,直接观看视频!"
fileNamePat = "#.*?#(.*?)https"#用来提取链接的正则表达式
urlPat = " (.*)复制"#提取视频标题的正则表达式
filename = re.compile(fileNamePat).findall(str)#匹配视频名字
url = re.compile(urlPat).findall(str)#匹配视频链接
#下面两个print是为了方便调试,查看有没有匹配成功
#print(filename)
#print(url)
playwm = urllib.request.urlopen(url[0]).read().decode("utf-8")#playwm储存的是抖音链接那个网页的数据(在这个页面里我们找到视频的vid)
#print(playwm)
urlnwm = "https://aweme.snssdk.com/aweme/v1/play/?s_vid="#方便构造无水印地址
wmPat = "s_vid=(.*?)&"#匹配vid的正则表达式
realurl = re.compile(wmPat).findall(playwm)#匹配出vid 存放在realurl中
print(urlnwm+realurl[0])
#urlretrieve函数前面的变量是url地址,后面是文件路径
#urllib.request.urlretrieve(urlnwm+realurl[0], "D:\\Android\\"+filename[0]+".mp4")#urlnwm+realurl[0], "D:\\Android\\xjj.mp4"
#表示将视频存放到当前代码所在的目录
urllib.request.urlretrieve(urlnwm+realurl[0], ".\\"+filename[0]+".mp4")
5.图形界面
(1)PyQt5
为了方便分享给别人使用,最后我想做一款有图形界面的小工具,最开始因为听说PyQt5很强大,于是用PyQt5做了图形界面,那是我最崩溃的一下午。因为用了PyQt5,最后打包出来的exe文件三十多兆,查了一下午资料都没能把它弄小。不过功能和界面都比后面的tkinter要优秀,代码比较长,就不贴出来了。
(2)Tkinter
Tkinter是python自带的gui,使用时也不用想PyQt5那样麻烦,要安什么sip、PyQt5、PyQt5-tools这些包,最后Tkinter打包出来的exe也要小一些,不过还是有8m。代码不是太想贴出来。。。看看截图吧。
关于学习图形界面
关于学习图形界面,我有一点点建议,沉下来认真学好一个图形界面,其他的都是类似,就像编程语言一样。之后再用到什么界面再学就是,不过上手肯定会很快的,这次的PyQt5和Tkinter都是我第一次接触,但是从不了解到上手半天时间都没花到,因为之前我有学过Java的Swing包。
总结
这是我的第一篇博客,是在做了一个实际的小项目之后做一个整体的回顾和整理,同时也是与大家分享,如果大家觉得我写得不错就给我点个小小的赞吧,如果有什么疑问或是需要源代码不妨通过评论告诉我,谢谢大家!