python实现抖音无水印下载,从手动到脚本实现 2020

工具下载链接: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&amp
观察链接,前面是一级一级的目录,后面有一个get请求,参数名是s_vid,这会不会就是视频的id了?可是我们拿到视频id也没用啊,这时候开发经验丰富的老师傅发现了,最后一级目录的名字叫playwm,wm会不会是watermark(水印)的缩写呢,我们尝试将wm删除,访问一次我们构造的url
https://aweme.snssdk.com/aweme/v1/play/?s_vid=93f1b41336a8b7a442dbf1c29c6bbc56574d7b82246202e7c23fe2d127baa6221fdca81fd932cfd300d95351ba6c48801d09bcb4961f63c9e48237e7f6a0f4b1&amp
访问发现是一片空白,不过页面没有报错,说明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要优秀,代码比较长,就不贴出来了。
PyQt5

(2)Tkinter

Tkinter是python自带的gui,使用时也不用想PyQt5那样麻烦,要安什么sip、PyQt5、PyQt5-tools这些包,最后Tkinter打包出来的exe也要小一些,不过还是有8m。代码不是太想贴出来。。。看看截图吧。
Tkinter

关于学习图形界面

关于学习图形界面,我有一点点建议,沉下来认真学好一个图形界面,其他的都是类似,就像编程语言一样。之后再用到什么界面再学就是,不过上手肯定会很快的,这次的PyQt5和Tkinter都是我第一次接触,但是从不了解到上手半天时间都没花到,因为之前我有学过Java的Swing包。

总结

这是我的第一篇博客,是在做了一个实际的小项目之后做一个整体的回顾和整理,同时也是与大家分享,如果大家觉得我写得不错就给我点个小小的赞吧,如果有什么疑问或是需要源代码不妨通过评论告诉我,谢谢大家!

Python中利用网络爬虫技术下载抖音水印图片,通常会涉及到以下几个步骤: 1. **安装必要的库**: 首先需要安装`requests`库用于发送HTTP请求获取网页内容,以及`beautifulsoup4`库解析HTML结构。 ```bash pip install requests beautifulsoup4 ``` 2. **分析网页结构**: 使用浏览器的开发者工具查看目标图片的URL,因为抖音可能会对直接访问的链接水印,而通过JavaScript动态加载的图片则可能是无水印的。你需要找到加载图片数据的部分并理解其请求规律。 3. **发送请求获取图片**: 根据分析结果,编写Python代码发送GET请求,获取无水印图片的URL。例如,如果图片在JSON响应中,可以解析出来。 ```python import requests import json def get_image_url(response): # 解析JSON获取图片URL data = json.loads(response.text) image_url = data.get('image_url') # 假设这是一个键名 return image_url response = requests.get('https://example.com/api/image') image_url = get_image_url(response) ``` 4. **下载图片**: 获取到无水印图片URL后,使用`requests`库下载图片,并保存到本地。 ```python from PIL import ImageGrab import os def download_image(url, save_path='images'): response = requests.get(url, stream=True) if response.status_code == 200: with open(os.path.join(save_path, 'image.jpg'), 'wb') as f: for chunk in response.iter_content(chunk_size=1024): f.write(chunk) f.flush() else: print(f"Failed to download image, status code: {response.status_code}") download_image(image_url) ``` 5. **处理可能出现的问题**: - 抓取过程中可能遇到反爬机制,需要设置合适的User-Agent、频率限制,甚至可能需要登录验证。 - 图片URL可能有防盗链措施,可能需要处理cookies或session。 注意:在实际操作中,务必遵守网站的robots.txt协议,尊重版权,并确保你的爬虫活动不会对服务器造成过大的负担。同时,频繁抓取大量数据可能违反平台的服务条款,所以合理使用爬虫是非常重要的。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值