社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python全自动下载抖音视频!

菜鸟学Python • 6 年前 • 712 次点击  

都说夏天是恋爱的季节,每天穿梭在人来人往的地铁上,插肩而过很多漂亮的小姐姐。苦逼的码农只能低头刷抖音,抖音上有很多漂亮的小姐姐街拍视频。既然是玩Python,为啥不用Python来全自动下载这些视频呢,今天我们就用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('\n\n抖音视频\n\n')
            with open('douyin.csv''a+', encoding='utf-8-sig'as f:
                f.write(flow.request.url + '\n')



/ 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(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来解读神奇宝贝

花5分钟,菜鸟也能学个设计模式|单例模式

漫画,用Python做了一个女神颜值打分系统


需要源码,点击阅读原文

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34552