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__=(.*?)</script>', 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的列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/678196.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

邀请新人有奖励的APP推荐:三款新用户注册有奖励的软件

邀请新人有奖励的APP推荐&#xff1a;三款新用户注册有奖励的软件 在这个数字化时代&#xff0c;许多应用程序为了扩大用户基础和增加活跃度&#xff0c;推出了邀请新人有奖励的机制。对于喜欢尝试新应用的用户来说&#xff0c;这不仅是一个获得额外奖励的好机会&#xff0c;也…

飞利浦桌面隐藏文件夹怎么恢复?一文教你搞定

在日常使用飞利浦电脑时&#xff0c;我们有时可能会因为误操作或其他原因而将某些文件夹隐藏起来。这些隐藏文件夹可能包含重要的文件&#xff0c;一旦无法找到&#xff0c;会给我们的工作和生活带来不便。因此&#xff0c;了解如何恢复飞利浦桌面上的隐藏文件夹显得尤为重要。…

【UML用户指南】-02-UML基本元素的介绍(二)

目录 1、语法和语义规则 2、UML中的公共机制 &#xff08;1&#xff09;规约 &#xff08;2&#xff09;修饰 &#xff08;3&#xff09;通用划分 &#xff08;4&#xff09;扩展机制 衍型/版型/类型&#xff08;stereotype&#xff09; 标记值 &#xff08;tagged val…

解决Chat打开时Unable to load conversation 的问题

在开梯子的情况下打开chat依然很卡&#xff0c;这里选择edge的浏览器无痕模式&#xff08;新建InPrivate窗口&#xff09;&#xff0c;在无痕窗口下打开chat就可以了。

华为RH2288H V3服务器iBMC的SSL证书续期

本文对华为RH2288H V3服务器iBMC的SSL证书续期&#xff0c;以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC&#xff0c;点击配置--SSL证书&#xff0c;如下&#xff1a; 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…

高级无人机系统开发:基于STM32

目录 引言环境准备无人机控制系统基础代码示例&#xff1a;实现无人机控制系统 4.1 姿态传感器数据读取4.2 电机控制4.3 GPS数据处理4.4 用户界面与显示应用场景&#xff1a;无人机导航与稳定控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系…

离屏粒子优化

一、GPU Gems3 Chapter 23&#xff1a;高速的离屏粒子 原文&#xff1a;Chapter 23. High-Speed, Off-Screen Particles 粒子特效一直是一个游戏开发中非常吃性能的点&#xff0c;特点就在于①数量不固定&#xff0c;在极端情况下同时存在的特效数量特别多&#xff0c;不且好合…

第二证券炒股知识:短线炒股技巧?

在股票商场上&#xff0c;出资者分为长线和短线这两大类&#xff0c;其中短线炒股存在以下技巧&#xff1a; 1、早盘集合竞价时刻上的技巧 早上集合竞价对短线出资者来说比较重要&#xff0c;其中早上集合竞价期间9&#xff1a;15-9:20之间出资者可以进行撤单操作&#xff0c…

Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139424086 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子网络科技博…

中学生学人工智能系列:如何用AI学生物

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出…

【Python】 探索Python中的2D数组峰值检测

基本原理 在Python编程中&#xff0c;经常会遇到需要处理多维数组的场景。2D数组&#xff0c;也就是二维数组&#xff0c;是数组的一种形式&#xff0c;它由多个一维数组组成&#xff0c;可以想象成一个矩阵。峰值检测是数据分析中的一项常见任务&#xff0c;特别是在信号处理…

航空交流电源车:高品质电源,保障飞机正常运行

航空交流插电式电源车作为一种专为航空飞机提供稳定交流电源的地面支持设备。它能够满足航空器在地面运行过程中的电力需求&#xff0c;如维护、试验和充电等。这种电源车采用电能作为动力来源&#xff0c;具有环保、节能、安全、可靠等特点。航空交流插电式电源车作为一种创新…

Elastic Connectors:增量同步对性能的影响

作者&#xff1a;Artem Shelkovnikov Elastic 连接器是一种 Elastic 集成&#xff0c;可将数据从原始数据源同步到 Elasticsearch 索引。连接器使你能够创建可搜索的只读数据源副本。 有许多连接器支持各种第三方&#xff0c;例如&#xff1a; MongoDB各种 SQL DBMS&#xff…

AMD提前发布新AI芯片,硬刚英伟达!Zen 5架构性能提高一倍

眼看着英伟达要打破摩尔定律&#xff0c;开启一年一更的新时代&#xff1b;搭载高通骁龙新芯片的设备&#xff0c;也将于数日后上市。AMD这坐不住啊&#xff1a;这风头怎么都被别人抢了&#xff1f; 于是&#xff0c;在周一的COMPUTEX&#xff08;台北国际电脑展&#xff09;上…

借助调试工具理解BLE协议_2.BLE协议栈

名词解释&#xff1a; BT SIG英文全称为Bluetooth Special Interest Group&#xff08;蓝牙特别兴趣组&#xff09;&#xff0c;网址为 www.Bluetooth.com。 Bluetooth Technology Website SIG成立于1998年&#xff0c;是一个全球技术交流组织&#xff0c;拥有超过36000家公…

centos7下卸载MySQL,Oracle数据库

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

Linux云计算架构师涨薪班课程内容包含哪些?

第一阶段&#xff1a;Linux云计算运维初级工程师 目标 云计算工程师&#xff0c;Linux运维工程师都必须掌握Linux的基本功&#xff0c;这是一切的根本&#xff0c;必须全部掌握&#xff0c;非常重要&#xff0c;有了这些基础&#xff0c;学习上层业务和云计算等都非常快&#x…

常见的多态面试题

多态的概念及其构成条件 多态概念&#xff1a;对不同的对象会有不同的实现方法&#xff0c;即为多种形态。 构成条件&#xff1a; 派生类要进行虚函数的重写&#xff08;父子类虚函数需要三同&#xff0c;三同指函数名、参数、返回值&#xff09;要用父类的指针或引用去调用虚…

黄仁勋的AI时代:英伟达GPU革命的狂欢与挑战

在最近的COMPUTEX 2024大会上&#xff0c;英伟达创始人黄仁勋发布了最新的Blackwell GPU。这次发布不仅标志着英伟达在AI领域的又一次飞跃&#xff0c;也展示了其对未来技术发展的战略规划。本文将详细解析英伟达最新技术的亮点&#xff0c;探讨其在AI时代的市场地位和未来挑战…

Transformer学习(2)

这是Transformer的第二篇文章&#xff0c;上篇文章中我们了解了分词算法BPE&#xff0c;本文我们继续了解Transformer中的位置编码和核心模块——多头注意力。下篇文章就可以实现完整的Transformer架构。 位置编码 我们首先根据BPE算法得到文本切分后的子词标记&#xff0c;然…