抖音视频下载
Posted SunShine_Smaile @冰灵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抖音视频下载相关的知识,希望对你有一定的参考价值。
原理与步骤
- 我们在抖音找一个想要去水印的视频链接
这辈子总要和你最爱的人来看一次洱海吧%洱海%治愈系风景 https://v.douyin.com/NAmJfAJ/ 复制此链接,打开Dou音搜索,直接观看视频!
注意:这里一定要是https开头的,不是口令
打开浏览器访问:
https://v.douyin.com/NAmJfAJ/
- 访问之后会重定向到这个地址,后面有一串数字,这个就是视频的id,他是根据这个唯一id来找到视频播放的
- 按F12查看网络请求,找到刚刚复制的那个请求地址,在响应头里有一个location链接,访问location的链接
https://www.iesdouyin.com/share/video/7064781119429807363/
在F12中有许多请求,查看众多的请求里有一个请求是:
请求太多没找到可以直接跳过,直接看:https://aweme.snssdk.com 这个就行了,把id替换一下
https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=7064781119429807363
把这个请求再次用浏览器访问,然后返回了一大串json数据,一直放下翻可以找到这个链接
直接用那个链接访问,他其实是一个有水印的链接,仔细观察发现最后那里有一段/playwm,有两个字母wm其实就是watermark英语单词的缩写,去掉wm后就能得到一个无水印链接了
https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fg10000c85i9ejc77ue0kb2vo80&ratio=720p&line=0
到这里无水印已经完成了
用Python全自动下载抖音视频!
/ 01 / Charles
用Charles来找视频的API接口,具体操作和之前当当网那个案例一样,不细说。
这里通过滑动抖音App,可以获取到视频的请求信息。
通过多次实验,发现链接的后面是会不停的改变,只有链接的前头始终不变,即「http://v1-dy」「http://v6-dy」「http://v9-dy」不变。
所以在写脚本的时候,可以以这些信息做为链接开头。
/ 02 / 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\')
/ 03 / 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 + \'下载完成\')
最后成功获取小姐姐们的全部视频...
要是曾经在厂子里的我,那时会这骚操作该多好,哈哈。
其实我想的更多,多数妹子都挺喜欢拍抖音,不过她们应该不会下载这种操作滴。
那么小老弟们的机会就来了,下载下来喜欢的妹子的抖音视频。
然后剪辑出一个「最美瞬间」系列的视频,机会不就来了嘛...
以上是关于抖音视频下载的主要内容,如果未能解决你的问题,请参考以下文章