Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻

/ 01 / Charles


用Charles來找視頻的API接口,具體操作和之前當當網那個案例一樣,不細說。


Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖1


這里通過滑動抖音App,可以獲取到視頻的請求信息。


通過多次實驗,發現鏈接的后面是會不停的改變,只有鏈接的前頭始終不變,即「http://v1-dy」http://v6-dyhttp://v9-dy」不變。


所以在寫腳本的時候,可以以這些信息做為鏈接開頭。

Python騰訊大牛直播預約:

Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖2


/ 02 / mitmproxy


利用mitmproxy中的mitmdump組件,對接Python腳本,用Python實現監聽后的處理。


Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖3


這里我只是利用腳本獲取鏈接,并沒有直接利用腳本下載視頻。


因為我是在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')


/ 03 / Appium


配置抖音的Appium參數。


Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖4


點擊藍色按鈕,手機自動啟動抖音App!


接下來操作手機,然后點擊Appium的刷新鍵,獲取元素定位代碼。


通過本次的實踐發現Appium有時并不能很好的獲取元素的定位,這可能就跟Web端的iframe頁面一樣。


所以針對找不到的元素,我直接對手機屏幕位置進行點擊。


由于大家手機屏幕大小不同,這個參數肯定是會變化的,所以存在弊端,無法通用。


{  左右滑動切換圖片  }

Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖5
Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖6
Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖7


大致操作如上圖。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(510)))


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 + '下載完成')


最后成功獲取姐們的全部視頻...


Python爬蟲實戰,selenium模塊,Python全自動下載抖音視頻的圖8



登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

2
1