Python: 如何下载一个blob URL视频?

9
我想用Python脚本从网站上下载一个视频,但是视频的URL是以blob形式呈现的,如下所示。
<video class="jw-video jw-reset" style="object-fit: fill;" jw-loaded="data" src="blob:https://xxxxxxx.com/f717096e-5e1a-42e1-8c3c-3ec777b5d478"></video>

你尝试过吗:https://dev59.com/Xprga4cB1Zd3GeqPsMsW? - Gerard Rozsavolgyi
你好,感谢您的评论。实际上我的情况有点复杂。我首先使用Selenium登录网站并获取了cookies,然后将会话cookies传递给Python。def request(driver): s = requests.Session() cookies = driver.get_cookies() for cookie in cookies: s.cookies.set(cookie['name'], cookie['value']) return s req = request(browser)请问您能否详细说明一下如何在上述代码之后保存视频呢?谢谢! - victor_gu
3
将问题中的所有信息都列出来。您还可以创建一个最小化的工作示例。 - furas
这个问题比较不完整,需要进行改进。它可能会被标记为“不明确”或“缺少最小可重现示例”。 - halfer
4个回答

4

可以使用以下Python代码下载Blob视频。您需要从页面检查中获取主段URL,就像给出的图像一样,在代码中粘贴URL。

enter image description here

import requests
import m3u8
import subprocess

master_url ='master_url_from_inspect_network' 
#past your page inspect request header

r = requests.get(master_url)
m3u8_master = m3u8.loads(r.text)
print(m3u8_master)
playlist_url =m3u8_master.data['playlists'][0]['uri']
play_r = requests.get(playlist_url)
m3u8_master_play = m3u8.loads(play_r.text)
m3_data=(m3u8_master_play.data)

m3_datas = m3_data['segments'][0]['uri']

with open('video.ts','wb') as fs:
    for segments in m3_data['segments']:
       uri = segments['uri']
       print(uri)
       r = requests.get(uri)
       fs.write(r.content)

subprocess.run(['ffmpeg','-i','video.ts','video.mp4'])


能否通过编程方式获取网络主段URL? - Ryan Tom

2
在我遇到的情况中,我看到这些blob:https://... URLS的页面也正在提供.m3u8文件。这些文件包含了视频的真实链接,通常分为许多部分。有时还会有一个加密密钥。
然而,这些.m3u8文件的链接有时是由javascript生成的,并不存在于原始页面的源代码中。因此,您可能需要使用浏览器的开发工具,在刷新带有视频的页面时查看网络选项卡,才能看到对这些.m3u8网址的请求。
在我的情况下,youtube-dl(这是一个Python脚本)可以在给出那个.m3u8 URL时下载视频并将其提供给ffmpeg。
所以你可以尝试一下,然后查看用Python如何执行YouTube-dl

1

2
但是真的无法访问缓冲区的内容吗? - Gerard Rozsavolgyi
不,但那是一个不同的问题。“下载”意味着能够从另一个进程访问内容,而这是不可能的。保存二进制大对象很简单。谷歌可以比我更快地回答这个问题。但是如果你不拥有服务器,你需要将JS注入运行中的页面。 - szatmary
@szatmary,我一直在尝试在Google扩展中解决这个问题,而且我已经尽我所能地搜索了,但是我想我的搜索技巧已经受到了影响。我一直没有找到解决方案。你能指点我一个方向吗? - Arihant
当然。首先使用 MSE 实现一个播放器,以便您了解它的工作原理,然后从那里开始倒推。 - szatmary
16
谷歌可以比我更快地回答那个问题。谷歌把我带到了这里,所以... - ocket8888

-15

你可以使用urllib2来实现。

import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()

完全错误。 - Mathematician

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接