基于Python实现全自动下载抖音视频


Posted in Python onNovember 06, 2020

很多人喜欢玩抖音,我也喜欢看抖音小姐姐,可拿着手机一个个找视频太费劲。作为一个程序员,如何能在电脑前一边编程一边轻松地看抖音小姐姐呢?

下面利用Python,简单的三个步骤就可以将你喜欢的抖音小姐姐的视频自动下载下来了。

Charles

Charles是一个App抓包工具,与Filddler的功能相似,利用它可以得到App运行过程中发生的所有网络请求和响应内容。

在电脑端下载安装完Charles后,需要配置证书,最后开启SSL监听。

手机端则是需要与电脑在同一网络下,比如都连接家里的Wi-Fi,然后在手机的Wi-Fi高级选项里使用Charles代理,输入电脑的IP地址,端口8888,最后为证书命名。

连好以后,手机打开抖音App,随着操作App的动作,可以获取到视频的请求信息。

基于Python实现全自动下载抖音视频

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

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

MitmProxy

基于Python实现全自动下载抖音视频

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

配置抖音的Appium参数:

基于Python实现全自动下载抖音视频

点击蓝色按钮,手机自动启动抖音App。接着操作手机,然后点击Appium的刷新键,获取元素定位代码。

通过本次的实践发现Appium有时并不能很好的获取元素的定位,针对找不到的元素,我直接对手机屏幕位置进行点击。

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

左右滑动切换图片

基于Python实现全自动下载抖音视频

基于Python实现全自动下载抖音视频

基于Python实现全自动下载抖音视频

大致操作如上图。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实现全自动下载抖音视频

我打算将视频里喜欢的妹子全剪辑出来,做一个「最美瞬间」系列的视频,分享给大家!

源码地址:

https://github.com/Tobby-star/douyin

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
Python中用于计算对数的log()方法
May 15 Python
python使用wxpython开发简单记事本的方法
May 20 Python
Python中super的用法实例
May 28 Python
总结Python编程中函数的使用要点
Mar 20 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
python实现连连看辅助(图像识别)
Mar 25 Python
django迁移数据库错误问题解决
Jul 29 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 Python
Python3读写ini配置文件的示例
Nov 06 #Python
Python Serial串口基本操作(收发数据)
Nov 06 #Python
python基于exchange函数发送邮件过程详解
Nov 06 #Python
Python Unittest原理及基本使用方法
Nov 06 #Python
python中的yield from语法快速学习
Nov 06 #Python
Python通过字典映射函数实现switch
Nov 06 #Python
Python使用grequests并发发送请求的示例
Nov 05 #Python
You might like
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
javascript如何实现create方法
2019/11/04 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Python常见的pandas用法demo示例
2019/03/16 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
python如何代码集体右移
2020/07/20 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
一些.net面试题
2014/10/06 面试题
手机销售员岗位职责
2015/04/11 职场文书
思品教学工作总结
2015/08/10 职场文书