You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Selenium Chrome下载Blob链接打开的文件?

用Python 3.6 + Selenium下载Blob资源的实操方案

嘿,针对你要下载黑色背景播放器里Blob链接文件的需求,我给你整理了两个靠谱的实操方案,亲测能解决这类问题:

方案一:通过Chrome DevTools协议(CDP)拦截网络请求

这个方法能直接拿到Blob对应的真实资源内容,绕开前端的Blob封装,稳定性拉满:

  • 先初始化ChromeDriver并开启CDP支持,代码示例如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

options = Options()
# 如果不需要可视化窗口可以加无头模式,需要看播放器就注释掉
# options.add_argument("--headless=new")
# 可以加个User-Agent模拟真实浏览器,避免反爬
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=options)
# 启用网络请求监听
driver.execute_cdp_cmd('Network.enable', {})

# 定义回调函数,捕获Blob相关请求
request_id_list = []
def capture_blob_requests(event):
    response_url = event['response']['url']
    # 筛选Blob类型的请求,也可以根据请求的其他特征(比如媒体类型)来筛选
    if 'blob:' in response_url:
        request_id_list.append(event['requestId'])
        print(f"捕获到Blob请求:{response_url}")

# 绑定响应接收事件
driver.execute_cdp_cmd('Network.responseReceived', {'listener': capture_blob_requests})

# 打开目标页面
driver.get("你的目标页面URL")

# 等待播放器加载完成,这里用WebDriverWait比sleep更靠谱,替换成你页面里播放器的选择器
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "video"))
    )
    # 如果需要点击播放才加载Blob,就定位播放按钮点击
    # play_btn = driver.find_element(By.CSS_SELECTOR, "播放按钮的选择器")
    # play_btn.click()
    print("播放器已加载,等待Blob请求...")
    time.sleep(8)  # 给点时间让请求完成
except Exception as e:
    print(f"等待播放器失败:{e}")

# 遍历捕获到的请求,获取响应体并保存
for req_id in request_id_list:
    try:
        response_body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': req_id})
        # 判断是否是base64编码,解码后保存
        if response_body['base64Encoded']:
            import base64
            file_content = base64.b64decode(response_body['body'])
        else:
            file_content = response_body['body']
        # 保存文件,后缀改成你需要的(比如mp4、mp3)
        with open(f"downloaded_blob_{req_id}.mp4", 'wb') as f:
            f.write(file_content)
        print(f"文件 downloaded_blob_{req_id}.mp4 保存成功!")
    except Exception as e:
        print(f"处理请求ID {req_id} 失败:{e}")

# 关闭驱动
driver.quit()
  • 注意事项:
    • 一定要保证ChromeDriver和你的Chrome浏览器版本匹配,不然会出兼容性问题
    • 可以通过driver.get_log('performance')查看所有网络请求,找到Blob请求的具体特征,优化筛选条件
    • 如果页面需要登录,记得在打开目标页面前先完成登录流程

方案二:执行JavaScript触发Blob下载

如果CDP的方法有点复杂,也可以直接在页面里执行JS,把Blob转换成可下载链接,模拟浏览器下载:

  • 代码示例:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("你的目标页面URL")

# 等待播放器加载完成
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "video"))
    )
    # 触发播放(如果需要播放才生成Blob链接)
    # driver.find_element(By.CSS_SELECTOR, "播放按钮选择器").click()
    time.sleep(5)
except Exception as e:
    print(f"等待播放器失败:{e}")
    driver.quit()

# 执行JS提取Blob并触发下载
download_js = """
// 替换成你页面里播放器的选择器,比如video标签或者播放器容器内的媒体元素
var mediaElement = document.querySelector('video');
if (mediaElement && mediaElement.src.includes('blob:')) {
    var blobUrl = mediaElement.src;
    // 创建临时a标签触发下载
    var link = document.createElement('a');
    link.href = blobUrl;
    link.download = 'my_downloaded_file.mp4'; // 设置文件名
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    return '下载已触发,Blob链接:' + blobUrl;
} else {
    return '未找到有效的Blob链接';
}
"""

result = driver.execute_script(download_js)
print(result)

# 等待下载完成后关闭驱动
time.sleep(10)
driver.quit()
  • 注意事项:
    • 有些网站有内容安全策略(CSP)限制,可能会阻止JS创建下载链接,这时候方案一更稳妥
    • 如果Blob链接是动态生成的,一定要等播放器完全加载甚至开始播放后再执行JS

内容的提问来源于stack exchange,提问作者Роман Котов

火山引擎 最新活动