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

基于Python与Selenium WebDriver的下载机器人:如何定位目标文件并复制至指定目录,或修改默认下载目录?

解决Selenium下载文件的定位与跨用户目录问题

嘿,这两个问题确实是多人使用的自动化工具里很常见的痛点,我来一步步帮你搞定!

一、用OS模块获取不同用户的默认下载目录

不同操作系统和用户的默认下载目录路径不一样,但咱们可以通过OS模块结合系统特性自动获取,完全不用硬编码路径:

跨平台通用方案

利用os.path.expanduser()解析用户主目录,再拼接Downloads文件夹:

import os

def get_default_download_dir():
    # 跨平台获取用户主目录
    user_home = os.path.expanduser("~")
    # 拼接默认下载目录
    download_dir = os.path.join(user_home, "Downloads")
    # 确保目录存在(如果用户没创建过的话)
    if not os.path.exists(download_dir):
        os.makedirs(download_dir)
    return download_dir

针对Windows的额外方案(可选)

Windows也可以通过环境变量USERPROFILE来获取:

download_dir = os.path.join(os.environ["USERPROFILE"], "Downloads")

这样不管哪个用户运行程序,都能自动定位到他们自己的默认下载目录。

二、精准定位刚下载的文件(或直接修改下载目录避免复制)

方案1:直接修改Selenium的下载目录(推荐!)

其实最省心的方式是让Selenium直接把文件下载到你需要的目标目录,这样完全不需要后续复制操作,还能从根源上避免同名文件冲突。

以Chrome为例,通过ChromeOptions设置自定义下载目录,甚至可以配合重命名确保文件名唯一:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

def setup_selenium_download_dir(target_dir):
    # 创建目标目录(不存在则创建)
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    
    chrome_options = Options()
    # 设置下载偏好
    prefs = {
        "download.default_directory": target_dir,
        "download.prompt_for_download": False,  # 禁止弹出下载提示框
        "download.directory_upgrade": True,
        "safebrowsing.enabled": True  # 避免安全提示干扰
    }
    chrome_options.add_experimental_option("prefs", prefs)
    
    # 初始化driver
    driver = webdriver.Chrome(options=chrome_options)
    return driver

# 使用示例:下载后给文件加时间戳重命名
target_dir = "/path/to/your/target/directory"
driver = setup_selenium_download_dir(target_dir)

# 这里执行你的下载操作...

# 下载完成后重命名,避免同名冲突
original_file = os.path.join(target_dir, "transactions.xlsx")
new_filename = f"transactions_{int(time.time())}.xlsx"
os.rename(original_file, os.path.join(target_dir, new_filename))

方案2:定位刚下载的最新文件(适合无法修改下载目录的场景)

如果必须用默认下载目录,咱们可以通过文件修改时间筛选最新的Excel文件,同时要等待下载完成(避免抓取到未下载完的临时文件,比如Chrome的.crdownload后缀):

import time

def wait_for_download(download_dir, timeout=60):
    start_time = time.time()
    while time.time() - start_time < timeout:
        # 遍历目录,筛选已完成的Excel文件
        files = [f for f in os.listdir(download_dir) 
                 if f.endswith((".xlsx", ".xls")) and not f.endswith(".crdownload")]
        if files:
            # 按修改时间排序,取最新的文件
            latest_file = max(files, key=lambda x: os.path.getmtime(os.path.join(download_dir, x)))
            return os.path.join(download_dir, latest_file)
        time.sleep(1)
    # 超时返回None
    return None

# 使用示例
download_dir = get_default_download_dir()
latest_transaction_file = wait_for_download(download_dir)
if latest_transaction_file:
    print(f"找到刚下载的文件:{latest_transaction_file}")
    # 这里可以执行复制操作
    # import shutil
    # shutil.copy(latest_transaction_file, "/path/to/target")
else:
    print("下载超时或未找到目标文件")

这个函数会每隔1秒检查一次下载目录,直到找到已完成的Excel文件,哪怕有同名旧文件也能精准定位到刚下载的那个。

总结

优先推荐方案1,直接让Selenium下载到目标目录,不仅省去了复制步骤,还彻底避免了同名文件冲突,代码也更简洁可靠。如果因为某些限制必须用默认下载目录,再用方案2的时间戳筛选方式。

内容的提问来源于stack exchange,提问作者Engr. Sule Muhammed Abba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:42:51