<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5473字,需瀏覽 11分鐘

           ·

          2022-01-19 10:59

          作者?| 道才
          來源 |?可以叫我才哥

          有時(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è)在看

          瀏覽 194
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大地99中文在线观看 | 69er小视频 | 中文字幕77页 | 蜜桃视频在线入口www | 竹菊视频一区二区三区 |