如何利用Selenium实现为每个下载任务创建以sid命名的专属文件夹
解决方案
我来帮你搞定这个需求!要实现每次点击下载后把文件存到对应sid命名的专属文件夹里,我们需要补充文件夹创建、下载状态校验和文件移动的逻辑。以下是修改后的完整代码,我会逐一拆解关键部分:
import os import shutil import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options # 配置Chrome的下载参数,指定临时下载目录 temp_download_dir = "./temp_downloads" os.makedirs(temp_download_dir, exist_ok=True) chrome_options = Options() chrome_options.add_experimental_option("prefs", { "download.default_directory": os.path.abspath(temp_download_dir), "download.prompt_for_download": False, # 关闭下载弹窗提示 "download.directory_upgrade": True, "safebrowsing.enabled": True }) # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) for i in range(81, 100): sid = str(i) target_folder = f"./sid_{sid}" # 创建当前sid对应的文件夹,已存在则跳过创建 os.makedirs(target_folder, exist_ok=True) try: # 访问目标页面(如果你的代码已经在对应页面,可忽略这一行) driver.get(f"url.com/test?sid={sid}") # 点击导出Excel按钮 driver.find_element(By.XPATH,'/html/body/center/form/table/tbody/tr[2]/td[2]/table/tbody/tr[6]/td/table[2]/tbody/tr/td/a[2]').click() # 等待文件下载完成(替代单纯sleep,更可靠) def wait_download_finish(temp_dir): while True: # 过滤掉隐藏文件和临时下载文件 all_files = [f for f in os.listdir(temp_dir) if not (f.startswith('.') or f.endswith('.crdownload'))] if all_files: # 返回最新创建的文件(即刚下载的文件) return max(all_files, key=lambda x: os.path.getctime(os.path.join(temp_dir, x))) time.sleep(1) # 获取刚下载完成的文件路径 downloaded_file = wait_download_finish(temp_download_dir) src_file_path = os.path.join(temp_download_dir, downloaded_file) dest_file_path = os.path.join(target_folder, downloaded_file) # 移动文件到对应sid的文件夹 shutil.move(src_file_path, dest_file_path) print(f"sid={sid}的文件已成功保存到 {target_folder}") except Exception as e: print(f"处理sid={sid}时出错: {e}") continue # 关闭浏览器 driver.quit() # 可选:清理临时下载文件夹 shutil.rmtree(temp_download_dir)
关键细节解释:
- 临时下载目录:单独指定一个临时文件夹存放所有下载文件,避免和其他下载内容混淆,方便精准定位当前sid的下载文件。
- 目标文件夹创建:用
os.makedirs(..., exist_ok=True)确保每个sid都有专属文件夹,即使文件夹已存在也不会报错中断循环。 - 下载完成校验:替代固定时长的
time.sleep,通过检查临时目录中是否存在未完成的下载文件(带.crdownload后缀),确保文件真正下载完成后再移动,避免文件损坏。 - 文件移动逻辑:找到临时目录中最新创建的文件,移动到对应sid的文件夹,保证每个sid的文件不会混乱。
内容的提问来源于stack exchange,提问作者punklord
相关产品推荐
相关产品推荐

