用Python搞定抖X無水印短視頻下載

作者?| 道才
來源 |?可以叫我才哥
有時(shí)候刷抖音,遇到喜歡的視頻保存在本地,然后都是帶有水印的,作為有一點(diǎn)“潔癖”的小編,不太喜歡。索性就自己用Python制作了這個(gè)簡單的小工具,用于下載抖音無水印短視頻!
目錄:
1. 需求分析
2. 尋金定穴
3. 下載視頻
4. 制作GUI
5. 打包


1. 需求分析
這里我們是通過PC端的www.douyin.com里查看需要下載的視頻,然后解析出其下載地址后進(jìn)行下載。
先找到 目標(biāo)視頻 的詳情頁, 比如我們刷到下面這個(gè)視頻,點(diǎn)擊右下角的詳情即可進(jìn)入到目標(biāo)視頻的詳情頁。

以下就是詳情頁,可以看到url最后一個(gè)應(yīng)該是視頻id
這也將是本文案例的視頻詳情url地址
https://www.douyin.com/video/7049314157723766024

再確定了目標(biāo)視頻詳情頁之后,我們就要找到視頻真身所在,確定真身后就可以直接下載了。
最終我們小工具的形態(tài)就是只需要填寫視頻詳情url地址即可一鍵下載~
需要引入的第三方庫
import?requests
import?time????????
import?re
import?json
from?selenium?import?webdriver
from?webdriver_manager.chrome?import?ChromeDriverManager
from?urllib.parse?import?unquote
import?PySimpleGUI?as?sg
沒有安裝這些庫的話,直接pip install 搞起!


2. 尋金定穴
老規(guī)矩,F12找起來!
這里F12—>網(wǎng)絡(luò)—>媒體,然后刷新頁面就找到了。。。

但是這玩意又臭又長,感覺完全看出不規(guī)律,咋辦!
那就去網(wǎng)頁元素里找找吧!復(fù)制請求網(wǎng)址中部分片段,然后去元素里ctrl+F找起來!居然真的找到了??!
file_url?=?'https://v3-weba.douyinvod.com/44563c92986b4b7a953475e5fc4c00fb/61e40f39/video/tos/cn/tos-cn-ve-15-alinc2/a3b5603e05d3474faeb1b115263edf4a/?a=6383&br=1138&bt=1138&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=3&er=&ft=l9~jcXpzzKhWH6B1UDmiLo&l=021642332439844fdbddc0200fff0050a90bd4d0000011daf0d4b&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=ajZ3cDk6Zm02OjMzNGkzM0ApaWdoZmhlaTtkNzQ6aDtoNGcyLTY0cjRvMF5gLS1kLS9zc2A2MzEyXzZgMl81YF41Yi86Yw%3D%3D&vl=&vr='

接著我們用requests請求一下視頻詳情頁,需要注意這里需要帶cookie信息,否則請求的數(shù)據(jù)有問題!
關(guān)于cookie,這里提供兩種方案供選擇
自己復(fù)制網(wǎng)頁里的 cookie信息即可(最方便)通過 selenium模擬瀏覽douyin,然后獲取cookie存本地待調(diào)用
本來想用無頭瀏覽器形式,結(jié)果發(fā)現(xiàn)獲取不到cookie,另外就是可能selenium打開抖音的時(shí)候需要滑塊驗(yàn)證一下否則也獲取不到cookie。
#?獲取cookie
def?get_cookies():
????#?初始化瀏覽器為chrome瀏覽器
????#?無界面的瀏覽器
????#?option?=?webdriver.ChromeOptions()
????#?option.add_argument("headless")
????#?browser?=?webdriver.Chrome(ChromeDriverManager().install(),options=option)???
????browser?=?webdriver.Chrome(ChromeDriverManager().install())
????browser.set_window_size(100,100)??
????browser.get(r'https://www.douyin.com')
????cookie_list?=?browser.get_cookies()
????
????#?關(guān)閉瀏覽器
????browser.close()
????
????return?cookie_list
不過,在請求到的網(wǎng)頁源代碼里,我并沒有找到。但是通過仔細(xì)分析、認(rèn)真查找,終于發(fā)現(xiàn)!

我也是查了一些資料才知道這里字符都是像URL的%打頭的編碼形式,所以接下來我們要做的是先解析出這部分內(nèi)容,然后轉(zhuǎn)碼一下。
#?獲取抖音短視頻文件地址
def?get_file_url(url,?cookie_list):
????headers?=?{
????????"User-Agent":?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/87.0.4280.66?Safari/537.36",
????????"referer":?"https://www.douyin.com"
????????}
????
????cookie_dict?=?{}
????
????for?cookie?in?cookie_list:
????????cookie_dict[cookie['name']]=cookie['value']
????try:????
????????resp?=?requests.get(url,?headers=headers,?cookies=cookie_dict)???
????????s?=?re.findall(r'',?resp.text)
????????json_data?=?json.loads(unquote(s[0]))
????????title?=?json_data['21']['aweme']['detail']['desc']
????????file_url?=?'https:'+json_data['21']['aweme']['detail']['video']['playApi']
????????return?file_url,?title
????except:
????????print('\n視頻鏈接請求失?。?!')
????????return?False
反正解析出來的結(jié)果很贊,就是能找到!



3. 下載視頻
既然知道了視頻的下載地址和視頻名稱,直接下載程序搞起即可:
#?下載視頻
def?down_file(file_url,?title):
????headers?=?{
????????"User-Agent":?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/87.0.4280.66?Safari/537.36",
????????"referer":?"https://www.douyin.com"
????????}
????start_time?=?time.time()
????print('------開始下載------')?
????resp?=?requests.get(url?=?file_url,?headers=headers)
????if?resp.status_code==200:????
????????#?設(shè)置單次寫入數(shù)據(jù)的塊大小
????????chunk_size?=?1024*1024*10
????????#?獲取文件大小
????????file_size?=?int(resp.headers['content-length'])
????????#?用于記錄已經(jīng)下載的文件大小
????????done_size?=?0
????????#?將文件大小轉(zhuǎn)化為MB
????????file_size_MB?=?file_size?/?1024?/?1024
????????print(f'【視頻大小】:{file_size_MB:0.2f}?MB')
????????title?=?re.sub(r'\\|\/|\:|\*|\?|\<|\>|\|','',title)
????????with?open(title?+?'.'?+?'mp4',?mode='wb')?as?f:
????????????for?chunk?in?resp.iter_content(chunk_size=chunk_size):
????????????????f.write(chunk)
????????????????done_size?+=?len(chunk)
????????????????# print(f'\r下載進(jìn)度:{done_size/file_size*100:0.2f}%',end='')
????????end_time?=?time.time()
????????print('------下載完成------')
????????cost_time?=?end_time-start_time
????????print(f'【累計(jì)耗時(shí)】:{cost_time:0.2f}?秒')
????????print(f'【下載速度】:{file_size_MB/cost_time:0.2f}M/s',?end='\n')
????else:
????????print('下載失敗??!')
話不都說了,參考之前《用Python制作一個(gè)B站視頻下載小工具(文末附完整代碼)》。
小提示:windows系統(tǒng)下文件名不能含\/:*?<>|,對于解析出來的title需要特別處理下!



4. 制作GUI
這個(gè)嘛,老粉們應(yīng)該也輕車熟路了,畢竟出過好多小工具制作了(文末我們帶上過往小工具的案例新來的朋友可以看看)。

#?布局設(shè)置
layout?=?[[sg.Text('選擇抖音短視頻地址:',font=("微軟雅黑",?12)),sg.InputText(key='url',size=(50,1),font=("微軟雅黑",?10),enable_events=True)?],
???????????[sg.Output(size=(66,?12),font=("微軟雅黑",?10))],??
???????????[sg.Button('開始下載',font=("微軟雅黑",?10),button_color?='Orange'),
???????????sg.Button('關(guān)閉程序',font=("微軟雅黑",?10),button_color?='red'),]
??????????]??????
#?創(chuàng)建窗口
window?=?sg.Window('抖音短視頻無水印下載工具,作者@微信公眾號(hào):可以叫我才哥',?layout,font=("微軟雅黑",?12),default_element_size=(50,1))????
#?事件循環(huán)
while?True:
????event,?values?=?window.read()
????if?event?in?(None,?'關(guān)閉程序'):
????????break
????if?event?==?'開始下載':
????????Y=1
????????url?=?values['url']
????????print('獲取視頻信息中.....',?end='')
????????cookie_list?=?get_cookies()
????????if?Y?==?1:
????????????try:
????????????????file_url,?title?=?get_file_url(url,?cookie_list)
????????????????print(f'\n【視頻名稱】:{title}')
????????????????down_file(file_url,?title)
????????????except:
????????????????print('鏈接有誤,請檢查后輸入!\n')
????????????????Y=0
window.close()??

5. 打包
對打包不是很了解的可以參考《2個(gè)技巧,學(xué)會(huì)Pyinstaller打包的高級(jí)用法》,這里就簡單的命令搞定:
pyinstaller -F -w 抖音短視頻無水印下載工具.py
以上就是本次全部內(nèi)容啦,如果你感興趣可以點(diǎn)贊、在看與收藏一波~
小工具和源代碼鏈接:https://pan.baidu.com/s/12aBwa1-C9TB7L9nd0K-P0Q提取碼:1001
覺得不錯(cuò),請點(diǎn)個(gè)在看
