吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23501|回复: 384
收起左侧

[Python 原创] 爬取抖音 主页|喜欢|合集 视频

    [复制链接]
安逸丫 发表于 2022-12-11 05:53
本帖最后由 安逸丫 于 2022-12-28 02:37 编辑

爬取抖音 主页|喜欢|合集 视频

说明

1.以下代码仅供学习交流,主要功能爬取抖音用户 主页 喜欢 and 合集 (喜欢仅支持公开的用户)

2.程序运行后会在当前目录下生成video的文件夹存储爬取到的视频

3.需要第三方库

​        requests

​        bs4

4.如遇到什么问题和报错请在评论区详细列出

(例如报错)请留下报错日志和出问题的链接

教程

主页和喜欢分享链接获取

合集分享链接获取

演示

代码

import os
import requests
import time
from bs4 import BeautifulSoup

class viode_ini:
    # 初始化游标
    max_cursor = 0
    # 初始化视频数量
    video_count = 0
    # 成功下载的视频数量
    success = 0
    # 失败下载的视频数量
    error = 0

    # 初始化类型
    video = 0
    image = 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'
    }
    path = ''

    # 初始化文件夹
    def __init__(self):
        # 判断文件夹是否存在
        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(self, url):
        response = requests.get(url, headers=self.header)
        return response.url

    # 获取sec_uid
    @staticmethod
    def get_sec_uid(url):
        return url.split('user/')[1].split('?')[0]

    # 获取mix_id
    @staticmethod
    def get_mix_id(url):
        return url.split('detail/')[1].split('/')[0]

    # 获取用户信息
    def get_user_info(self, sec_uid):
        url = f'https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={sec_uid}'
        response = requests.get(url, headers=self.header)
        return response.json()['user_info']['nickname']

    # 特殊字符处理
    @staticmethod
    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

    # 验证是否为视频
    @staticmethod
    def is_video(data):
        try:
            video = data['video']['download_addr']
            return True
        except KeyError:
            return False

    # 结束输出
    def end(self):
        print('=====================================================')
        print(f'* 视频总数:{self.video_count}')
        print(f'* 成功下载:{self.success}')
        print(f'* 失败下载:{self.error}')
        print('=====================================================')
        s = input('回车退出')
        exit(0)

# 视频下载
def download(ini, video, title):
    try:
        # 请求视频
        response = requests.get(video, headers=ini.header)
        # 写入视频
        with open(f'{ini.path}/{title}.mp4', 'wb') as f:
            f.write(response.content)
        # 成功下载数量
        ini.success += 1
    except Exception as e:
        log_name = ErrorLog(e)
        # 失败下载数量
        ini.error += 1
        print(title + f'下载失败,详细请查看/video/Log/{log_name}.log文件')

# 写入日志
def ErrorLog(error):
    if not os.path.exists('video/Log'):
        os.mkdir('video/Log')
    # 获取当前时间
    log_name = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    Errror = f'====================={date}=====================\n' \
             f'{error}\n' \
             f'=============================================================\n'
    # 写入错误日志
    with open(f'video/Log/{log_name}.log', 'a', encoding='utf-8') as f:
        f.write(Errror)
    return log_name

# 程序主入口
def Start():
    ini = viode_ini()
    print('=====================================================')
    print('***************** 抖音视频爬虫工具 *********************')
    print('***************** \t作者:安逸 \t*********************')
    print('=====================================================')
    print('1.下载用户主页视频\t\t2.下载用户喜欢视频\n3.下载视频合集\t\t4.退出程序')
    print('=====================================================')
    choice = input('请输入序号选择类型:')
    try:
        if choice == '1':
            HomeAndLike(ini, choice)
        elif choice == '2':
            HomeAndLike(ini, choice)
        elif choice == '3':
            Collection(ini)
        elif choice == '4':
            exit()
        else:
            print('输入错误,请重新输入!')
            Start()

    except Exception as e:
        log_name = ErrorLog(e)
        input(f'程序出现错误,错误日志已保存至 video/Log 文件夹,联系作者请提交log_name.log文件!')

# 主页And喜欢
def HomeAndLike(ini, Type):
    # 获取真实链接
    url = ini.redirect(input('请输入用户主页链接:'))
    # 获取sec_uid
    sec_uid = ini.get_sec_uid(url)
    # 获取用户昵称
    nickname = ini.get_user_info(sec_uid)
    nickname = ini.replace(nickname)
    # 下载路径
    if Type == '1':
        ini.path = f'video/主页/{nickname}'
    elif Type == '2':
        ini.path = f'video/喜欢/{nickname}'
    # 创建文件夹
    if not os.path.exists(ini.path):
        os.makedirs(ini.path)
    print('*****************   开始下载视频  *********************')
    # 开始执行任务
    while True:
        # 接口设置
        if Type == '1':
            url = f'https://m.douyin.com/web/api/v2/aweme/post/?reflow_source=reflow_page&sec_uid={sec_uid}&count=21&max_cursor={ini.max_cursor}'
        elif Type == '2':
            url = f'https://m.douyin.com/web/api/v2/aweme/like/?reflow_source=reflow_page&sec_uid={sec_uid}&count=21&max_cursor={ini.max_cursor}'
        data = requests.get(url, headers=ini.header).json()
        # 获取视频列表
        aweme_list = data['aweme_list']
        # 读取视频
        for aweme in aweme_list:
            # 更新视频数量
            ini.video_count += 1
            # 视频标题
            title = f'【{ini.video_count}】 {ini.replace(aweme["desc"])}'
            # 视频链接
            try:
                video_url = aweme['video']['play_addr']['url_list'][0]
            except KeyError:
                ini.error += 1
                print('下载失败: ' + title)
                print('原因: 视频链接获取失败,可能是因为视频已被删除!')
                continue
            # 验证视频是否存在
            if ini.is_video(aweme):
                print('正在下载:' + title)
                # 下载视频
                download(ini, video_url, title)
            else:
                # 下载失败
                ini.error += 1
                print('下载失败:' + title)
                print('失败原因:图文视频,跳过下载')
        # 判断是否还有下一页
        if data['has_more']:
            # 更新max_cursor
            ini.max_cursor = data['max_cursor']
        else:
            print('*****************   视频下载结束  *********************')
            ini.end()

# 下载视频合集
def Collection(ini):
    # 获取真实链接
    url = ini.redirect(input('请输入视频合集链接:'))
    mix_id = url.split('detail/')[1].split('/')[0]
    # 获取合集信息
    url = f'https://www.iesdouyin.com/share/mix/detail/{mix_id}'
    response = requests.get(url, headers=ini.header)
    # 获取合集信息
    soup = BeautifulSoup(response.text, 'html.parser')
    # 获取用户昵称
    nickname = ini.replace(soup.select('span[class="font-small color-yellow mr-10"]')[0].text).replace('@', '')
    # 获取合集名称
    collection_name = ini.replace(soup.select('span[class="mix-info-name-text"]')[0].text)
    # 下载路径
    ini.path = f'video/合集/{nickname}/{collection_name}'
    # 创建文件夹
    if not os.path.exists('video/合集/{nickname}'):
        os.makedirs('video/合集/{nickname}')
    if not os.path.exists(ini.path):
        os.makedirs(ini.path)
    print('*****************   开始下载视频  *********************')
    # 开始执行任务
    while True:
        url = f'https://www.iesdouyin.com/web/api/mix/item/list/?reflow_source=reflow_page&mix_id={mix_id}&count=10&cursor={ini.max_cursor}'
        data = requests.get(url, headers=ini.header).json()
        # 获取视频列表数据
        aweme_list = data['aweme_list']
        for aweme in aweme_list:
            # 更新视频总数
            ini.video_count += 1
            # 视频标题
            title = f'【第{ini.video_count}集】 {ini.replace(aweme["desc"])}'
            # 视频链接
            try:
                video_url = aweme['video']['play_addr']['url_list'][0]
            except KeyError:
                ini.error += 1
                print('下载失败: ' + title)
                print('原因: 视频链接获取失败,可能是因为视频已被删除!')
                continue
            # 验证视频是否存在
            if ini.is_video(aweme):
                print('正在下载:' + title)
                # 下载视频
                download(ini, video_url, title)
            else:
                # 下载失败
                ini.error += 1
                print('下载失败:' + title)
                print('失败原因:图文视频,跳过下载')
        # 判断是否还有下一页
        if data['has_more']:
            # 更新游标
            ini.max_cursor = data['cursor']
        else:
            print('*****************   视频下载结束  *********************')
            ini.end()

if __name__ == '__main__':
    Start()

下载

已打包程序和代码:点此下载

更新

2022-12-12 20:31

1.修复视频重名覆盖导致视频缺失

2.添加视频下载超时处理

2022-12-15 00:10

1.修复遇到图文下载黑屏,解决方案:跳过图文下载

2.对一些潜在的报错进行处理:名称、标题、合集名 进行特殊字符替换

3.重复代码进行优化

2022-12-15 23:23

1.添加报错输入日志

2.修复视频找不到报错停止,解决方案:直接跳过下载下一个

3.重复代码优化

4.接口已失效

免费评分

参与人数 102吾爱币 +101 热心值 +87 收起 理由
爱妃!朕来了 + 1 + 1 用心讨论,共获提升!
Yangzaipython + 1 谢谢@Thanks!
chrolife + 1 我很赞同!
zhaoqingdz + 1 谢谢@Thanks!
圆荷泻露 + 1 谢谢@Thanks!
vickycacti + 1 + 1 鼓励转贴优秀软件安全工具和文档!
隔壁家的王叔叔 + 1 + 1 谢谢@Thanks!
泡泡兔 + 1 谢谢@Thanks!
happy520 + 1 谢谢@Thanks!
guoruihotel + 1 + 1 谢谢@Thanks!
张yu很nice + 1 + 1 我很赞同!
w3275 + 1 + 1 我很赞同!
nian123 + 1 + 1 真好
52菜鸟 + 2 + 1 不错 希望能持续更新
zj_tj + 1 + 1 我很赞同!
丨皮卡丘丶 + 3 能扒自己收藏的视频吗?收藏了很多学习教程
php8 + 1 谢谢@Thanks!
zzhwoaiplay + 1 感谢分享
ysh4821 + 1 我很赞同!
46490050 + 1 鼓励转贴优秀软件安全工具和文档!
tanker5 + 1 + 1 谢谢@Thanks!
wyx071405 + 1 + 1 谢谢@Thanks!
Tonyha7 + 1 + 1 用心讨论,共获提升!
ldz1996 + 1 我很赞同!
whc567899 + 1 + 1 热心回复!
qbaby + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
asdwy1980 + 1 谢谢@Thanks!
louchen94 + 1 + 1 我很赞同!
cbzs1haha + 1 + 1 我很赞同!
anyhave + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JZH233 + 1 牛的呀,感谢大佬开源!
砺心缘起 + 1 + 1 我很赞同!
weidechan + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hubohang + 1 我很赞同!
cnzjw + 1 + 1 我很赞同!
cmyf666 + 1 + 1 我很赞同!
menoooooos + 1 + 1 谢谢@Thanks!
mvplibo + 1 + 1 谢谢@Thanks!
willi季 + 1 + 1 谢谢@Thanks!
xjkonglong + 1 + 1 谢谢@Thanks!
启蒙恋人 + 1 + 1 我很赞同!
YXR20061105 + 1 + 1 谢谢@Thanks!
rhaego989 + 1 + 1 谢谢@Thanks!
邪帝 + 1 + 1 要是有视频发布时间就更好了
2022313 + 1 + 1 用心讨论,共获提升!
x524660708 + 1 + 1 谢谢@Thanks!
af8889 + 1 + 1 我很赞同!
Ocean666 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
那卡 + 1 + 1 我很赞同!
Curry1115 + 1 + 1 谢谢@Thanks!
天涯孤客 + 1 用心讨论,共获提升!
shoomylove + 1 + 1 谢谢@Thanks!
liuxiaoxin + 1 + 1 用心讨论,共获提升!
lbxfather + 1 + 1 666666
满夜星光 + 1 我很赞同!
a282619133 + 1 + 1 谢谢@Thanks!
mhaitao + 1 + 1 我很赞同!
德德哥 + 1 + 1 马上试试,谢谢
HillBoom + 1 + 1 用心讨论,共获提升!
娜美 + 1 + 1 6666需要喜欢的好久了,终于等到你~~
a849949177 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zzy17468 + 1 + 1 谢谢@Thanks!
叶樱枫 + 1 + 1 谢谢@Thanks!
zjete + 1 谢谢@Thanks!
wbzb + 1 + 1 热心回复!
jiuliuge + 1 谢谢@Thanks!
cnping3 + 1 + 1 谢谢@Thanks!
haoren9062 + 1 用心讨论,共获提升!
PoJieWuYiShi + 1 + 1 谢谢@Thanks!
joary123 + 1 + 1 用心讨论,共获提升!
哒劳德 + 1 + 1 我很赞同!
莫奇 + 1 + 1 我很赞同!
cangyun + 1 + 1 热心回复!
CUMT + 2 + 1 谢谢@Thanks!
metaxman + 1 + 1 谢谢@Thanks!
xiaoxx313 + 1 + 1 我很赞同!
江湖白晓灵 + 1 + 1 谢谢@Thanks!
sunwrain + 1 + 1 谢谢@Thanks!
tydx0259 + 1 + 1 谢谢@Thanks!
suisuinianya + 1 谢谢@Thanks!
qianfantian + 1 谢谢@Thanks!
wql15813 + 1 + 1 用心讨论,共获提升!
一个快乐的富豪 + 1 我很赞同!
xuduoren + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ybgarnet + 1 + 1 我很赞同!
ylym8888 + 1 已经处理,感谢您对吾爱破解论坛的支持!
cwm1062002 + 1 + 1 谢谢@Thanks!
Peach_WYY + 1 + 1 热心回复!
哔哔丶哔哔 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Rrgjda + 1 + 1 热心回复!
jamessteed + 1 + 1 谢谢@Thanks!
idolwind + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kkni + 1 谢谢@Thanks!
没有名字的bot + 1 + 1 谢谢@Thanks!
xglys + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
小图 + 1 + 1 大佬给小白打个包呗
ws001980 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
woyucheng + 1 + 1 谢谢@Thanks!
陌郢 + 1 感谢分享

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 安逸丫 发表于 2022-12-23 20:16
主页接口已失效
 楼主| 安逸丫 发表于 2023-1-13 23:12
本帖最后由 安逸丫 于 2023-1-13 23:20 编辑
wh224913 发表于 2023-1-13 22:16
DevTools listening on ws://127.0.0.1:58228/devtools/browser/66bbc0e1-92e4-4d2b-abb2-ac7b1cf9c7a5
程 ...

该开源已经停止更新需要使用成品移步
https://www.52pojie.cn/thread-1728830-1-1.html
或前往对该程序修复版本的
https://www.52pojie.cn/thread-1733823-1-1.html
 楼主| 安逸丫 发表于 2022-12-15 17:51
 楼主| 安逸丫 发表于 2022-12-15 09:25
hubohang 发表于 2022-12-15 09:05
大佬有无水印版本的吗?

爬到的就是无水印的啊
 楼主| 安逸丫 发表于 2022-12-14 08:38
本帖最后由 安逸丫 于 2022-12-14 08:41 编辑
叶默 发表于 2022-12-14 08:31
win10家庭版可能没装什么环境吧,打开就报错,纯小白
Traceback (most recent call last):
  File "dy主 ...

没有读写权限,还有以后请出示完整的报错,你这样让人无法正常分析
wzg01 发表于 2022-12-11 08:18
感谢楼主的分享
dodochan 发表于 2022-12-26 11:05
感谢分享
czwuyang 发表于 2022-12-11 06:17
谢谢分享经验
sht281 发表于 2022-12-11 07:29
多谢楼主分享
依佳人时代 发表于 2022-12-11 07:48
这个牛逼了 谢谢大佬无私分享!!!!!!
依佳人时代 发表于 2022-12-11 07:51
收藏可不可以下载
zhuhengle88 发表于 2022-12-11 07:53
谢谢楼主分享。
zhangting2022 发表于 2022-12-11 08:06
感谢分享
stop9527 发表于 2022-12-11 08:19
本帖最后由 stop9527 于 2022-12-11 08:20 编辑

这么厉害了。
我是python么。
我想爬Flickr
gztf 发表于 2022-12-11 08:20
多谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 10:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表