【python】抖音无水印短视频批量爬虫
成果展示
视频下载
爬取的100个视频:https://ghgxj.lanzous.com/b08xszm0h
项目场景
抖音【喜欢】这一栏收藏了很多视频,如下图,共有4691个,如何批量下载下来?
预备知识
只下载单个视频其实是不难的,可以参考我的这篇文章:
1、运行下方代码:
import re, json, requests
from tqdm import tqdm # 打印进度条的库
inp = input('请输入复制的抖音分享链接:') # 如:https://v.douyin.com/JVFp8r5/
url = re.findall('https://v.douyin.com/.*?/', inp)[0] # 链接解析
res = requests.get(url)
vid = re.findall('/video/(.*?)/', res.url)[0] # vid解析,vid就是视频id,是我自己定义的
api = f'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}' # 调用api
res = requests.get(api).json()
url = res['item_list'][0]['video']['play_addr']['url_list'][0] # 视频下载链接解析
url = url.replace('/playwm/', '/play/') # 去水印
res = requests.get(url, headers={'user-agent': 'chrome'})
total_size = round(int(res.headers["Content-Length"])/1024/1024)
with open(f'{vid}.mp4', 'wb') as f:
for chunk in tqdm(iterable=res.iter_content(1024*1024), total=total_size, unit='KB'):
f.write(chunk)
2、输入抖音短视频分享链接
不用考虑我的感受 我没感受 不用和我说对不起 反正下次还是对不起 https://v.douyin.com/JVccx8h/ 复制此链接,打开抖音搜索,直接观看视频!
3、就能将视频下载到本地了
批量爬取
下载单个视频的时候,我们是通过复制分享视频链接来实现的,如何批量获取视频链接呢?总不能一个一个点吧,【喜欢】里面总共有4691个视频,一个一个用手点肯定是不行的。这里我就想到了用Fiddler Everywhere
来对抖音APP
进行抓包。
抓包结果如下:
【喜欢】的api
接口是:
https://aweme.snssdk.com/aweme/v1/aweme/favorite/
返回的是json
数据:
请求参数有很多,但每次改变的只有这4个参数:
count
max_cursor:
ts
_rticket
其中,count
是返回的视频数量,max_cursor
首次请求时为0,往后请求的值为上一次的返回值。ts和_rticket目前还不知道怎么解析,不过应该是通过某种加密方式计算出来的。所以目前是项目是卡在这里,如果以后有解决办法会再更新的。
温馨提示
因为api
接口有些参数目前还尚未解析,所有我就手动复制了返回的几个json
数据,然后运行下方代码下载:
import os, json, requests
from tqdm import tqdm
def down(name, link):
res = requests.get(link)
with open(name, 'wb') as f:
f.write(res.content)
def main():
root = 'favorite/'
os.makedirs(root, exist_ok=True)
with open('favorite.json', 'r', encoding='utf-8') as f:
data = json.load(f)
for item in tqdm(data['aweme_list']):
name = root+item['aweme_id']+'.mp4'
link = item['video']['play_addr']['url_list'][0]
down(name, link)
main()
顺便一提
其实我也用appium
尝试过,但【喜欢】里面视频播放时竟然捕捉不到元素
from appium import webdriver
import time
# 连接手机抖音
caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"platformVersion": "6.0.1",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": ".main.MainActivity",
"noReset": "True",
"unicodeKeyboard": "True",
"resetKeyboard": "True"
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 爬抖音喜欢的视频数据
time.sleep(5)
print('点击我')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/h3f')[4].click()
time.sleep(5)
print('点击喜欢')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/g1c')[2].click()
time.sleep(5)
print('打开视频')
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/a2z')[0].click()
time.sleep(5)
print('点击分享')
driver.find_element_by_id('com.ss.android.ugc.aweme:id/gh0').click()
time.sleep(5)
driver.swipe(500, 1300, 0, 1300)
time.sleep(5)
print('点击复制链接')
# 下方代码或报错,因为获取不到元素,hhh
driver.find_elements_by_id('com.ss.android.ugc.aweme:id/gg1')[-3].click()
time.sleep(1)
print(driver.get_clipboard_text())