zoukankan      html  css  js  c++  java
  • 用Python全自动下载抖音视频!

    / 01 / Charles

    用Charles来找视频的API接口,具体操作和之前当当网那个案例一样,不细说。

    这里通过滑动抖音App,可以获取到视频的请求信息。

    通过多次实验,发现链接的后面是会不停的改变,只有链接的前头始终不变,即「http://v1-dy」「http://v6-dy」「http://v9-dy」不变。

    所以在写脚本的时候,可以以这些信息做为链接开头。

    / 02 / 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(' 抖音视频 ')
               with open('douyin.csv', 'a+', encoding='utf-8-sig') as f:
                   f.write(flow.request.url + ' ')

    / 03 / Appium

    配置抖音的Appium参数。

    点击蓝色按钮,手机自动启动抖音App!

    接下来操作手机,然后点击Appium的刷新键,获取元素定位代码。

    通过本次的实践发现Appium有时并不能很好的获取元素的定位,这可能就跟Web端的iframe页面一样。

    所以针对找不到的元素,我直接对手机屏幕位置进行点击。

    由于大家手机屏幕大小不同,这个参数肯定是会变化的,所以存在弊端,无法通用。

    {  左右滑动切换图片  }

    大致操作如上图。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 + '下载完成')

    最后成功获取小姐姐们的全部视频...

    要是曾经在厂子里的我,那时会这骚操作该多好,哈哈。

    其实我想的更多,多数妹子都挺喜欢拍抖音,不过她们应该不会下载这种操作滴。

    那么小老弟们的机会就来了,下载下来喜欢的妹子的抖音视频。

    然后剪辑出一个「最美瞬间」系列的视频,机会不就来了嘛...

  • 相关阅读:
    Hadoop-CDH源码编译
    HBase框架基础(四)
    HBase框架基础(三)
    Scala基础简述
    HBase框架基础(一)
    NOI2015 软件包管理器
    可持久化数据结构入门
    树链剖分 入门
    NOIP2009 最优贸易
    高斯消元 模板
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10295753.html
Copyright © 2011-2022 走看看