分享学习Python爬虫、数据分析、数据挖掘的点滴。

最近发现了抖音无水印视频的下载办法。

# 抖音接口

「url」参数值就是从抖音上复制的链接。

Python下载

首先来看一下,间接拜访抖音链接失去的后果。

妥妥的水印...

接下来关上浏览器的开发者工具,看看视频的地址。

能够发现「playAddr」就是视频的地址,复制而后拜访。

链接会重定向到以「v9」结尾的链接,然而还是有水印。

接下来就是重点了,首先你须要让你的浏览器可能批改UA,即爬虫常常用到的「User-Agent」。

我用的是Mac+谷歌浏览器,就说说我本人怎么批改的。

Windows的请自行百度~

首先在电脑的文稿中创立一个文件夹。

这个文件夹的门路如下。

/Users/star-river/Documents/MyChrome

并且在根目录的终端运行上面这段代码。

open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/star-river/Documents/MyChrome

如此我的谷歌浏览器就能胜利更换UA啦!

还是间接拜访抖音的链接,能够看到后果和最后的不一样。

就在这个模式下查找接口。

发现「?item_ids」结尾的这个接口就蕴含了咱们想要的无水印抖音视频。

就是「play_addr」下的列表中的那两个链接。

其中「?item_ids」结尾的这个接口有两个参数须要咱们在另一个接口中获取。

这样「item_ids」和「dytk」参数值咱们也晓得了。

不过咱们间接用浏览器拜访获取到的那两个链接是不会间接呈现视频的,须要和下面的一样。

也扭转一下UA,这里的链接如果还用「iPhone X」这个UA拜访,会失败。

什么起因,小F就不得而知了...

把浏览器UA改为「Responsive」即可拜访,链接会重定向。

这样无水印的抖音视频就搞定了。

不过要是每个视频都须要这么下载,就太麻烦了。

所以写了用Python就能够下载视频的代码。

import requestsimport jsonimport reheaders = {    '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',}def download(url):    """    下载抖音无水印视频    """    # 获取接口参数    html = requests.get(url=url, headers=headers)    title = re.findall('itemId: "(.*?)",', html.text)[0]    dytk = re.findall('dytk: "(.*?)" }', html.text)[0]    # 拼接接口    url_item = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + title + '&dytk=' + dytk    # 获取抖音无水印视频链接    html_item = requests.get(url=url_item, headers=headers)    # 字符串转字典    content = json.loads(html_item.text)    # 视频接口    url_video = content['item_list'][0]['video']['play_addr']['url_list'][1]    response = requests.get(url_video, headers=headers, allow_redirects=True)    # 获取重定向后的链接,这个也是无水印视频的下载链接,不过本次没用    redirect = response.url    print(redirect)    # 视频是二进制,须要这种下载方法    video = requests.get(url_video, headers=headers).content    video_name = "douyin.mp4"    with open(video_name, 'wb') as f:        f.write(video)        f.flush()    print("下载实现")if __name__ == '__main__':    # 抖音链接    url = 'https://v.douyin.com/XJj85H/'    download(url)

无水印视频完满下载。

接口下载

既然晓得了如何用Python下载视频。

那么小F想让大家下载的更不便一点,所以将程序部署到了服务器上。

你只须要通过小F的接口即可下载视频,代码如下。

from flask import Flask, request, send_fileimport requestsimport jsonimport reapp = Flask(__name__)# 只承受get办法拜访@app.route("/douyin/", methods=["GET"])def check():    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',    }    # 默认返回内容    return_dict = {'code': 1, 'result': False, 'msg': '申请胜利'}    # 判断入参是否为空    if request.args is None:        return_dict['return_code'] = '504'        return_dict['return_info'] = '申请参数为空'        return json.dumps(return_dict, ensure_ascii=False)    # 获取传入的参数    get_data = request.args.to_dict()    url = get_data.get('url')    # 获取接口参数    html = requests.get(url=url, headers=headers)    title = re.findall('itemId: "(.*?)",', html.text)[0]    dytk = re.findall('dytk: "(.*?)" }', html.text)[0]    # 拼接接口    url_item = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + title + '&dytk=' + dytk    # 获取抖音无水印视频链接    html_item = requests.get(url=url_item, headers=headers)    # 字符串转字典    content = json.loads(html_item.text)    # 获取视频相干的信息    # data = {}    # 视频的形容    # data['videoDesc'] = content['item_list'][0]['desc']    # 视频的封面图,小图    # data['dynamiCoverUrl'] = content['item_list'][0]['video']['dynamic_cover']['url_list'][0]    # 视频的封面图,大图    # data['staticCoverUrl'] = content['item_list'][0]['video']['origin_cover']['url_list'][0]    # 视频的评论数    # data['comments'] = content['item_list'][0]['statistics']['comment_count']    # 视频的点赞数    # data['prise'] = content['item_list'][0]['statistics']['digg_count']    # 视频接口    url_video = content['item_list'][0]['video']['play_addr']['url_list'][1]    response = requests.get(url_video, headers=headers, allow_redirects=True)    # 获取重定向后的链接,这个也是无水印视频的下载链接,不过本次没用    redirect = response.url    # print(redirect)    # 视频的下载链接    # data['videoPlayAddr'] = redirect    # 返回视频的信息    # return_dict['result'] = data    # 返回后果    # return json.dumps(return_dict, ensure_ascii=False)    video = requests.get(url=redirect, headers=headers).content    video_name = "douyin.mp4"    with open(video_name, 'wb') as f:        f.write(video)        f.flush()    return send_file('douyin.mp4')if __name__ == "__main__":    # 本地调试    app.run(debug=True)    # 部署上线    # app.run(host='127.0.0.1', port=443)

如果本地装置了Flask以及Requests库,这个程序是能够间接运行。

并且可能下载到你所想要的无水印抖音视频。

# 本地接口http://127.0.0.1:500/douyin/?url=https://v.douyin.com/CoQBx1/

部署到服务器上的话,则须要应用443端口。

文末

您的点赞珍藏就是对我最大的激励!
欢送关注我,分享Python干货,交换Python技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!