python爬虫--小白篇【爬取B站视频】

news2024/12/13 16:20:25

目录

一、任务分析 

二、网页分析

三、任务实现


一、任务分析 

        将B站视频爬取并保存到本地,经过分析可知可以分为四个步骤,分别是:

  1. 爬取视频页的网页源代码;
  2. 提取视频和音频的播放地址;
  3. 下载并保存视频和音频;
  4. 合并视频和音频,使用ffmpeg模块;

二、网页分析

        在分析网页前,需要明白爬取的数据是什么,由于b站的视频跟音频是分开存放的,所以我们需要分别找到视频和音频的url,然后在对其发起请求将视频和音频保存至本地;最后将两者合并在一起,才能形成完整的视频文件。

1、先登录B站,选择想要下载的视频,打开浏览器开发者模式,刷新网页,寻找数据接口;

2、经过分析,在文档下发现了一个文件,该文件源码中就存放了视频和音频的url地址,向该文件接口发起请求,将视频和音频的url地址解析出来;

3、得到该数据接口的请求url和请求参数

4、找到所需的数据接口后,先分析一下网页源码,我们发现视频url存放在一个 <script>标签下的 video下,发现音频url在 audio 下的 baseUrl中;

三、任务实现

        前期准备:编写代码前,需要大家安装一个第三方工具ffmpeg,用于合并视频和音频。

        代码实现:

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :B站视频爬取
@Time :2024/12/11 9:28
@Motto:一直努力,一直奋进,保持平常心

"""
import os
import pprint
import re

# 1、爬取视频页的网页源代码
import requests
import json
from lxml import etree
header = {
    "referer": "https://www.bilibili.com",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}

# 2、提取视频和音频的播放地址
def get_play_url(url):
    r = requests.get(url, headers=header)
    # print(r.text)
    info = re.findall('window.__playinfo__=(.*?)</script>', r.text)[0]
    video_url = json.loads(info)["data"]["dash"]["video"][0]["baseUrl"]
    audio_url = json.loads(info)["data"]["dash"]["audio"][0]["baseUrl"]
    # print(video_url)
    # print(audio_url)
    html = etree.HTML(r.text)
    filename = html.xpath('//h1/text()')[0]
    # print(filename)
    return video_url, audio_url, filename

# 3、下载并保存视频和音频
def download_files(video_url, audio_url, filename, video_path,audio_path):
    print("开始下载视频和音频")
    video_content = requests.get(video_url, headers=header).content
    audio_content = requests.get(audio_url, headers=header).content

    with open(f'{video_path}/{filename}.mp4', 'wb') as f:
        f.write(video_content)
        print("视频部分下载完毕")
    with open(f'{audio_path}/{filename}.mp3', 'wb') as f:
        f.write(audio_content)
        print("音频部分下载完毕")


# 4、合并视频和音频,使用ffmpeg模块
def combin_video_audio(filename, video_path, audio_path):
    # cmd = fr"ffmpeg -i {video_path}{filename}.mp4 -i {audio_path}{filename}.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a {video_path}\output-{filename}.mp4 -loglevel quiet"  # -loglevel quiet 表示隐藏日志,不加问题不大
    cmd = fr"D:\ApplicationsSoftware\FFmpeg\ffmpeg-7.1-full_build\ffmpeg-7.1-full_build\bin\ffmpeg -i {video_path}/{filename}.mp4 -i {audio_path}/{filename}.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a {video_path}/output-{filename}.mp4 -loglevel quiet"  # -loglevel quiet 表示隐藏日志,不加问题不大
    os.system(cmd)
    print("音频视频合并完毕")
    print("--"*10)
    os.remove(f'{video_path}/{filename}.mp4')
    os.remove(f'{audio_path}/{filename}.mp3')
    print('已删除多余的文件')


if __name__ == '__main__':
    # url = 'https://www.bilibili.com/video/BV1AA4y1D7h2/?spm_id_from=333.337.search-card.all.click&vd_source=d9407807cd22419d13fabdc976906958'
    url = 'https://www.bilibili.com/video/BV1F6qnYoEz1/?t=6&spm_id_from=333.1007.tianma.3-3-9.click'
    video_path = r'D:\ProjectCode\Spider\StudySpider07\videos'
    audio_path = r'D:\ProjectCode\Spider\StudySpider07\audio'
    video_url, audio_url, filename = get_play_url(url)
    download_files(video_url, audio_url, filename, video_path, audio_path)
    combin_video_audio(filename, video_path, audio_path)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】实验18:动态主机配置协议DHCP的作用

实验18 动态主机配置协议DHCP的作用 一、实验目的 验证动态主机协议DHCP的作用 二、实验环境 Cisco Packet Tracer模拟器 三、实验过程 1.构建网络拓扑&#xff0c;不给局域网中的各主机手动配置IP地址、子网掩码、默认网关、DNS服务器等信息&#xff0c;而是开启动态主机…

MFC案例:基于对话框的简易阅读器

一、功能目标&#xff1a; 1.阅读txt文件 2.阅读时可以调整字体及字的大小 3.打开曾经阅读过的文件时&#xff0c;能够自动从上次阅读结束的位置开始显示&#xff0c;也就是能够保存和再次使用阅读信息。 4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。 5.显示…

【开源】基于SpringBoot框架的个性化的旅游网站 (计算机毕业设计)+万字毕业论文 T025

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

谷粒商城—分布式基础

1. 整体介绍 1)安装vagrant 2)安装Centos7 $ vagrant init centos/7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on…

MySQL概述以及下载安装

MySQL5.7概述以及下载安装&#xff08;centOS7&#xff09; 一、MySQL简介 MySQL是一个典型的关系数据库&#xff0c;目前是Oracle公司产品之一&#xff0c;也是目前主流使用的关系型数据库之一。使用MySQL可以进行最基本的数据存储、管理、查询等操作&#xff0c;也可以方便的…

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来&#xff0c;失望而归。主要是对如下失望&#xff0c;下述仅个人看房感受&#xff1a; 1. 户型不喜欢&#xff1a;三房的厨房和餐厅位置很奇葩 2. 样板间在25楼&#xff1a;湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …

轮播(css+js)

目录 1.实现效果 2.基础代码演示 2.1js代码 2.1css样式 2.3实现效果 3.实现点击切换 3.1给button添加点击事件 3.2效果图如下 3.3发现问题 3.3.1不循环 3.3.2循环 1.实现效果 2.基础代码演示 2.1js代码 <div class"out-box"><div class"tes…

深度学习(2)前向传播与反向传播

这一次我们重点讲解前向传播与反向传播&#xff0c;对这里还是有点糊涂 前向传播&#xff08;Forward Propagation&#xff09;和反向传播&#xff08;Backward Propagation&#xff09;是深度学习中神经网络训练的核心过程。它们分别负责计算神经网络的输出以及更新神经网络的…

HTML5 拖拽 API 深度解析

一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算&#xff0c;而 HTML5 提供了标准化的拖拽事件和数据传递机制&#xff0c;使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…

前端自己也能开启HTTPS

目录 前言 使用mkcert 安装 创建证书 利用 mkcert 创建 ca 根据 ca 创建 cert 安装证书 项目开启HTTPS 安装插件 配置 vitecofnig.js 最终效果 前言 今天我发现了一个宝藏&#xff0c;兄弟们&#xff01;就是前端开发阶段是可以使用https来开发的。对不懂前端的后端兄…

精通 Python 网络安全

与 FTP、SSH 和 SNMP 服务器交互 本章将帮助您了解允许我们与 FTP、SSH 和 SNMP 服务器交互的模块。在本章中&#xff0c;我们将探讨网络中的计算机如何相互交互。一些允许我们连接 FTP、SSH 和 SNMP 服务器的工具可以在 Python 中找到&#xff0c;其中我们可以突出显示 FTPLi…

【C++跬步积累】 —— 二叉搜索树(模拟实现+源代码)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;C跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; Linux跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0…

Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)

环境 Windows11 Python3.X Pycharm社区版 思路 1 github下载redis压缩包 &#xff0c;安装并启动redis服务&#xff0c;在客户端连接redis服务。 2 在pycharm中运行python程序&#xff0c;连接redis服务&#xff0c;熟悉redis的使用和巩固python语言。 3 python开发环境…

【电子通识】能用5V电源去驱动线圈电压12V的继电器吗?

最近新人在使用继电器做一些工装&#xff0c;选择的是一款汽车级的继电器JZC-32F/012-ZS3(555) 。其原因主要是因为封装小&#xff0c;通流能力也OK。 但因为产品是5V USB-TypeC接口供电的&#xff0c;所以他想用5V电源去驱动继电器&#xff0c;从而减少一个电源输入或是电源升…

先进电机拓扑及控制算法介绍(2)——开绕组电机拓扑的容错控制

1.引言 共直流母线开绕组电机拓扑通过打开绕组中性点&#xff0c;电机绕组可由单逆变器供电改为双逆变器供电&#xff0c;这可以将电机的调速范围扩大为原来的两倍&#xff08;考虑到三次谐波反电势的因素&#xff0c;最低也可以把转速扩大为原来的根号3倍&#xff09;。扩大转…

️️️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践20241212

&#x1f6e1;️ 避坑指南&#xff1a;如何修复国密gmssl 库填充问题并提炼优秀加密实践 ✨ 引言 在当下的数据安全环境中&#xff0c;SM4作为中国国家密码算法的代表性选择&#xff0c;被广泛应用于金融、通信和政府领域。然而&#xff0c;在实际开发中&#xff0c;即便是开…

C++ webrtc开发(非原生开发,linux上使用libdatachannel库)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少&#xff0c;经过我一段时间的探…

【工具】linux matlab 的使用

问题1 - 复制图表 在使用linux matlab画图后&#xff0c;无法保存figure。 例如在windows下 但是在linux下并没有这个“Copy Figure”的选项。 这是因为 “ The Copy Figure option is not available on Linux systems. Use the programmatic alternative.” 解决方案&…

系统思考—本质

“执行力不足&#xff0c;真的是问题的根本吗&#xff1f;” 最近我和不少企业创办人交流时&#xff0c;大家普遍提到“执行力”的问题&#xff0c;但我发现&#xff0c;背后其实隐藏着更深层次的原因。当我用系统思考的视角深入拆解时&#xff0c;执行力不足&#xff0c;未必…

模方如何置平处理模型表面?

(1) 点击“多边形绘制“后在编辑模型视图中通过绘制多边形对 OBJ 进行编辑&#xff0c;将立面进行置平处理 选择需要表面置平的范围 (2) 点击“置平“即可看到效果