2020年10月,40行Python代码,采集无水印视频

文章目录

  • 写在前面需求开始分析解决方案去除水印完整代码
私信小编01即可获取大量Python学习资料
写在前面非逆向破解_signature!非逆向破解_signature!非逆向破解_signature!订阅前请谨慎 。 抖音更新频繁 , 不保证长期有效 , 有效日期会在标题写出 。 本文仅限交流学习使用 ,请勿使用在任何非法商业活动 。
需求某天 , 一朋友甩给我一张图片(下图)和一个视频分享链接(如下)
山西方言在内蒙古居然可以畅通无阻?“焖当户对面”送给大家... #贫穷料理#美食趣胃计划复制此链接 , 打开【抖音短视频】 , 直接观看视频! 问我能不能拿到无水印的视频文件
2020年10月,40行Python代码,采集无水印视频文章插图
开始分析我们按常规套路一步步来:打开网址 , F12先分析一下网页请求首先看到短链接被302重定向到视频播放页的链接 。
2020年10月,40行Python代码,采集无水印视频文章插图
视频播放页的链接返回完整的网页代码
;mid=6874780172541774599 --tt-darkmode-color: #999999;">另外一个接口返回了视频相关的数据
目测 item_ids 就是视频编号 , 这个接口并不需要 _signature、dytk 等复杂参数 , 非常简单 。
2020年10月,40行Python代码,采集无水印视频文章插图
解决方案看到这里就首先想到了两个解决方案:
  1. 使用 selenium 或 puppeteer 直接访问短链接 , 模拟点击“播放”键后 , 从网页中用 xpath 或 re 或其他你喜欢的方式匹配出视频文件链接 。
  2. 获取 item_ids 参数 , 直接访问接口 “” 拿到视频数据 , 提取出视频文件链接 。 考虑到这个接口很简单 , 参数也很好获取 , 我个人采取的方案二:对比一下链接发现 , item_ids 可以在短链接重定向是直接获取
;mid=6874780172541774599 Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=shrot_video_url, headers=headers, allow_redirects=False)items_ids = re.findall(r'video/(.*?)/', response.headers['location'])[0]# 电脑UA访问官方api视频分享接口 , 获取视频播放链接url = '{}'.format(items_ids)headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=url, headers=headers)play_addr = response.json().get('item_list')[0]['video']['play_addr']['url_list'][0]去除水印我们拿到的视频文件链接链接如下:
# 有水印;ratio=720p --tt-darkmode-color: #999999;">这个链接还是有水印的 , 我们只需要把链接中的 “playwm” 改为 “play” , 即可变为无水印的 。 (wm是watermark “水印” 的缩写 , 不止抖音 , 其他平台也有用到)
# 无水印;ratio=720p --tt-darkmode-color: #999999;">当我们用手机UA访问上面链接时 , 发现又会跳转一次
;br=6237 --tt-darkmode-color: #999999;">好了 , 现在可以下载视频了
完整代码【2020年10月,40行Python代码,采集无水印视频】def download_video(shrot_video_url):# 电脑UA访问短链接 , 通过302重定向时response.headers中的location标签获取视频id号headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=shrot_video_url, headers=headers, allow_redirects=False)items_ids = re.findall(r'video/(.*?)/', response.headers['location'])[0]# 电脑UA访问官方api视频分享接口 , 获取视频播放链接 , 通过替换 playwm 为 play 后 , 得到无水印的视频播放连接url = '{}'.format(items_ids)headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', }response = requests.get(url=url, headers=headers)play_addr = response.json().get('item_list')[0]['video']['play_addr']['url_list'][0]play_addr_nowm = str(play_addr).replace('playwm', 'play')print(play_addr_nowm)# 手机UA访问无水印的视频播放链接 , 经过302重定向后 , 获取无水印视频播放真实链接 (注意:此处若使用电脑UA则获取不到任何数据)headers = {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', }response = requests.get(url=play_addr_nowm, headers=headers, allow_redirects=False)real_play_addr_nowm = response.headers['location']print(real_play_addr_nowm)# 手机UA访问 , 下载视频 (注意:此处若使用电脑UA则获取不到任何数据)headers = {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1','Connection': 'keep-alive','Host': 'v5-dy-d.ixigua.com'}r = requests.get(url=real_play_addr_nowm, headers=headers, stream=True)# 下载视频print("{}开始下载".format(items_ids))with open('{}.mp4'.format(items_ids), "wb") as mp4:for chunk in r.iter_content(chunk_size=1024 * 1024):if chunk:mp4.write(chunk)print("{}下载结束".format(items_ids))if __name__ == '__main__':# 单个视频分享页————下载无水印视频video_list = ['']for j in video_list:download_video(j)