自动化脚本报错:No such file or directory: '.DS_Store',求YouTube下载脚本修复
问题:YouTube视频下载脚本报错及优化需求
我编写了一个自动化脚本,需求如下:在CMD中输入YouTube URL,调用Vinteo.app获取最高画质视频(Pytube仅支持720p,无法获取1080p),并将视频保存到桌面的“Videos”文件夹。采用Selenium实现,步骤为:
- 在CMD输入YouTube URL
- 打开Vinteo.app网页
- 在搜索框输入URL
- 点击“Video”按钮下载(模态框默认选中1080p)
- 将视频保存到“Videos”文件夹
运行时出现以下错误:
Traceback (most recent call last): File "/Users/ss/Desktop/Videos/import-videos.py", line 36, in <module> download_youtube_video(url) File "/Users/ss/Desktop/Videos/import-videos.py", line 30, in download_youtube_video os.rename(filename, destination) FileNotFoundError: [Errno 2] No such file or directory: '.DS_Store' -> 'C:/Users/ss/Desktop/Videos/.DS_Store'
我的代码如下:
import os import time 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 def download_youtube_video(url): driver = webdriver.Chrome() driver.get("https://vinteo.app") # Wait for search box to be present and input url search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#search")) ) search_box.send_keys(url) # Wait for download button to be clickable and click it download_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#download-video-default")) ) download_button.click() # Wait for download to start time.sleep(5) # Move file to Videos folder filename = os.listdir(os.getcwd())[0] destination = os.path.join("C:/Users/ss/Desktop/Videos", filename) os.rename(filename, destination) driver.quit() if __name__ == "__main__": url = input("Enter YouTube URL: ") download_youtube_video(url)
我需要优化元素定位确保下载触发,同时解决上述FileNotFoundError错误,实现视频成功下载。
解决方案
1. 修复FileNotFoundError错误
- 问题根源:
os.listdir(os.getcwd())[0]直接取当前目录第一个文件,Mac系统下默认存在.DS_Store隐藏文件,导致误操作该系统文件;- 脚本运行在Mac环境(路径为
/Users/ss/...),但目标路径写的是Windows格式C:/Users/ss/Desktop/Videos,跨系统路径导致目标目录不存在。
- 修复代码:
# 过滤系统隐藏文件,只保留非隐藏文件 files = [f for f in os.listdir(os.getcwd()) if not f.startswith('.')] if not files: print("未找到下载文件") driver.quit() return filename = files[0] # 使用Mac系统的桌面路径格式,自动适配当前用户 destination_dir = os.path.expanduser("~/Desktop/Videos") # 确保目标目录存在,不存在则创建 os.makedirs(destination_dir, exist_ok=True) destination = os.path.join(destination_dir, filename) os.rename(filename, destination)
2. 优化元素定位与下载触发逻辑
- 问题:当前等待下载按钮的逻辑依赖页面加载速度,输入URL后直接等待按钮可点击可能失效(需等待视频信息解析完成)。
- 优化方案:
# 输入URL后,点击搜索提交按钮(需根据页面实际元素调整选择器) search_box.send_keys(url) submit_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#search-button")) ) submit_btn.click() # 等待视频选项面板加载完成,再点击下载按钮 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".video-download-options")) ) download_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#download-video-default")) ) download_button.click() - 替换固定等待:去掉
time.sleep(5),改为监听下载文件状态,比如等待文件后缀从.crdownload变为正常视频格式(如.mp4),确保下载完成后再操作。
3. 配置Chrome直接下载到目标文件夹
省去移动文件的步骤,直接设置Chrome的默认下载目录为桌面Videos文件夹:
from selenium.webdriver.chrome.options import Options def download_youtube_video(url): chrome_options = Options() # 设置下载路径为桌面Videos文件夹 download_dir = os.path.expanduser("~/Desktop/Videos") os.makedirs(download_dir, exist_ok=True) chrome_options.add_experimental_option("prefs", { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True }) driver = webdriver.Chrome(options=chrome_options) driver.get("https://vinteo.app") # 后续输入URL、触发下载的逻辑不变...
内容的提问来源于stack exchange,提问作者InvestedLabs
相关产品推荐
相关产品推荐

