基于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 相关文章推荐
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
Python assert语句的简单使用示例
Jul 28 Python
Python必须了解的35个关键词
Jul 16 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
谈谈python垃圾回收机制
Sep 27 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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 Class 文章
2007/04/04 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
python判断端口是否打开的实现代码
2013/02/10 Python
Python的print用法示例
2014/02/11 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
django 创建过滤器的实例详解
2017/08/14 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
对python中的argv和argc使用详解
2018/12/15 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
建筑人员岗位职责
2013/12/25 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
增值税发票丢失证明
2015/06/19 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android