深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频
引言
Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一个脚本,自动化地爬取Bilibili上的视频,并将其保存到本地。
环境准备
在开始之前,请确保你已经安装了以下Python库:
- requests:用于发送HTTP请求。
- json:用于解析JSON数据。
- re:用于正则表达式匹配。
- os:用于操作系统功能,如文件路径操作。
- subprocess:用于执行外部命令,如调用ffmpeg。
- sys:用于访问与Python解释器密切相关的变量和函数。
可以通过以下命令安装所需的库:
pip install requests
代码解析
1. 导入必要的库
import requests
import json
import pprint
import re
import os
import subprocess
import sys
2. 获取URL响应体
定义一个函数getResponse,用于发送GET请求并获取响应体。
def getResponse(url):headers = {'referer': 'https://www.bilibili.com/','User-Agent': 'Mozilla/5.0 ...'}response = requests.get(url=url, headers=headers)return response
3. 解析响应体
定义函数parseResponse,用于解析视频页面的响应体,并提取视频和音频的URL。
def parseResponse(url):# ... 省略部分代码 ...jsonData = json.loads(html_data)videoTitle = re.findall('<title ...', response.text)[0]audioUrl = jsonData['data']['dash']['audio'][0]['baseUrl']videoUrl = jsonData['data']['dash']['video'][0]['baseUrl']videoInfo = {'videoTitle': videoTitle,'audioUrl': audioUrl,'videoUrl': videoUrl,}return videoInfo
4. 保存视频和音频
定义函数saveMedia,用于将下载的媒体内容保存到本地文件。
def saveMedia(fileName, content, mediaType):os.makedirs('D:\\bilibili', exist_ok=True)with open(f'D:\\bilibili\\{fileName}.{mediaType}', 'wb') as f:f.write(content)
5. 合并音频和视频
定义函数AvMerge,使用ffmpeg合并音频和视频文件。
def AvMerge(Mp3Name, Mp4Name, savePath):# 使用subprocess调用ffmpeg合并音频和视频subprocess.run(['ffmpeg', '-i', Mp4Name, '-i', Mp3Name, '-c:v', 'copy', ...])
6. 主函数
main函数是脚本的入口点,负责调用上述函数完成整个爬取和保存流程。
def main():url = input("请输入B站视频url地址:")videoInfo = parseResponse(url)# ... 省略部分代码 ...AvMerge(Mp3Name, Mp4Name, savePath)
结语
通过上述脚本,我们可以实现自动化下载Bilibili视频的功能。这不仅大大提升了下载效率,也让我们对Python网络编程有了更深入的理解。请注意,爬虫的使用应遵守网站的爬虫政策和法律法规,合理使用爬虫技术。
代码结果
注意事项
- 确保在合法合规的前提下使用爬虫技术。
- 尊重视频作者的版权,不要用于商业用途。
- 考虑到Bilibili网站的反爬措施,可能需要更新请求头或使用代理。
附录
- ffmpeg下载: FFmpeg官网
- Python库文档: Requests, json
本文提供了一个基于Python的Bilibili视频爬取方案,希望能够帮助到有需要的朋友。如果你有任何问题或建议,请随时与我联系。
完整代码:
import requests
import json
import pprint
import re
import os
import subprocess
import sys"""获取url响应体"""
def getResponse(url):# 设置请求头headers = {'referer': 'https://www.bilibili.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'}# 发起get请求response = requests.get(url=url, headers=headers)return response"""解析响应体"""
def parseResponse(url):# 获取url响应体response = getResponse(url)# 用正则表达式取出返回的视频数据html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]# 解析成json数据jsonData = json.loads(html_data)# 获取视频标题videoTitle = re.findall('<title data-vue-meta="true">(.*?)</title>', response.text)[0]# 获取音频audioUrl = jsonData['data']['dash']['audio'][0]['baseUrl']# 获取视频videoUrl = jsonData['data']['dash']['video'][0]['baseUrl']# 封装视频信息videoInfo = {'videoTitle': videoTitle,'audioUrl': audioUrl,'videoUrl': videoUrl,}print("获取Response信息成功!")return videoInfo"""保存视频和音频"""
def saveMedia(fileName, content, mediaType):# 创建目录(如果不存在)os.makedirs('D:\\bilibili', exist_ok=True)# 写入文件with open(f'D:\\bilibili\\{fileName}.{mediaType}', mode='wb') as f:f.write(content)print(f"保存{mediaType}成功!")def AvMerge(Mp3Name, Mp4Name, savePath):print("开始合并音频和视频.........")print(f"音频文件: {Mp3Name}")print(f"视频文件: {Mp4Name}")print(f"合并后文件保存路径: {savePath}")# 使用subprocess来调用ffmpeg,并重定向输出with open(os.devnull, 'w') as devnull:result = subprocess.run(['ffmpeg', '-i', Mp4Name, '-i', Mp3Name, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', savePath],stdout=devnull,stderr=devnull)print("合并成功!")os.remove(Mp3Name)os.remove(Mp4Name)def main():url = input("请输入B站视频url地址:")videoInfo = parseResponse(url)# 获取视频标题fileName = videoInfo['videoTitle']# 下载并保存音频audioContent = getResponse(videoInfo['audioUrl']).contentsaveMedia(fileName, audioContent, 'mp3')# 下载并保存视频videoContent = getResponse(videoInfo['videoUrl']).contentsaveMedia(fileName, videoContent, 'mp4')Mp3Name = f'D:\\bilibili\\{fileName}.mp3'Mp4Name = f'D:\\bilibili\\{fileName}.mp4'savePath = f'D:\\bilibili\\merge_{fileName}.mp4'AvMerge(Mp3Name, Mp4Name, savePath)if __name__ == '__main__':main()
相关文章:
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
GRE,MGRE
GRE:静态过程,有局限性 R1 : [r1]interface Tunnel 0/0/0 --- 创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 给隧道接口分配一个 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定义接口的封装方式 [r1-Tun…...
【linux学习】linux系统调用编程
目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…...
Azure Speech 赋能,为智能硬件注入 AI 语音 “新灵魂”
在人工智能技术飞速发展的今天,智能硬件正逐步渗透到人们生活的方方面面。AI玩具、AI眼镜、AI鼠标等创新产品不仅提升了用户体验,更带来了前所未有的交互方式。领驭科技凭借微软Azure Speech的强大技术能力,为硬件厂商提供一站式AI语音解决方…...
力扣DAY35 | 热100 | LRU缓存
前言 中等 ⚪ 这个题原本打算用双链表最小堆做,发现无解。没想到双向链表。 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int …...
Python 助力人工智能与机器学习的深度融合
技术革新的 “源动力” 在当今数字化时代,人工智能(AI)与机器学习(ML)无疑是最具影响力的技术领域,它们如同强大的引擎,推动着各个行业的变革与发展。Python 凭借其简洁易读的语法、丰富的库和…...
ARXML文件解析-1
目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 ARXML文件的结构树2.3 TAG(XML元素)2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 XML声明与根元素4.4.3.1 xmlns(默认命名空间)4.4.3.2 xmlns:xsi&…...
SignalR给特定User发送消息
1、背景 官网上SignalR的demo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个: 1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接,…...
React: hook相当于函数吗?
一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…...
Ubuntu 安装 VLC
最近项目中需要用VLC查看NVR下子设备的RTSP流,特此记录,便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...
UBUNTU编译datalink
参考文档 datalink 语雀 下载 git clone https://gitee.com/liyang9512/datalink 源码打包 mvn -Prelease-datalink -Dmaven.test.skiptrue clean install -U 启动准备 # unzip ./distribution/target/datalink-server-1.0.0.tar.gz tar -xvf ./distribution/target/da…...
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先,我们详细介绍了SSM框架,这是一种经典的Java Web开发框架,由Spring、SpringMVC和MyBatis三个开源项目整合而成,为开发企业级应用提供了高效、灵活、…...
STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.04 STM32开发板学习——第14节: [6-2] 定时器定时中断&定时器外部时钟 前言开发…...
2025-04-03 Latex学习1——本地配置Latex + VScode环境
文章目录 1 安装 Latex2 安装 VScode3 配置环境3.1 汉化 VScode3.2 安装 latex 插件3.3 配置解释 4 编译示例5 加快你的编译5.1 取消压缩5.2 使用 PDF 代替图片 6 参考文章 1 安装 Latex 本文配置环境: Windows11 打开清华大学开源软件镜像站:https://mi…...
【CF】Day24——Codeforces Round 994 (Div. 2) D
D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…...
【Java集合】LinkedList源码深度分析
参考笔记:java LinkedList 源码分析(通俗易懂)_linkedlist源码分析-CSDN博客 目录 1.前言 2.LinkedList简介 3.LinkedList的底层实现 4.LinkedList 与 ArrayList 的对比 4.1 如何选择 4.2 对比图 5.LinkedList 源码Debug 5.1 add(E e) ÿ…...
第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组
题目1 回文数组 小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i∈[1,n] 满足 a i a n − i 1 a_ia_{n−i}1 aian−i1。 小蓝…...
高并发系统架构设计的深度解析与实施指南【大模型总结】
以下是对高并发系统架构设计的深度解析与实施指南,通过技术分层拆解和场景化案例说明,呈现完整的系统设计方法论: 一、容错优先思维的系统级实现 1. 混沌工程落地框架 # 混沌实验设计模板 class ChaosExperiment:def __init__(self, scope,…...
Python办公自动化(2)对wordpdf的操作
一、操作word文档 终端下载操作word文件的工具库: pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx 1.遍历文档中内容 paragraphs:段落属性,返回列表类型的段落地址,遍历每一个段落地址,通过…...
pip安装第三方库,但PyCharm中却无法识别
点击菜单栏File,选择Settings 系统默认的是PyCharm安装目录下的python.exe 解释器,不要用。 选择你的PYTHON的安装目录下的python.exe 解释器。如果不存在的话,增加进去 如果文件》设置打不开,需移除法化包。 打开 pycharm 安装目…...
新浪财经股票每天10点自动爬取
老规矩还是先分好三步,获取数据,解析数据,存储数据 因为股票是实时的,所以要加个cookie值,最好分线程或者爬取数据时等待爬取,不然会封ip 废话不多数,直接上代码 import matplotlib import r…...
Vue2 父子组件数据传递与调用:从 ref 到 $emit
提示:https://github.com/jeecgboot/jeecgboot-vue2 文章目录 案例父组件向子组件传递数据的方式父组件调用子组件方法的方式子组件向父组件传递数据的方式流程示意图 案例 提示:以下是本篇文章正文内容,下面案例可供参考 以下是 整合后的关…...
Linux C++编译及g++使用操作
编译的步骤 编译选项参数 编译生成库文件 静态库 动态库 运行可执行文件 静态库由于已经包含了链接的文件所以可以直接执行;动态库方式由于是运行时链接,所以需要指定链接的路径;...
antvX6自定义 HTML 节点创建与更新教程
自定义 HTML 节点创建与更新教程 本文详细介绍如何利用 HTML、CSS 和 JavaScript 创建自定义节点,并通过动态更新节点数据来改变节点显示效果。无论你是否有前端基础,都能轻松跟着本教程一步步实现。 1. 基础样式设置 首先,使用 CSS 定义基…...
【Android】界面布局-线性布局LinearLayout-例子
线性布局(LinearLayout)是一种重要的界面布局中,也是经常使用到的一种界面布局 • 在线性布局中,所有的子元素都按照垂直或水平的顺序在界面上排列 ➢如果垂直排列,则每行仅包含一个界面元素 ➢如果水平排列&…...
Cortex-M 上编写汇编函数
在 ARM Cortex-M 系列单片机中使用汇编语言编写函数时,需要特别注意寄存器的使用、栈管理、调用约定以及与 C 语言的兼容性。以下是关键注意事项和示例说明: 1. 遵循 AAPCS 调用约定 ARM 定义了 AAPCS(ARM Architecture Procedure Call Standard),规定了函数调用时寄存器…...
windows技术基础知识
NT架构 NT 就是new techonology 的英文单词缩写,是微软1993年推出操作系统的重大升级,如内存管理,安全机制,多任务,多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面,只有有限的内存管理和多任…...
在 Windows 环境下使用 VSCode 和 TinyGo 开发 ESP8266(NodeMcu) or STM32
支持的型号 https://tinygo.org/docs/reference/microcontrollers/ 1. 安装Go 2. 安装TinyGo,并添加环境变量 https://github.com/tinygo-org/tinygo/releases 3. VSCode配置,安装插件,选择设备 package mainimport ("machine"&q…...
计算机视觉算法实战——基于YOLOv8的汽车试验场积水路段识别系统
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 引言:汽车试验场智能化管理的迫切需求 在现代汽车研发流程中,试验场作为验证车辆性…...
