Python Selenium将下载文件保存到指定相对目录的问题求助
解决Selenium Chrome指定下载目录无效/弹出选择窗口的问题
我之前也踩过类似的坑,咱们先拆解问题根源,再一步步解决:
为什么之前的代码无效?
- 相对路径不被支持:Chrome的
download.default_directory只认绝对路径,你用的/folder是相对路径,Chrome根本找不到这个位置,自然不会生效。 - Selenium版本兼容性问题:如果你的Selenium是4.x版本,旧代码里的
chrome_options参数已经被弃用,得改用options参数传递给webdriver.Chrome()。 - 缺少关键偏好设置:只设置下载目录还不够,有些场景下需要禁用弹窗提示、开启目录升级,否则Chrome还是会弹出选择窗口。
正确的设置步骤(分系统)
Windows系统
注意路径要用原始字符串(加r前缀),或者把反斜杠转成双反斜杠,同时补充必要的偏好设置:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 核心配置:禁用弹窗、指定绝对下载目录 prefs = { "profile.default_content_settings.popups": 0, "download.default_directory": r"C:\Users\user_dir\Desktop\your_target_folder", # 绝对路径,结尾可加可不加斜杠 "download.prompt_for_download": False, "directory_upgrade": True } chrome_options.add_experimental_option("prefs", prefs) # Selenium 4+的标准写法(chromedriver路径可指定,或已配置到环境变量) driver = webdriver.Chrome(options=chrome_options)
Linux/macOS系统
用正斜杠的绝对路径即可:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() prefs = { "profile.default_content_settings.popups": 0, "download.default_directory": "/home/your_username/your_target_folder", "download.prompt_for_download": False, "directory_upgrade": True } chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=chrome_options)
针对特定文件类型的额外配置
如果下载PDF、ZIP这类容易触发Chrome内置预览/安全提示的文件,得加对应设置:
- 下载PDF时,跳过预览直接下载:
prefs["plugins.always_open_pdf_externally"] = True
- 下载压缩包时,禁止自动打开:
prefs["download.extensions_to_open"] = "" # 不打开任何扩展名文件,直接下载
替代方案:监控下载目录获取刚下载的文件
如果还是有问题,或者你需要确认文件是否下载完成,可以用Python监控下载目录,抓取最新文件:
import os import time def get_latest_download(download_dir): # 列出目录下所有文件,过滤掉文件夹 all_files = [os.path.join(download_dir, f) for f in os.listdir(download_dir)] file_list = [f for f in all_files if os.path.isfile(f)] # 按修改时间倒序,取最新的文件 latest_file = max(file_list, key=os.path.getmtime) return latest_file # 用法示例 download_dir = r"C:\Users\user_dir\Desktop\your_target_folder" # 触发下载后,等待几秒让文件完成下载(时间根据文件大小调整) time.sleep(5) new_file = get_latest_download(download_dir) print(f"刚下载的文件路径:{new_file}")
另外,如果你能拿到下载文件的直接URL,更推荐用requests库直接下载,比Selenium模拟下载高效得多:
import requests file_url = "https://example.com/your_target_file.zip" save_path = r"C:\Users\user_dir\Desktop\your_target_folder\file.zip" response = requests.get(file_url) with open(save_path, "wb") as f: f.write(response.content)
内容的提问来源于stack exchange,提问作者Julian Chu
相关产品推荐
相关产品推荐

