無(wú)水印抖~~音video下載
正文
想下載無(wú)水印視頻當(dāng)然要找到無(wú)水印的視頻的地址 于是在抖音的視頻右下方點(diǎn)擊分享 會(huì)彈出很多的分享的方式 這里我們選擇復(fù)制鏈接 這樣就會(huì)得到這個(gè)

這段文字里的url地址復(fù)制手機(jī)瀏覽器打開(kāi)會(huì)出現(xiàn)原視頻 只是也會(huì)帶水印的,但如果要是復(fù)制到電腦打開(kāi) 就會(huì)驚喜的發(fā)現(xiàn)水印不見(jiàn)了~
所以使用桌面瀏覽器的ua訪問(wèn)這個(gè)url地址 得到的視頻是無(wú)水印的,現(xiàn)在只要找到視頻的下載地址 即可get到無(wú)水印的文件
訪問(wèn)視頻地址https://v.douyin.com/dTJPrsy/
打開(kāi)Network 清除所有已加載請(qǐng)求 然后點(diǎn)擊視頻播放按鈕

發(fā)現(xiàn)一個(gè)請(qǐng)求加載了2.9mb的資源,點(diǎn)開(kāi)它 復(fù)制它的url地址打開(kāi)
搞定 的確是無(wú)水印的視頻
這時(shí)就要開(kāi)始研究這個(gè)無(wú)水印的視頻的url地址是什么時(shí)候加載的,找了大概3分鐘 發(fā)現(xiàn)竟然就在第一個(gè)請(qǐng)求就加載了無(wú)水印視頻的url地址
當(dāng)然這里是被編碼的
復(fù)制該條請(qǐng)求的url地址, 打開(kāi)pycharm 用requests庫(kù)請(qǐng)求然后解碼輸出一下,看看無(wú)水印視頻的url地址在不在這里
「不知道為什么,請(qǐng)求這個(gè)地址有時(shí)候會(huì)被重定向,但多試幾次還是能get到的 這里可以在異常的時(shí)候,捕獲異常 然后遞歸回去重新請(qǐng)求」

果然, 輕松找到,無(wú)水印視頻的地址https://www.douyin.com/aweme/v1/play/?video_id=v0d00fg10000c5e5igjc77ufqmb21cr0&line=0&file_id=30f121c6a1864953ae1ea98bda9473b3&sign=7d363a7bd7fb3cbd546516eea7420ff8&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL&aid=6383
所以現(xiàn)在只要把之前的流程串起來(lái),就可以完成使用python下載無(wú)水印視頻的需求
當(dāng)我著手開(kāi)始寫(xiě)代碼我才發(fā)現(xiàn),谷歌瀏覽器抓包工具第一個(gè)請(qǐng)求不是我輸入進(jìn)去的url

這時(shí)才發(fā)現(xiàn)該地址被重定向了

那勾選保留日志再請(qǐng)求一次
果然被重定向了 而且還是兩次
知道原因就好辦了,打開(kāi)pytharm

輕松得到第一次重定向后的地址

如法炮制得到第二次重定向后的地址,比對(duì)了一下 就是那個(gè)包含了無(wú)水印url的url
所以只要用正則提取出二次重定向后的url地址中的無(wú)水印視頻的url再請(qǐng)求這個(gè)地址 就可以得到無(wú)水印視頻
import?requests
import?re
from?urllib.parse?import?unquote
import?time
import?os
class?GetDouYingVideo(object):
????def?__init__(self,?url):
????????self.url?=?url
????????self.headers?=?{
????????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/94.0.4606.81?Safari/537.32'}
????????self.counter?=?0
????????self.get_video_id()
????def?get_video_id(self):
????????if?self.counter?==?0:
????????????print('重定向作品地址ing?請(qǐng)稍后...')
????????response0?=?requests.get(self.url,?headers=self.headers,?allow_redirects=False)
????????response1?=?requests.get(re.search(r'\"(.+)\"',?response0.text).group(1),?headers=self.headers,
?????????????????????????????????allow_redirects=False)
????????response2?=?requests.get(re.search(r'\"(.+)\"',?response1.text).group(1),?headers=self.headers)
????????#?print(unquote(response2.text))
????????if?self.counter?!=?0:
????????????print(f'獲取視頻文件地址失敗?正在{str(self.counter)}次重試')
????????else:
????????????print('獲取視頻地址ing?請(qǐng)稍后...')
????????try:
????????????#?因?yàn)檎?qǐng)求這個(gè)地址有可能會(huì)被再次重定向?沒(méi)辦法?只得在失敗后遞歸回來(lái)?再次請(qǐng)求
????????????result?=?re.search(r'"playApi":"http://(.+)","bitRateList"',?unquote(response2.text)).group(1)
????????????response3?=?requests.get('https://'?+?result,?headers=self.headers)
????????????name?=?re.search('(.*) ',?response2.text).group(1)
????????????with?open(name?+?'.mp4',?'wb')?as?f:
????????????????f.write(response3.content)
????????except?AttributeError:
????????????self.counter?+=?1
????????????time.sleep(3)
????????????self.get_video_id()??
if?__name__?==?'__main__':
????GetDouYingVideo(input('請(qǐng)輸入要下載的視頻地址'))
????print('下載無(wú)水印視頻成功!')
????os.system('pause')
