成果展示
視頻下載
爬取的100個視頻:https://ghgxj.lanzous.com/b08xszm0h
項目場景
抖音【喜歡】這一欄收藏了很多視頻,如下圖,共有4691個,如何批量下載下來?
預備知識
只下載單個視頻其實是不難的,可以參考我的這篇文章:
1、運行下方代碼:
import re, json, requests
from tqdm import tqdm # 打印進度條的庫
inp = input('請輸入復制的抖音分享鏈接:') # 如:https://v.douyin.com/JVFp8r5/
url = re.findall('https://v.douyin.com/.*?/', inp)[0] # 鏈接解析
res = requests.get(url)
vid = re.findall('/video/(.*?)/', res.url)[0] # vid解析,vid就是視頻id,是我自己定義的
api = f'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}' # 調用api
res = requests.get(api).json()
url = res['item_list'][0]['video']['play_addr']['url_list'][0] # 視頻下載鏈接解析
url = url.replace('/playwm/', '/play/') # 去水印
res = requests.get(url, headers={'user-agent': 'chrome'})
total_size = round(int(res.headers["Content-Length"])/1024/1024)
with open(f'{vid}.mp4', 'wb') as f:
for chunk in tqdm(iterable=res.iter_content(1024*1024), total=total_size, unit='KB'):
f.write(chunk)
2、輸入抖音短視頻分享鏈接
不用考慮我的感受 我沒感受 不用和我說對不起 反正下次還是對不起 https://v.douyin.com/JVccx8h/ 復制此鏈接,打開抖音搜索,直接觀看視頻!
3、就能將視頻下載到本地了
批量爬取
下載單個視頻的時候,我們是通過復制分享視頻鏈接來實現的,如何批量獲取視頻鏈接呢?總不能一個一個點吧,【喜歡】里面總共有4691個視頻,一個一個用手點肯定是不行的。這里我就想到了用Fiddler Everywhere
來對抖音APP
進行抓包。
抓包結果如下:
【喜歡】的api
接口是:
https://aweme.snssdk.com/aweme/v1/aweme/favorite/
返回的是json
數據:
請求參數有很多,但每次改變的只有這4個參數:
count
max_cursor:
ts
_rticket
其中,count
是返回的視頻數量,max_cursor
首次請求時為0,往后請求的值為上一次的返回值。ts和_rticket目前還不知道怎么解析,不過應該是通過某種加密方式計算出來的。所以目前是項目是卡在這里,如果以后有解決辦法會再更新的。
溫馨提示
因為api
接口有些參數目前還尚未解析,所有我就手動復制了返回的幾個json
數據,然后運行下方代碼下載:
import os, json, requests
from tqdm import tqdm
def down(name, link):
res = requests.get(link)
with open(name, 'wb') as f:
f.write(res.content)
def main():
root = 'favorite/'
os.makedirs(root, exist_ok=True)
with open('favorite.json', 'r', encoding='utf-8') as f:
data = json.load(f)
for item in tqdm(data['aweme_list']):
name = root+item['aweme_id']+'.mp4'
link = item['video']['play_addr']['url_list'][0]
down(name, link)
main()
順便一提
其實我也用appium
嘗試過,但【喜歡】里面視頻播放時竟然捕捉不到元素
from appium import webdriver
import time
# 連接手機抖音
caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"platformVersion": "6.0.1",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": ".main.MainActivity",
"noReset": "True",
"unicodeKeyboard": "True",
"resetKeyboard": "True"
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 爬抖音喜歡的視頻數據
time.sleep(5)
print('點擊我')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/h3f')[4].click()
time.sleep(5)
print('點擊喜歡')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/g1c')[2].click()
time.sleep(5)
print('打開視頻')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/a2z')[0].click()
time.sleep(5)
print('點擊分享')
driver.find_element_by_id('com.ss.android.ugc.aweme:id/gh0').click()
time.sleep(5)
driver.swipe(500, 1300, 0, 1300)
time.sleep(5)
print('點擊復制鏈接')
# 下方代碼或報錯,因為獲取不到元素,hhh
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/gg1')[-3].click()
time.sleep(1)
print(driver.get_clipboard_text())