Python3 获取B站经blob处理后的真实视频下载地址

本文详细解析了如何从B站获取视频的真实下载地址,并通过Python代码实现视频的下载过程,包括处理反爬措施和提取视频链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看源代码,可看到现在B站的视频地址经过blob处理,而且在去掉blob之后,也是没有办法访问的,不能直接下载,那就只能去分析请求了
在这里插入图片描述

发现网页发送了这样一个请求,我们都知道B站的视频格式是 .flv的,仔细看一下这个地址的前面一小段,有…acgvideo.com…xxx.flv,大致就可以判定这就是真实的视频地址,但是直接复制这个地址去网页访问或者requests,是禁止访问的,因为B站加了反爬,需要添加请求头才行。
在这里插入图片描述
现在的问题是怎么去获取这个视频地址?要么存放在网页里,要么是经过js处理后得到的,很幸运,B站直接把这个地址放在了网页里。分析一下这个链接的请求参数,随便找一个比较有特点的参数名在网页源代码里搜一下就ok了,我这里选了trid,经过比对,发现url后面的那一长串我们想要的视频地址
在这里插入图片描述
在这里插入图片描述
以下载Dream it possible为例,用正则表达式匹配出视频地址和视频名字

import requests
import re

base_url = 'https://www.bilibili.com/video/av6499012'

#访问起始网页需添加的请求头,不加的话,得不到完整的源代码(反爬)
base_headers = {
	'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0',
	'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
	'Accept-Encoding': 'gzip, deflate, br',
	'Accept-Language': 'zh-CN,zh;q = 0.9'
	}

#请求视频下载地址时需要添加的请求头
download_headers = {
	'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0',
	'Referer':'https://www.bilibili.com/video/av6499012',
	'Origin':'https://www.bilibili.com',
	'Host':'upos-hz-mirrorkodou.acgvideo.com',
	'Accept':'*/*',
	'Accept-Encoding':'gzip, deflate, sdch, br',
	'Accept-Language':'zh-CN,zh;q=0.8'
	}


base_response = requests.get(base_url,headers=base_headers)
html = base_response.text
video_name = re.search('<span class="tit">(.*?)</span>',html,re.S).group(1) + '.flv'
download_url = re.search('window.__playinfo__={.*?"url":"(.*?)".*?}',html,re.S).group(1)
print(video_name)
with open(video_name, 'wb') as f:
	f.write(requests.get(download_url, headers=download_headers, stream=True, verify=False).content)

在这里插入图片描述
flv格式的视频可以用KMPlayer播放

### 使用Python实现从B下载视频 为了高效地从B下载视频,可以采用多种策略。一种常见的做法是利用API接口直接获取视频地址,而不是尝试拼接多个分段的Blob文件[^2]。 #### 准备工作 首先安装必要的库: ```bash pip install requests lxml ``` 接着准备用于解析HTML文档以及发起HTTP请求的基础工具。 #### 获取视频真实URL 由于B采用了防盗链机制,因此简单的通过浏览器开发者工具复制下来的链接可能无法直接使用。可以通过访问带有特定参数的API端点来获得有效的下载链接。通常这涉及到发送包含`aid`(稿件ID)、`cid`(分P ID)等信息在内的GET请求给官方提供的JSON API服务[^1]。 #### 编写下载器代码 下面展示了一个简化版的例子,该例子展示了如何构建一个基本的功能模块来完成上述过程中的主要部分——即提取并保存目标媒体文件至本地磁盘中: ```python import os import json import requests def get_video_info(aid, cid): url = f"https://api.bilibili.com/x/player/playurl?avid={aid}&cid={cid}" response = requests.get(url).json() if &#39;data&#39; not in response or &#39;durl&#39; not in response[&#39;data&#39;]: raise Exception(&#39;Failed to fetch video info&#39;) durls = response[&#39;data&#39;][&#39;durl&#39;] return durls[0][&#39;url&#39;] # 只取第一个分段作为示例 def download_file(file_url, output_path): with open(output_path, "wb") as file: print(f"Downloading {output_path}...") response = requests.get(file_url, stream=True) total_length = int(response.headers.get("content-length")) downloaded_size = 0 for chunk in response.iter_content(chunk_size=8192): if chunk: file.write(chunk) downloaded_size += len(chunk) progress = (downloaded_size / total_length) * 100 print(f"\rProgress: [{int(progress)}%]", end="") print("\nDownload completed!") if __name__ == "__main__": aid = input("请输入AV号:") cid = input("请输入CID:") try: video_url = get_video_info(aid.strip(), cid.strip()) filename = f"{aid}.flv" filepath = os.path.join(os.getcwd(), filename) download_file(video_url, filepath) except Exception as e: print(e) ``` 这段程序会提示用户提供所需的`aid`和`cid`编号,并据此调用相应的函数执行具体的任务。需要注意的是实际应用时还需要考虑更多的异常处理逻辑以应对可能出现的各种情况,比如网络错误或是非法输入等问题[^4]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值