如何使用Selenium和Python在Chrome中点击下载指定链接的音频文件
你定位不到元素的核心原因:Chrome内置媒体播放器的所有控件都封装在Shadow DOM结构中,普通的DOM定位方法无法直接访问,另外你代码中定位video标签的逻辑错误,当前页面是音频文件,对应标签是audio而非video。
下面给两种可行的实现方案:
方案1:直接通过音频直链下载(最简便)
你已经获取到了音频文件的直接访问地址,无需操作Selenium模拟点击,直接用requests库请求保存即可,性能和稳定性都远高于模拟页面操作,代码示例:
import requests audio_url = "https://www.valmiki.iitk.ac.in/sites/default/files/audio/1-1-1.mp3" # 替换为你要保存的本地路径 save_path = "./1-1-1.mp3" resp = requests.get(audio_url) with open(save_path, "wb") as f: f.write(resp.content)
方案2:通过Selenium模拟点击播放器控件下载
如果必须要通过操作页面控件实现下载,需要先穿透Shadow DOM定位对应的按钮,完整实现代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC s=Service(ChromeDriverManager().install()) options = webdriver.ChromeOptions() preferences = {'download.default_directory': '替换为你的本地下载目录路径'} options.add_experimental_option('prefs', preferences) driver = webdriver.Chrome(service=s, options=options) driver.maximize_window() driver.get('https://www.valmiki.iitk.ac.in/sites/default/files/audio/1-1-1.mp3') wait = WebDriverWait(driver, 10) # 第一步:定位audio元素,获取它的shadow root audio_elem = wait.until(EC.presence_of_element_located((By.TAG_NAME, "audio"))) shadow_root = driver.execute_script('return arguments[0].shadowRoot', audio_elem) # 第二步:在shadow root中定位三点更多选项按钮 # 如果你的Chrome是英文界面,把aria-label值改为"More options" more_btn = shadow_root.find_element(By.CSS_SELECTOR, 'button[aria-label="更多选项"]') more_btn.click() # 第三步:定位下载按钮点击 # 如果你的Chrome是英文界面,把aria-label值改为"Download" download_btn = shadow_root.find_element(By.CSS_SELECTOR, 'text[aria-label="下载"]') download_btn.click() # 等待下载完成后可自行添加关闭逻辑 # driver.quit()
内容的提问来源于stack exchange,提问作者comp1810
相关产品推荐
相关产品推荐

