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

用Python全自动下载漂亮小姐姐的抖音视频!_第1张图片


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

来源 | 法纳斯特

编辑 | Jane


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


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


1.Charles


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


用Python全自动下载漂亮小姐姐的抖音视频!_第2张图片


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


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


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



2.mitmproxy


利用 mitmproxy 中的 mitmdump 组件,对接 Python 脚本,用 Python 实现监听后的处理。


用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')



3.Appium


配置抖音的 Appium 参数。


用Python全自动下载漂亮小姐姐的抖音视频!_第4张图片


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


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


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


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


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


用Python全自动下载漂亮小姐姐的抖音视频!_第5张图片 用Python全自动下载漂亮小姐姐的抖音视频!_第6张图片 用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全自动下载漂亮小姐姐的抖音视频!_第8张图片


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


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


福利

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


640?wx_fmt=jpeg



推荐阅读:

  • 100+Python编程练习题~

  • 如何教机器自己玩俄罗斯方块

  • 用“AI”给吴秀波测面相,发现······ 

  • Python的P图大法,你值得拥有!

  • 任正非:人工智能就是计算机和统计学

  • Python | 面试官最喜欢问的几个问题

  • 手把手教代码|还没入门Python就想放弃怎么破?手把手教代码

  • 用这个Python教程赶紧查一下你的邮箱信息是否泄露?

  • 20行Python代码给微信头像戴帽子

  • 用Python画一只小猪佩奇送给你!

640?wx_fmt=png

你可能感兴趣的:(用Python全自动下载漂亮小姐姐的抖音视频!)