You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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截图

下载按钮HTML代码


问题分析与修复

核心问题

你用By.LINK_TEXT匹配完整下载URL的方式完全错误:LINK_TEXT是用来匹配a标签的可见文本内容,而非href属性值。从截图看,下载按钮的可见文本应该是类似"Download MP3"的内容,不是完整URL。另外,这类网站的下载链接参数(比如media=OA==)是动态生成的,每次转换都会变化,硬编码完整URL根本无法复用。

修复步骤

  1. 更换定位方式:用CSS选择器或XPATH匹配href包含固定关键词的a标签,或者直接匹配按钮的可见文本。
  2. 等待元素可点击:用EC.element_to_be_clickable代替EC.presence_of_element_located,确保元素不仅存在,还处于可交互状态。
  3. 兼容动态参数:避免硬编码完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:20:35