欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python实现抖音无水印下载

程序员文章站 2022-04-11 16:50:52
...


一、分析抖音分享的链接

  1. 获取分享链接:
    在抖音点击分享,复制链接,可以查看到链接内容为5.3 kC:/ https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!
  2. 分析链接
    在浏览器打开当中的https地址,可以发现url地址重定向到https://www.iesdouyin.com/share/video/6914846397879586063/?region=CN&mid=6645161513747221251&u_code=ig0i2b6k&titleType=&did=MS4wLjABAAAAtKwsIcKn7HxaOjssskS8OzyISEhqC6Ws9Yexr9t_N2s&iid=MS4wLjABAAAAFBS8DYf5HBgFIbxfkzumjSVZx2l6l7Y71UJFGr2c_Cs&with_sec_did=1&timestamp=1623813804&app=aweme&utm_campaign=client_share&utm_medium=ios&tt_from=copy&utm_source=copy
  3. 获取视频信息
    通过api接口https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?可以查询到视频的信息,需要传递参数item_ids,通过上面重定向后的url链接可以查看到参数的值为‘6914846397879586063’
  4. 分析接口返回数据
    通过请求接口https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6914846397879586063可以查看到返回的视频信息,当中有很多信息,感兴趣的可以研究研究,这里只针对视频来讲,其中可以看到play_addr下面的url_list有个地址‘https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0d00fb40000bvr7g8o5h10qgd0mpqq0&ratio=720p&line=0’,复制打开地址,可以看到就是视频内容
  5. 获取无水印视频
    上一步已经找到了视频连接,但是是有水印的,现在只需要把上面找到的url连接里面的playwm替换成play,‘https://aweme.snssdk.com/aweme/v1/play/?video_id=v0d00fb40000bvr7g8o5h10qgd0mpqq0&ratio=720p&line=0’,就变成了无水印的地址

二、使用python代码实现

1.安装第三方模块

pip install requests

2.解析分享链接

通过re模块,解析分析链接,代码如下:

import re
link  =  '5.3 kC:/   https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!'
url = re.findall(' {2}(.*?)/ ', link)[0] # 输出url链接
print(url)

3.获取重定向后的链接

import re
import requests
link  =  '5.3 kC:/   https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!'
url = re.findall(' {2}(.*?)/ ', link)[0] # 通过连接输出url链接
reponse = requests.get(url).url
print(reponse)

4.通过获取重定向后的数据关键字,查询视频信息

import re
import requests
link  =  '5.3 kC:/   https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!'
url = re.findall(' {2}(.*?)/ ', link)[0] # 通过连接输出url链接
reponse = requests.get(url).url
id = re.findall('video/(.*?)/',reponse)[0]  # 将重定向链接里面的items_id解析出来
reponse = requests.get(
    "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}".format(id))  # 通过items_id解析出视频数据
print(reponse.text)

5.通过分析视频信息返回数据,获取无水印数据

import re
import requests
link  =  '5.3 kC:/   https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!'
url = re.findall(' {2}(.*?)/ ', link)[0] # 通过连接输出url链接
reponse = requests.get(url).url
id = re.findall('video/(.*?)/',reponse)[0]  # 将重定向链接里面的items_id解析出来
reponse = requests.get(
    "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}".format(id))  # 通过items_id解析出视频数据
link = reponse.json()[
    'item_list'][0]['video']['play_addr']["url_list"][0].replace('playwm', 'play')
print(link)

最后输出无水印地址为:https://aweme.snssdk.com/aweme/v1/play/?video_id=v0d00fb40000bvr7g8o5h10qgd0mpqq0&ratio=720p&line=0

总结

这里只是举了一个简单的例子,来实现读取抖音无水印视频,还有很多功能可以扩展
比如实现自动下载功能:

import re
import requests
link  =  '5.3 kC:/   https://v.douyin.com/eQ6raRq/ 复制佌链接,打开Dou䜾搜索,直接观看視pin!'
url = re.findall(' {2}(.*?)/ ', link)[0] # 通过连接输出url链接
reponse = requests.get(url).url
id = re.findall('video/(.*?)/',reponse)[0]  # 将重定向链接里面的items_id解析出来
reponse = requests.get(
    "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}".format(id))  # 通过items_id解析出视频数据
link = reponse.json()[
    'item_list'][0]['video']['play_addr']["url_list"][0].replace('playwm', 'play')
headers ={'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
          'accept-encoding':'gzip, deflate, br',
          'accept-language':'zh-CN,zh;q=0.9,en;q=0.8',
          'cache-control':'max-age=0',# 这个貌似很重要
            'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36',
}
r = requests.get(link, stream=True,headers=headers)
print('link',link)
print(r,r.text)
file_name = reponse.json()['item_list'][0]['desc']
with open("视频/{}.mp4".format(file_name), 'wb') as f:
    for chunk in r.iter_content(chunk_size=1024 * 1024):
        print('chunk',chunk)
        if chunk:
            f.write(chunk)
            print("%s 下载完成!\n" % file_name)