導讀: 本文 介紹瞭如何使用簡單的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×tamp=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會比較喫力。適合爬蟲的新手。