社区所有版块导航
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 全自动下载抖音视频!

编程派 • 6 年前 • 510 次点击  

文 | 小F

出品 | 法纳斯特公众号


为什么写这篇文章,主要也是因为看了网易云课堂的一篇软广。


「用Python在抖音扒了这些高颜值女神后,突然成了人生赢家」,文中简述了一名工程师利用Python+ADB+鹅厂的AI,一晚上关注了一千多个漂亮小姐姐。


充分体现了厂子里的大学生和工人们的不同,这里我不得不说一声×××牛皮...


曾经的我也独自一人在那个诺大的工厂思考人生,思考着我该何去何从。



记得那时我也靠着刷抖音,度过那段煎熬的日子。


只不过没有上面那位大佬那么厉害而已,我是人工识别漂亮的小姐姐...


即使现在的我也注册了鹅厂的AI账号,可我还是不会用。


那么就先来点简单的,提前关注好,然后利用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 + '下载完成')


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



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


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


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


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



/ 04 / 总结


前些天有小伙伴叫我给公众号改名,取个跟Pyhton有关的名字,更吸引人。


说实话,我不太愿意,目前的我更趋向于做个人的自媒体,写点属于自己的文字。


多点与学习,与生活有关的文字,有趣有料,开心就好!!!


阅读原文,代码都放「GitHub」上头了。


文末点个赞,比心!!!


回复下方「关键词」,获取优质资源


回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「pybooks02」,立即获取 O'Reilly 出版社推出的免费 Python 相关电子书合集

回复关键词「书单02」,立即获取主页君整理的 10 本 Python 入门书的电子版



印度小伙写了套深度学习教程,Github上星标已经5000+

上百个数据文件合并,只能手动复制粘贴?教你一招十秒搞定!

一个提升图像识别准确率的精妙技巧

一文读懂:从 Python 打包到 CLI 工具

如何使用 Python 进行时间序列预测?

美亚Kindle排名第一的Python 3入门书,火遍了整个编程圈

十分钟搭建私有 Jupyter Notebook 服务器

使用 Python 制作属于自己的 PDF 电子书

12步轻松搞定Python装饰器

200 行代码实现 2048 游戏

题图:pexels,CC0 授权。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32381
 
510 次点击