如何通过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,提问作者Роман Котов




