欢迎光临
我们一直在努力

如何爬取抖音视频-主页-喜欢-合集,一招解决烦恼

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()

使用图文教程:

 

赞(0) 打赏
未经允许不得转载:新起点博客 » 如何爬取抖音视频-主页-喜欢-合集,一招解决烦恼

评论 抢沙发

评论前必须登录!