前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:python亂燉
PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun
01 獲取你喜歡的拍客的視頻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即可(時間戳也需要修改一下)
02 獲取用戶下面的所有的視頻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)
3. 水印問題
關於水印問題,看了簡書上有篇文章有介紹,水印與無水印之間的區別,這邊我就不作詳細介紹了。其實我們一開始拿到的url就是無水印的,但是鏈接本身並沒重定向到無水印的視頻,加上wm之後,url會重定向到有水印的視頻。
完整代碼
import re
import requests
import os
header = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"accept-encoding": "gzip, deflate, sdch, br",
"accept-language": "en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4",
"cache-control": "no-cache",
"x-tt-logid": "202005280227480100140460221A4FD1CF",
"x-tt-trace-host": "01ec7cfa064a667fc06b9359628310d7439e62ebd3f237434a2ab55522586ad295c69c0af06484df374b32e14ddb3f000f9912025769ad3b7c6273355e56a9332d1901cddf01df6db00b0b6f4b3f159082",
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
'cookie': 'tt_webid=6831576518742705677; _ba=BA0.2-20200528-5199e-qC83gMfiQQZIHGPAbWkc; _ga=GA1.2.1655972543.1590600365; _gid=GA1.2.843249182.1590600365'
}
data = {
"sec_uid": "MS4wLjABAAAAlwXCzzm7SmBfdZAsqQ_wVVUbpTvUSX1WC_x8HAjMa3gLb88-MwKL7s4OqlYntX4r",
"count": "21",
"max_cursor": "0",
"aid": "1128",
"_signature": "1rexVRAciIE-bZMoZ46qv9a3sU",
"dytk": "96ad80961288263ad9d1cff2895d0636"
}
url = "https://www.iesdouyin.com/web/api/v2/aweme/post"
url = "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"
response = requests.get(url, headers=header)
data = response.text
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)