查看原文
其他

用Python全自动下载漂亮小姐姐的抖音视频!

小F Python大本营 2019-02-23


者 | 小F,Python爱好者,专注爬虫,数据分析以及可视化

来源 | 法纳斯特

编辑 | Jane


做这个项目受启发于一篇文章,文中简述了一名工程师利用 Python+ADB+鹅厂的 AI,一晚上关注了一千多个漂亮小姐姐。充分体现了厂子里的大学生和工人们的不同,曾经的我也独自一人在那个诺大的工厂思考人生,思考着我该何去何从。


想想曾经我时常刷抖音,只不过没有上面那位大佬那么厉害而已,我是人工识别漂亮的小姐姐...这次决定自己尝试一下这个项目,先来个简单点的,提前关注好,然后利用 Python 实现自动化下载街拍视频!!!


1.Charles


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



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


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


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



2.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')



3.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 + '下载完成')


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



要是曾经在厂子里的我,那时会这骚操作该多好,哈哈。其实我想的更多,多数妹子都挺喜欢拍抖音,不过她们应该不会下载这种操作滴。那么小老弟们的机会就来了,下载下来喜欢的妹子的抖音视频。然后剪辑出一个「最美瞬间」系列的视频,机会不就来了嘛...


(本文为Python大本营投稿文章,转载请联系作者。)


福利

公众号后台回复:2018Python,获取2018Python开源项目Top100整理资料!或扫码添加小助手微信,回复:1,入群获取。




推荐阅读:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存