1. 程式人生 > 實用技巧 >Python實現超簡單【抖音】無水印視訊批量下載

Python實現超簡單【抖音】無水印視訊批量下載

01 獲取你喜歡的拍客的視訊url

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771

抖音使用者主頁的url,我將以羅永浩的主頁連線為例(本人第一次下載抖音就是衝著羅永浩去的,所以也只關注了他一個人)

1.獲取主頁連結

開啟抖音,點進使用者的主頁面,點選右上角的三個點:

選擇分享:

再點選複製連結即可,我們可以獲取如下url:

https://v.douyin.com/JJ8b6Hq/

2.獲取重定向連結

我們只需要將上面這個連結貼上到chrome瀏覽器,就可以獲取到重定向連結

重定向後的連結:

https://www.iesdouyin.com/share/user/4195355415549012?u_code=c23d6456gli&sec_uid=MS4wLjABAAAAlwXCzzm7SmBfdZAsqQ_wVVUbpTvUSX1WC_x8HAjMa3gLb88-MwKL7s4OqlYntX4r&timestamp=1590603009&utm_source=copy&utm_campaign=client_share&utm_medium=android&share_app_name=douyin

現在我們需要記住url中/user後面的一串數字,也就是4195355415549012,這是我們的使用者id。以後只要有了這樣的使用者ID,直接替換進url即可(時間戳也需要修改一下)

02 獲取使用者下面的所有的視訊id

我們剛剛獲取了視訊主頁的連結,現在我們要通過主頁連結來獲取當前頁面下的所有視訊。為了方便我們觀看和除錯,我們將Chrome開成iPhone模式。

1. 獲取請求連結

將Network設定成XHR,重新重新整理一下頁面,獲取請求內容:

我們可以看到上面選中的那個請求,返回的是一串json,我們將內容複製下來看看,搜尋返回的json中有關video的欄位,通過下圖我們就可以看到video裡面有個url_list,裡面有兩個不同的url,這兩個url其實就是視訊相關的地址了,但是還有點問題,這兩個url點進去並不能直接看到視訊。

2. 獲取視訊連結

這裡我們需要將url做一點點修改。我們將/play修改成/playwm就可以了,這個時候我們發現,這兩個視訊地址被重定向成正常的視訊地址了。(下面來說為什麼要加wm,這個代表什麼)

這樣我們就相當於順利拿到視訊的地址了,我們可以去json中獲取所有的視訊url連結:

pattern=re.compile('"(https://aweme.snssdk.com/aweme/v1/play/.*?)"')
result=pattern.findall(data)
result=[i.replace("/play/","/playwm/")foriinresult]
foriinresult:
print(i)

3. 水印問題

關於水印問題,看了簡書上有篇文章有介紹,水印與無水印之間的區別,這邊我就不作詳細介紹了。其實我們一開始拿到的url就是無水印的,但是連結本身並沒重定向到無水印的視訊,加上wm之後,url會重定向到有水印的視訊。

簡書參考連結

https://www.jianshu.com/p/af02f00729c5

水印連結:

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fc60000br74l173cp5c4comdoh0&line=0

無水印連結:

https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fc60000br74l173cp5c4comdoh0&line=0

(多餘的引數忽略,不管他)

轉存失敗重新上傳取消

03 下載視訊

有了視訊連結和獲取有無水印的方法之後,我們就可以直接下載視訊了。

importjson
importre
importrequests
importos
data=json.dumps(data)
pattern=re.compile('"(https://aweme.snssdk.com/aweme/v1/play/.*?)"')
result=pattern.findall(data)
result=[i.split("&ratio")[0]foriinresult]
result2=[i.replace("/play/","/playwm/")foriinresult]

foriinresult:
print(i)
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/81.0.4044.92Safari/537.36',
}
ifnotos.path.exists("無水印"):
os.mkdir("無水印")
ifnotos.path.exists("水印"):
os.mkdir("水印")

count=0
forres1inresult:
count+=1
videoBin=requests.get(res1,timeout=5,headers=headers)
withopen(f'無水印/{count}.mp4','wb')asfb:
fb.write(videoBin.content)
count=0
forres2inresult2:
count+=1
videoBin=requests.get(res2,timeout=5,headers=headers)
withopen(f'水印/{count}.mp4','wb')asfb:
fb.write(videoBin.content)

關於單個視訊下載,如果你想下載某單個無水印視訊,可以直接通過分享連結進行下載:

url="https://v.douyin.com/JJ8kVTc/"#分享連結
session=requests.Session()
req=session.get(url,timeout=5,headers=HEADERS)
print(req.text)
video=re.findall(r'playAddr:"([\S]*?)"',req.text)[0]
vid=re.findall(r'vid=([\S]*?)&',video)[0]
addr=video.replace("/playwm/","/play/")#去除水印
print(addr)
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/81.0.4044.92Safari/537.36',
}
videoBin=session.get(addr,timeout=5,headers=headers)
withopen('test.mp4','wb')asfb:
fb.write(videoBin.content)

04 結語

本文首先通過分享連結來獲取介面資料,之後在介面資料中查詢視訊資料,找到視訊內容之後再完成視訊下載。爬取過程非常的簡單,主要就是查詢ID會比較吃力。適合爬蟲的新手。