教你用Python: 批量下載抖音去水印視頻~

導讀: 本文 介紹瞭如何使用簡單的Python爬蟲爬取抖音上你喜歡的拍客的所有視頻(包含 有水印和 無水印兩種 )。 代碼已上傳至公衆號後臺,回覆: 抖音 即可獲得。

一、獲取你喜歡的拍客的視頻url

抖音用戶主頁的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即可(時間戳也需要修改一下)

二、獲取用戶下面的所有的視頻id

我們剛剛獲取了視頻主頁的鏈接,現在我們要通過主頁鏈接來獲取當前頁面下的所有視頻。爲了方便我們觀看和調試,我們將Chrome開成iPhone模式。

1. 獲取請求鏈接

將Network設置成XHR,重新刷新一下頁面,獲取請求內容:

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

2. 獲取視頻鏈接

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

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

pattern = re.compile('"(https://aweme.snssdk.com/aweme/v1/play/.*?)"')
result = pattern.findall(data)
result = [i.replace("/play/", "/playwm/") for i in result]
for i in result:
    print(i)
加python學習qq羣:775690737  送python零基礎入門學習資料+99個源碼

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

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

三、下載視頻

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

import json
import re
import requests
import os
data = json.dumps(data)
pattern = re.compile('"(https://aweme.snssdk.com/aweme/v1/play/.*?)"')
result = pattern.findall(data)
result = [i.split("&ratio")[0] for i in result]
result2 = [i.replace("/play/", "/playwm/") for i in result]

for i in result:
    print(i)
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
}
if not os.path.exists("無水印"):
    os.mkdir("無水印")
if not os.path.exists("水印"):
    os.mkdir("水印")

count = 0
for res1 in result:
    count += 1
    videoBin = requests.get(res1, timeout=5, headers=headers)
    with open(f'無水印/{count}.mp4', 'wb') as fb:
        fb.write(videoBin.content)
count = 0
for res2 in result2:
    count += 1
    videoBin = requests.get(res2, timeout=5, headers=headers)
    with open(f'水印/{count}.mp4', 'wb') as fb:
        fb.write(videoBin.content)
加python學習qq羣:775690737  送python零基礎入門學習資料+99個源碼

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

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
}
videoBin = session.get(addr, timeout=5, headers=headers)
with open('test.mp4', 'wb') as fb:
    fb.write(videoBin.content)
加python學習qq羣:775690737  送python零基礎入門學習資料+99個源碼

四、結語

本文首先通過分享鏈接來獲取接口數據,之後在接口數據中查找視頻數據,找到視頻內容之後再完成視頻下載。爬取過程非常的簡單,主要就是查找ID會比較喫力。適合爬蟲的新手。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章