1.以下代码仅供学习交流,主要功能是抓取抖音用户主页视频-喜欢视频-合集视频(只支持公开用户)
2.程序运行后,会在当前目录下生成video文件夹来存储抓取的视频。
import os
import requests
from bs4 import BeautifulSoup
# 初始化文件夹
def ini():
# 判断video文件夹是否存在
if not os.path.exists('video'):
os.mkdir('video')
# 判断主页文件夹是否存在
if not os.path.exists('video/主页'):
os.mkdir('video/主页')
# 判断喜欢文件夹是否存在
if not os.path.exists('video/喜欢'):
os.mkdir('video/喜欢')
# 判断合集文件夹是否存在
if not os.path.exists('video/合集'):
os.mkdir('video/合集')
# 链接重定向
def redirect(url):
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=header)
return response.url
# 替换标题中的特殊字符
def replace(title):
title = title.replace('\\', '')
title = title.replace('/', '')
title = title.replace(':', '')
title = title.replace('*', '')
title = title.replace('?', '')
title = title.replace('"', '')
title = title.replace('<', '')
title = title.replace('>', '')
title = title.replace('|', '')
title = title.replace('\n', '')
return title
def operate():
operation = input('是否继续爬取?(y/n)')
if operation == 'y':
start()
elif operation == 'n':
exit()
def start():
while True:
print('===========================')
print('1. 作者主页视频')
print('2. 点赞页面视频')
print('3. 作者合集视频')
print('===========================')
Type = input('请输入爬取的视频类型:')
if Type == '1':
home()
break
elif Type == '2':
like()
break
elif Type == '3':
collection()
break
else:
print('输入错误,请重新输入!')
def home():
url = input('请输入作者分享链接:')
# 重定向
url = redirect(url)
sec_uid = url.split('user/')[1].split('?')[0]
# 初始化游标
max_cursor = 0
# 初始化视频数量
quantity = 0
# 成功下载的视频数量
success = 0
# 失败下载的视频数量
error = 0
# 请求头设置
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 开始爬取
while True:
# 获取视频列表
url = f'https://m.douyin.com/web/api/v2/aweme/post/?reflow_source=reflow_page&sec_uid={sec_uid}&count=21&max_cursor={max_cursor}'
response = requests.get(url, headers=header)
data = response.json()
# 获取视频列表
aweme_list = data['aweme_list']
for aweme in aweme_list:
# 更新视频数量
quantity += 1
# 获取视频标题
desc = aweme['desc']
# 获取作者名称
author = aweme['author']['nickname']
# 获取视频链接
video_url = aweme['video']['play_addr']['url_list'][0]
# 判断作者文件夹是否存在
if not os.path.exists(f'video/主页/{author}'):
os.mkdir(f'video/主页/{author}')
# 替换标题中的特殊字符
desc = replace(desc)
# 判断视频标题是否为空,为空则使用视频quantity+作者名称作为视频标题
if desc == '':
desc = f'{quantity}{author}'
# 下载提示
print(f'正在下载第{quantity}个视频:{quantity}.{desc}')
# 超时处理
try:
# 开始下载
with open(f'video/主页/{author}/{quantity}_{desc}.mp4', 'wb') as f:
f.write(requests.get(video_url).content)
# 下载成功
success += 1
except WindowsError:
# 下载失败
error += 1
ns = input(f'第{quantity}个视频下载失败,是否继续下载?(y/n)')
if ns == 'y':
continue
elif ns == 'n':
exit()
# 判断是否还有下一页
if data['has_more']:
# 更新游标
max_cursor = data['max_cursor']
else:
# 没有下一页则结束程序
print('视频下载完成,累计下载视频数量:', quantity, '成功下载视频数量:', success, '失败下载视频数量:', error)
operate()
def like():
url = input('请输入作者分享链接:')
# 重定向
url = redirect(url)
sec_uid = url.split('user/')[1].split('?')[0]
# 初始化游标
max_cursor = 0
# 初始化视频数量
quantity = 0
quantity = 0
# 成功下载的视频数量
success = 0
# 失败下载的视频数量
error = 0
# 请求头设置
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 获取收藏者信息
url = f'https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={sec_uid}'
response = requests.get(url, headers=header)
data = response.json()
# 获取收藏者名称
nickname = data['user_info']['nickname']
# 开始爬取
while True:
url = f'https://m.douyin.com/web/api/v2/aweme/like/?reflow_source=reflow_page&sec_uid={sec_uid}&count=21&max_cursor={max_cursor}'
response = requests.get(url, headers=header)
data = response.json()
# 获取视频列表
aweme_list = data['aweme_list']
for aweme in aweme_list:
# 更新视频数量
quantity += 1
# 获取视频标题
desc = aweme['desc']
# 获取视频链接
video_url = aweme['video']['play_addr']['url_list'][0]
# 判断收藏者文件夹是否存在
if not os.path.exists(f'video/喜欢/{nickname}'):
os.mkdir(f'video/喜欢/{nickname}')
# 替换标题中的特殊字符
desc = replace(desc)
# 判断视频标题是否为空,为空则使用视频quantity+收藏者名称作为视频标题
if desc == '':
desc = f'{quantity}{nickname}'
# 下载提示
print(f'正在下载第{quantity}个视频:{desc}')
# 超时处理
try:
# 开始下载
with open(f'video/喜欢/{nickname}/{quantity}_{desc}.mp4', 'wb') as f:
f.write(requests.get(video_url).content)
# 下载成功
success += 1
except WindowsError:
# 下载失败
error += 1
ns = input(f'第{quantity}个视频下载失败,是否继续下载?(y/n)')
if ns == 'y':
continue
elif ns == 'n':
exit()
# 判断是否还有下一页
if data['has_more']:
# 更新游标
max_cursor = data['max_cursor']
else:
# 没有下一页则结束程序
print('视频下载完成,累计下载视频数量:', quantity, '个,成功下载:', success, '个,失败下载:', error, '个')
operate()
def collection():
url = input('请输入合集分享链接:')
# 重定向
url = redirect(url)
mix_id = url.split('detail/')[1].split('/')[0]
# 初始化游标
max_cursor = 0
# 初始化视频数量
quantity = 0
# 成功下载的视频数量
success = 0
# 失败下载的视频数量
error = 0
# 请求头设置
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 获取合集信息
url = f'https://www.iesdouyin.com/share/mix/detail/{mix_id}'
response = requests.get(url, headers=header)
data = response.text
# 获取合集信息
soup = BeautifulSoup(data, 'html.parser')
# 获取合集名称
collection_name = soup.select('span[class="mix-info-name-text"]')[0].text
# 开始爬取
while True:
url = f'https://www.iesdouyin.com/web/api/mix/item/list/?reflow_source=reflow_page&mix_id={mix_id}&count=10&cursor={max_cursor}'
response = requests.get(url, headers=header)
data = response.json()
# 获取视频列表
aweme_list = data['aweme_list']
for aweme in aweme_list:
# 更新视频数量
quantity += 1
# 获取视频标题
desc = aweme['desc']
# 获取作者名称
nickname = aweme['author']['nickname']
# 获取视频链接
video_url = aweme['video']['play_addr']['url_list'][0]
# 判断作者文件夹是否存在
if not os.path.exists(f'video/合集/{nickname}'):
os.mkdir(f'video/合集/{nickname}')
# 判断合集文件夹是否存在
if not os.path.exists(f'video/合集/{nickname}/{collection_name}'):
os.mkdir(f'video/合集/{nickname}/{collection_name}')
# 替换标题中的特殊字符
desc = replace(desc)
# 判断视频标题是否为空,为空则使用视频quantity+作者名称作为视频标题
if desc == '':
desc = f'{quantity}{nickname}'
# 下载提示
print(f'正在下载第{quantity}集:{desc}')
# 更新视频标题
desc = f'【第{quantity}集】 {desc}'
# 超时处理
try:
# 开始下载
with open(f'video/合集/{nickname}/{collection_name}/【第{quantity}集】{desc}.mp4', 'wb') as f:
f.write(requests.get(video_url).content)
# 下载成功
success += 1
except WindowsError:
# 下载失败
error += 1
ns = input(f'第{quantity}集下载失败,是否继续下载?(y/n)')
if ns == 'y':
continue
elif ns == 'n':
exit()
# 判断是否还有下一页
if data['has_more']:
# 更新游标
max_cursor = data['cursor']
else:
# 没有下一页则结束程序
print('视频下载完成,累计下载视频数量:', quantity, '个,成功下载:', success, '个,失败下载:', error, '个')
operate()
if __name__ == '__main__':
ini()
start()
软件使用教程
抓取视频展示
© 版权声明
THE END
暂无评论内容