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
配置抖音的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



熱 文 推 薦
print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"
點擊“閱讀原文”,更多精彩!
喜歡就點擊“好看”
