使用Selenium自动下载YouTube MP3时点击下载按钮失败求助
问题描述
我想用Selenium自动化从https://ytmp4converter.com/下载YouTube视频的MP3版本,但点击下载按钮时遇到TimeoutException错误。
我的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys import time PATH = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(PATH) driver.get("https://ytmp4converter.com/") #How to access elements on the page #Id, name, class is the hierachical way of searching for specific element within HTML search = driver.find_element("name", "url") #Now what this will do is it will return to as an object that represents that search bar #that we can actually interact with and mess around search.send_keys("https://www.youtube.com/watch?v=BQogzYUoQWU&list=RDBQogzYUoQWU&start_radio=1") #This sends input on the search bar e.g "test" search.send_keys(Keys.RETURN) #This is the computer version of pressing the "Enter" button #/download.php?source=youtube&media=OA== #link = driver.find_element(By.LINK_TEXT, "https://ytmp4converter.com/en/wp-content/plugins/aio-video-downloader/download.php?source=youtube&media=OA==") #link.click() wait = WebDriverWait(driver, 20) element = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "https://ytmp4converter.com/en/wp-content/plugins/aio-video-downloader/download.php?source=youtube&media=OA==" ))) element.click()
报错信息
Traceback (most recent call last): File "C:\Users\SAMWEL~1\AppData\Local\Temp\atom_script_tempfiles\a3051e50-4690-11ed-bd2c-11f5bac330f8", line 34, in <module> element = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "https://ytmp4converter.com/en/wp-content/plugins/aio-video-downloader/ download.php?source=youtube&media=OA==" ))) File "C:\Users\****** ******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages \selenium\webdriver\support\wait.py", line 90, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: Stacktrace: Backtrace: Ordinal0 [0x008BDF13+2219795] Ordinal0 [0x00852841+1779777] Ordinal0 [0x0076423D+803389] Ordinal0 [0x00793025+995365] Ordinal0 [0x007931EB+995819] Ordinal0 [0x007C0F52+1183570] Ordinal0 [0x007AE844+1108036] Ordinal0 [0x007BF192+1175954] Ordinal0 [0x007AE616+1107478] Ordinal0 [0x00787F89+950153] Ordinal0 [0x00788F56+954198] GetHandleVerifier [0x00BB2CB2+3040210] GetHandleVerifier [0x00BA2BB4+2974420] GetHandleVerifier [0x00956A0A+565546] GetHandleVerifier [0x00955680+560544] Ordinal0 [0x00859A5C+1808988] Ordinal0 [0x0085E3A8+1827752] Ordinal0 [0x0085E495+1827989] Ordinal0 [0x008680A4+1867940] BaseThreadInitThunk [0x75E7FA29+25] RtlGetAppContainerNamedObjectPath [0x77E77A9E+286] RtlGetAppContainerNamedObjectPath [0x77E77A6E+238]
下载按钮HTML截图

问题分析与修复
核心问题
你用By.LINK_TEXT匹配完整下载URL的方式完全错误:LINK_TEXT是用来匹配a标签的可见文本内容,而非href属性值。从截图看,下载按钮的可见文本应该是类似"Download MP3"的内容,不是完整URL。另外,这类网站的下载链接参数(比如media=OA==)是动态生成的,每次转换都会变化,硬编码完整URL根本无法复用。
修复步骤
- 更换定位方式:用CSS选择器或XPATH匹配href包含固定关键词的a标签,或者直接匹配按钮的可见文本。
- 等待元素可点击:用
EC.element_to_be_clickable代替EC.presence_of_element_located,确保元素不仅存在,还处于可交互状态。 - 兼容动态参数:避免硬编码完整URL,通过通用特征定位元素。
修复后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys PATH = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(PATH) driver.get("https://ytmp4converter.com/") # 输入YouTube链接并提交 search = driver.find_element(By.NAME, "url") search.send_keys("https://www.youtube.com/watch?v=BQogzYUoQWU&list=RDBQogzYUoQWU&start_radio=1") search.send_keys(Keys.RETURN) # 等待下载按钮可点击,通过href包含download.php的特征定位 wait = WebDriverWait(driver, 20) # 也可以用文本定位:EC.element_to_be_clickable((By.LINK_TEXT, "Download MP3")) download_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href*='download.php']"))) download_btn.click() # 可选:如果下载链接在新窗口打开,切换到新窗口继续操作 # windows = driver.window_handles # driver.switch_to.window(windows[-1])
额外提示
- 这类转换网站通常会有广告弹窗,必要时需要添加弹窗关闭逻辑,比如检查并关闭iframe内的广告。
- 确保ChromeDriver版本与Chrome浏览器版本完全匹配,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Samuel Byegon
相关产品推荐
相关产品推荐

