基于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动态加载变量示例分享
Feb 17 Python
实例讲解python函数式编程
Jun 09 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
详解python之配置日志的几种方式
May 22 Python
基于python socketserver框架全面解析
Sep 21 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
详解使用Python下载文件的几种方法
Oct 13 Python
Python dict的常用方法示例代码
Jun 23 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Django中celery的使用项目实例
Jul 07 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/04/21 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
外语学院毕业生的自我鉴定
2013/11/28 职场文书
经济管理专业自荐信
2013/12/30 职场文书
采购部部长岗位职责
2014/02/06 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
个人先进事迹总结
2015/02/26 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
Python Matplotlib绘制动画的代码详解
2022/05/30 Python