基於Python實現全自動下載抖音視訊
很多人喜歡玩抖音,我也喜歡看抖音小姐姐,可拿著手機一個個找視訊太費勁。作為一個程式設計師,如何能在電腦前一邊程式設計一邊輕鬆地看抖音小姐姐呢?
下面利用Python,簡單的三個步驟就可以將你喜歡的抖音小姐姐的視訊自動下載下來了。
Charles
Charles是一個App抓包工具,與Filddler的功能相似,利用它可以得到App執行過程中發生的所有網路請求和響應內容。
在電腦端下載安裝完Charles後,需要配置證書,最後開啟SSL監聽。
手機端則是需要與電腦在同一網路下,比如都連線家裡的Wi-Fi,然後在手機的Wi-Fi高階選項裡使用Charles代理,輸入電腦的IP地址,埠8888,最後為證書命名。
連好以後,手機開啟抖音App,隨著操作App的動作,可以獲取到視訊的請求資訊。
通過多次實驗,發現連結的後面是會不停的改變,只有連結的前頭始終不變,即「http://v1-dy」「http://v6-dy」「http://v9-dy」不變。
所以在寫指令碼的時候,可以用這些資訊做為連結開頭。
MitmProxy
利用MitmProxy中的mitmdump元件,對接Python指令碼,用Python實現監聽後的處理。
這裡我只是利用指令碼獲取連結,並沒有直接利用指令碼下載視訊。
因為我是在mitmdump.exe檔案所在的資料夾執行指令碼,腳本里匯入不了requests模組。
不想配置環境變量了,所以只獲取連結。
利用連結再去下載視訊,視訊連結需要去重,因為可能會有重複的。
Python指令碼如下:
def response(flow): urls = ['http://v1-dy','http://v3-dy','http://v6-dy','http://v9-dy'] # 對url進行篩選,只選取視訊的url for url in urls: if url in flow.request.url: print('\n\n抖音視訊\n\n') with open('douyin.csv','a+',encoding='utf-8-sig') as f: f.write(flow.request.url + '\n')
配置抖音的Appium引數:
點選藍色按鈕,手機自動啟動抖音App。接著操作手機,然後點選Appium的重新整理鍵,獲取元素定位程式碼。
通過本次的實踐發現Appium有時並不能很好的獲取元素的定位,針對找不到的元素,我直接對手機螢幕位置進行點選。
由於大家手機螢幕大小不同,這個引數肯定是會變化的,所以存在弊端,無法通用。
左右滑動切換圖片
大致操作如上圖。UP主的主頁圖漏了,請自行腦補,Python程式碼如下:
import time import random from appium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support import expected_conditions as EC def main(): # 設定驅動配置 server = 'http://localhost:4723/wd/hub' desired_caps = { 'platformName': 'Android','deviceName': 'STF_AL00','appPackage': 'com.ss.android.ugc.aweme','appActivity': '.main.MainActivity',# 關閉手機軟鍵盤 'unicodeKeyboard': True,'resetKeyboard': True } driver = webdriver.Remote(server,desired_caps) wait = WebDriverWait(driver,60) # 同意使用者隱私協議,點選 button_1 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/q6'))) button_1.click() # 禁止電話許可權,點選 button_2 = wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_deny_button'))) button_2.click() # 禁止位置許可權,點選 button_3 = wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_deny_button'))) button_3.click() time.sleep(2) # 向上滑動,進入抖音視訊播放頁面 TouchAction(driver).press(x=515,y=1200).move_to(x=515,y=1000).release().perform() # 這裡需要設定一個較長時間的延遲,因為抖音有引導操作和提示,需等待片刻 time.sleep(20) # 點選抖音"喜歡"處,以此進入登入介面 TouchAction(driver).press(x=950,y=800).release().perform() # 點選密碼登入 button_4 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/afg'))) button_4.click() # 輸入賬號 button_5 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/ab_'))) button_5.send_keys('你的賬號') # 輸入密碼 button_6 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/aes'))) button_6.send_keys('你的密碼') time.sleep(2) # 因為會跳出軟鍵盤,會遮擋登入按鈕,需點選軟鍵盤取消 TouchAction(driver).press(x=980,y=1850).release().perform() time.sleep(2) # 點選登入按鈕 button_7 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/abb'))) button_7.click() time.sleep(2) # 登入成功,進入抖音視訊介面,點選下方標題欄 "我" TouchAction(driver).press(x=990,y=1850).release().perform() # 進入個人主頁,點選關注處 button_8 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/a_7'))) button_8.click() # 進入關注欄,點選第二個關注 button_9 = wait.until(EC.presence_of_element_located((By.XPATH,' /hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.LinearLayout/android.support.v7.widget.RecyclerView/android.widget.RelativeLayout[2]/android.widget.RelativeLayout[1]'))) button_9.click() # 進入UP主主頁,點選第一個視訊 button_10 = wait.until(EC.presence_of_element_located((By.ID,'com.ss.android.ugc.aweme:id/aqm'))) button_10.click() # 不斷下滑頁面,直到底部 while True: TouchAction(driver).press(x=515,y=1247).move_to(x=515,y=1026).release().perform() time.sleep(float(random.randint(5,10))) if __name__ == '__main__': main()
下載視訊程式碼,需要對視訊連結去重:
import pandas as pd import requests import os num = 0 dom = [] folder_path = "F:/video/" os.makedirs(folder_path) df = pd.read_csv('douyin.csv',header=None,names=["url"]) # 對連結去重及去除剛進入抖音獲取的視訊連結 for i in df['url'][2:]: if i not in dom: dom.append(i) # 下載視訊 for j in dom: url = j num += 1 response = requests.get(url,stream=True) filename = str(num) + '.mp4' with open('F:\\video\\' + filename,'ab+') as f: f.write(response.content) f.flush() print(filename + '下載完成')
最後成功獲取小姐姐們的全部視訊:
我打算將視訊裡喜歡的妹子全剪輯出來,做一個「最美瞬間」系列的視訊,分享給大家!
原始碼地址:
https://github.com/Tobby-star/douyin
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。