Bilibili播放-获取B站播放视频源地址的过程

本文介绍了一种从B站直接获取视频播放源地址的方法,利用ibilibili.com网站和B站API,实现了视频ID输入后快速获取播放源,适用于嵌入式应用或网页播放需求。

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

如果是为了下载B站视频呢,直接用 You-get,然而,我们的需求就是要在线看B站视频(清晰度要求不高),要求内嵌在自己的程序中,直接观看,加载速度要快!那先下载再预览绝对是不行了。只能尝试去获取播放源地址

如果你对这方面有兴趣,可以和我们一群程序员交流学习,共同进步

695623459

获取播放源地址的过程很曲折,移动端抓包,PC-web端分析,后来,发现一个网站,终于找到了一线希望。

就是ibilibili.com
这个网站的功能呢,就是很方便的让你获取B站视频的下载地址,同时,它还会有一个播放器供你预览。有多方便呢?
这是一个B站视频的链接,视频id是49023450
https://www.bilibili.com/video/av49023450
当你在bilibili前面加个i时,类似下面,你就直接获取到你想要的了
https://www.ibilibili.com/video/av49023450
获取到的视频
很明显,这就是直接拿到播放源地址了,这是我们达到目标的捷径无疑了。
查看源代码,将无用数据都删光!
看到了赤裸裸的××

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<script src="http://cdn.staticfile.org/jquery/1.9.1/jquery.min.js"></script>
<body>
<div id="vd"></div>
<audio id="player" autoplay="autoplay"></audio>
<script>
    function callbackfunction(j){
				var u = j.durl[0].url;
				$("#vd").html('<video width="680" height="376" src="'+u+'" preload="auto" autoplay="" controls="" class="embed-responsive-item"></video>')
				$("#page1").attr("href",j.durl[0].url);
    }
    function parseVideo(page){
				$.getScript("http://api.bilibili.com/playurl?callback=callbackfunction&aid=49619819&page="+page+"&platform=html5&quality=3&vtype=mp4&type=jsonp");
    }
    parseVideo(1)

</script>

</body>
</html>

看到了吧,首先通过B站的一个接口,拿到播放源的信息
aid 就是 avid,视频id

function parseVideo(page){
  $.getScript("http://api.bilibili.com/playurl?callback=callbackfunction&aid=49619819&page="+page+"&platform=html5&quality=3&vtype=mp4&type=jsonp");
}

response

callbackfunction({
	"from": "local",
	"result": "suee",
	"quality": 6,
	"format": "mp4",
	"timelength": 268633,
	"accept_format": "mp4",
	"accept_quality": [6],
	"video_codecid": 7,
	"video_project": false,
	"seek_param": "start",
	"seek_type": "second",
	"durl": [{
		"order": 1,
		"length": 268633,
		"size": 8025970,
		"url": "http:\/\/upos-hz-mirrorks3u.acgvideo.com\/upgcxcode\/93\/11\/86881193\/86881193-1-6.mp4?e=ig8euxZM2rNcNbug7WdVtWug7WdVNEVEuCIv29hEn0l5QK==&deadline=1555647031&gen=playurl&nbs=1&oi=3742041866&os=ks3u&platform=html5&trid=812e5d046a8a4213bf3119bdf184f128&uipk=5&upsig=97ec92a9612234c4c4ce7b29e27d5ef4&uparams=e,deadline,gen,nbs,oi,os,platform,trid,uipk"
	}],
	"img": "https:\/\/i1.hdslb.com\/bfs\/archive\/70492d7b0760a9e38c8573b421c3dc8128232b09.jpg",
	"cid": "https:\/\/comment.bilibili.com\/86881193.xml",
	"fromview": "vupload"
});

durl[n].url 就是播放源
然后将获取到的播放源插入到页面上

var u = j.durl[0].url;
$("#vd").html('<video width="680" height="376" src="'+u+'" preload="auto" autoplay="" controls="" class="embed-responsive-item"></video>')

那我们试一试。
视频无法在网页加载
该链接 open_in_new_tab 没有问题,该链接的deadline也没有过期,再看详细信息
报错信息
403,referrer 策略是 no-referrer-when-downgrade
来源信息对于网站而言挺重要
那我们在head里面加一条

<meta name="referrer" content="no-referrer">

OK 了
就OK了

### 如何使用 Python 爬虫抓取 B 充电视频数据 要实现对 B 充电视频的数据抓取,可以基于 `requests` 和 `BeautifulSoup` 库来完成网页内容的提取和解析。以下是具体的方法说明以及注意事项: #### 技术准备 为了成功抓取目标数据,需先安装必要的依赖库: ```bash pip install requests beautifulsoup4 lxml ``` 这些工具的作用如下: - **Requests**: 用于发送 HTTP 请求并获取响应内容。 - **BeautifulSoup**: 提供强大的 HTML 解析功能,便于定位 DOM 结构中的特定节点。 --- #### 数据分析 B 的充电视频通常位于专门的页面路径下(例如 `/cheese/pagelist?media_id=...`),因此需要明确目标 URL 的结构特点[^1]。通过浏览器开发者工具查看网络请求记录,可发现加载视频列表时会调用 API 接口返回 JSON 格式的动态数据。 假设已知某个充电课程 ID (`media_id`),则可通过访问类似以下接口地址获得详情: ``` https://api.bilibili.com/x/web-interface/view?bvid={bvid} ``` 其中 `{bvid}` 是每条视频唯一标识符。 --- #### 编写爬虫脚本 下面提供一段完整的代码示例,展示如何利用 Python 完成此任务: ```python import json from bs4 import BeautifulSoup import requests def fetch_charging_videos(media_id): """ 根据 media_id 获取 B 充电视频的相关信息 参数: media_id (str): 充电课程媒体编号 返回: list: 包含各视频元数据字典组成的列表 """ base_url = f"https://www.bilibili.com/cheese/pagelist?media_id={media_id}" # 设置自定义 User-Agent 头部模拟真实用户行为 headers = { 'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64)' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/98.0.4758.102 Safari/537.36') } try: response = requests.get(base_url, headers=headers) if response.status_code != 200: raise Exception(f"无法连接到服务器 ({response.status_code})") html_content = response.text soup = BeautifulSoup(html_content, "lxml") script_tag = soup.find('script', type="application/json", id="__NEXT_DATA__") raw_data = json.loads(script_tag.string) videos = [] for item in raw_data["props"]["pageProps"]["initData"]["episodes"]: title = item['title'] desc = item['desc'] duration_text = item['durationText'] link = f'https://www.bilibili.com/video/{item["bvid"]}' video_entry = { '标题': title, '描述': desc or '', '播放时间': duration_text, '链接': link } videos.append(video_entry) return videos except Exception as e: print(e) if __name__ == "__main__": media_id_input = input("请输入充电课程的 media_id:") result = fetch_charging_videos(media_id_input.strip()) if not result: exit() for idx, entry in enumerate(result, start=1): print(f"{idx}. [{entry['标题']}]\n" f"\t简介:{entry['描述']}\n" f"\t长度:{entry['播放时间']}\n" f"\tURL:{entry['链接']}") ``` 上述程序逻辑清晰地分为以下几个部分: 1. 构造目标 URL 并设置合适的请求头部; 2. 发起 GET 请求读取原始 HTML 文档; 3. 利用 Beautiful Soup 查找嵌套有实际数据的 `<script>` 节点; 4. 将其内部字符串转换为标准 JSON 对象以便进一步处理; 5. 遍历结果集抽取所需字段形成最终输出格式; 注意:由于网反爬机制的存在,在运行过程中可能会遇到 IP 屏蔽等问题。如果发生这种情况,则考虑引入代理池或者适当降低频率等方式规避风险[^1]。 --- #### 注意事项 - 动态加载的内容可能不会直接体现在初始 HTML 中,此时需要用到 Selenium 或 Playwright 来驱动真实的浏览器实例执行 JavaScript 渲染后再采集数据。 - 始终尊重目标点的服务条款与隐私政策规定,合法合规地开展自动化操作活动。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ucsheep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值