• Python:b站多个视频爬取下载


    📚博客主页:knighthood2001
    公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
    🎃知识星球:【认知up吧|成长|副业】介绍
    ❤️如遇文章付费,可先看看我公众号中是否发布免费文章❤️
    🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

    在之前的文章,我们实现了将指定视频下载下来,并且实现了将下载的视频音频合并成完整视频。

    今天我们要实现的将多个指定视频进行下载。

    项目架构

    运行前,就这三个文件,一个ffmpeg.exe用来将视频音频进行合并,url.txt用来存放你要爬取的url
    在这里插入图片描述

    url.txt中放的url链接如下
    在这里插入图片描述

    运行后会产生两个保存视频的文件夹

    替换不能作为文件名的字符

    这里我注意到,有些标题中存在不能作为文件名的字符,因此需要将其替换。这里选择将其替换成空格。

    # 定义一个函数,用于替换文件名中的特定字符
    def sanitize_filename(filename):
        # 使用正则表达式替换文件名中的特定字符
        sanitized_filename = re.sub(r'[/\:*?<>|]', ' ', filename)
        return sanitized_filename
    '
    运行

    全部代码

    import requests
    import re
    import json
    import os
    import subprocess
    # 函数:下载并保存视频和音频
    def download_video_and_audio(url, headers):
        try:
            # 发送请求
            response = requests.get(url=url, headers=headers)
            response.raise_for_status()  # 如果响应状态不是200,将抛出异常
            html = response.text
    
            # 解析数据:提取视频标题
            title = re.findall('title="(.*?)"', html)[0]
            print(f"视频标题: {title}")
            new_title = sanitize_filename(title)
            # 解析视频信息
            info = re.findall('window.__playinfo__=(.*?)', html)[0]
            json_data = json.loads(info)
    
            # 提取视频链接和音频链接
            video_url = json_data['data']['dash']['video'][0]['baseUrl']
            audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
            print(f"视频链接: {video_url}")
            print(f"音频链接: {audio_url}")
    
            # 下载视频内容
            video_content = requests.get(url=video_url, headers=headers).content
            # 下载音频内容
            audio_content = requests.get(url=audio_url, headers=headers).content
            if not os.path.exists('process_video'):
                os.makedirs('process_video')
            # 保存视频和音频数据
            with open(f'process_video\\{new_title}.mp4', mode='wb') as v:
                v.write(video_content)
            with open(f'process_video\\{new_title}.mp3', mode='wb') as a:
                a.write(audio_content)
            print("下载完成!")
            return new_title  # 返回视频标题
    
        except requests.exceptions.RequestException as e:
            print(f"请求错误: {e}")
        except json.JSONDecodeError:
            print("解析JSON时出错")
        except Exception as e:
            print(f"发生错误: {e}")
    
    def merge_video(title):
        print("开始合并视频...")
        if not os.path.exists('finally_video'):
            os.makedirs('finally_video')
        # 合并成完整的视频内容
        cmd = f'ffmpeg -hide_banner -i "process_video\\{title}.mp4" -i "process_video\\{title}.mp3" -c:v copy -c:a aac -strict experimental "finally_video\\{title}output.mp4"'
        # 调用命令
        subprocess.run(cmd)
    
    # 定义一个函数,用于替换文件名中的特定字符
    def sanitize_filename(filename):
        # 使用正则表达式替换文件名中的特定字符
        sanitized_filename = re.sub(r'[/\:*?<>|]', ' ', filename)
        return sanitized_filename
    
    if __name__ == '__main__':
        cookie = "buvid3=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut=1709986388; i-wanna-go-back=-1; b_ut=7; _uuid=6577D687-BED9-9AE2-106A10-551210627F5AC88087infoc; enable_web_push=DISABLE; buvid4=5ED5B3A0-A998-7D47-3815-9AD9A1B27A4989131-024030912-0Fw3r6dKwZLwPoWOl%2F8HuA%3D%3D; CURRENT_FNVAL=4048; rpdid=|(u|Jmkkuukk0J'u~u|ulR~)~; header_theme_version=CLOSE; fingerprint=c27c0b59dd10dcdc4c14701a58f49669; buvid_fp_plain=undefined; LIVE_BUVID=AUTO6217111182462626; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; bp_video_offset_691902317=925084214145056785; DedeUserID=691902317; DedeUserID__ckMd5=ead312019baad7ed; CURRENT_QUALITY=80; home_feed_column=4; PVID=1; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTY1NjYyODAsImlhdCI6MTcxNjMwNzAyMCwicGx0IjotMX0.4OcEc8xnUd8GPCTUkZM9UBejaRUnP0dhhjgL_DuFkgY; bili_ticket_expires=1716566220; SESSDATA=8abf5422%2C1731859084%2Ce2fa9%2A51CjD4mACI26GPIuH7wAe_rVLLXDq2VIckm2YvNvZpeMgzOMZCFVGss2CRvlLzxdOTmpASVk9nbUJtTU1QaWFqcUw1aWN5M19UMW0zdkhsZkdHRFdHdTZ1VVEzRUFmVUtKejhfS3FraFZ5WGM1OUstS1ZyeGRDTDhLM2Z1ekFuN09FcXFyaWIzWElnIIEC; bili_jct=ecb04e890e743862a38e01c7f37e08dd; bp_t_offset_691902317=934571401762832385; buvid_fp=c27c0b59dd10dcdc4c14701a58f49669; b_lsid=CB3EFD71_18FA63D003A; bmg_af_switch=1; bmg_src_def_domain=i0.hdslb.com; browser_resolution=675-639"
        filename = 'url.txt'
        # 打开文件
        with open(filename, 'r', encoding='utf-8') as file:
            # 逐行读取
            for line in file:
                # 打印每一行的内容
                print(line.strip())  # 使用strip()移除每行末尾的换行符
                url = line.strip()
                headers = {
                    "Referer": url,
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
                    "Cookie": cookie
                }
                # 调用函数
                title = download_video_and_audio(url, headers)
                merge_video(title)
    

    这里和之前的博客代码相比,在下载视频,获取其标题的时候,应该需要调用替换字符的函数。new_title = sanitize_filename(title)

    要注意,我把读取每行写在了最外面,因为考虑到如果将全部url读取,存到列表中,不太符合日常减少内存开销的好习惯。

    不过大家,平时可以将其封装成函数,然后返回一个都是url的列表。

  • 相关阅读:
    面试-01
    pgz-sbv-gf极狐低代码平台发布
    JavaScript原型链
    SMOGN算法Python实现:解决回归分析中的数据不平衡
    Springboot+Vue实现前后端分离校园二手交易平台
    【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
    戴森美发科技,呵护头皮水分0流失 戴森Supersonic™吹风机的头皮功效试验结果经中轻日用化学检验认证所确认
    [附源码]JAVA毕业设计-高中辅助教学系统-(系统+LW)
    网络安全(黑客技术)——如何高效自学
    《QA离业务代码能有多近?》QA对业务代码进行可测性改造
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/139400085