本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于騰訊云 作者:Python小屋屋主
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料, )
這篇文章主要介紹了基于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進行篩選,只選取視頻的urlfor 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 timeimport randomfrom appium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom appium.webdriver.common.touch_action import TouchActionfrom 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 pdimport requestsimport os num = 0dom = []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 = jnum += 1response = 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://www.uj5u.com/houduan/233796.html
標籤:其他
