使用Python Selenium避免同名PDF下载时被覆盖的解决方案
解决Selenium下载PDF时同名文件覆盖问题
核心方案
通过为每个待保存文件生成唯一文件名(如filename.pdf、filename(1).pdf),并在下载完成后重命名文件,彻底避免同名覆盖。
实现步骤
1. 生成唯一文件名的函数
该函数会检查目标目录中是否存在同名文件,若存在则自动添加递增序号,直到生成一个不存在的文件名:
def get_unique_filename(target_dir, original_filename): base_name, ext = os.path.splitext(original_filename) counter = 1 new_filename = original_filename while os.path.exists(os.path.join(target_dir, new_filename)): new_filename = f"{base_name}({counter}){ext}" counter += 1 return new_filename
2. 等待下载完成的辅助函数
Selenium无原生下载完成回调,通过监控Chrome下载临时文件(.crdownload后缀)判断下载状态:
def wait_for_download_complete(target_dir, timeout=60): start_time = time.time() while time.time() - start_time < timeout: pending_downloads = [f for f in os.listdir(target_dir) if f.endswith('.crdownload')] if not pending_downloads: return True time.sleep(1) print("下载超时") return False
3. 修改遍历下载逻辑
结合上述函数,在遍历DataFrame时处理每个文件的下载与重命名:
# 假设你的DataFrame包含'url'(PDF链接)和'filename'(目标文件名)两列 for index, row in df.iterrows(): url = row['url'] original_filename = row['filename'] target_dir = file_path # 对应你配置的下载目录 # 生成唯一文件名 unique_filename = get_unique_filename(target_dir, original_filename) # 访问链接并触发下载(根据页面实际逻辑调整,比如点击下载按钮) driver.get(url) # driver.find_element(By.XPATH, "//*[contains(text(),'下载')]").click() # 等待下载完成后重命名 if wait_for_download_complete(target_dir): downloaded_path = os.path.join(target_dir, original_filename) if os.path.exists(downloaded_path): os.rename(downloaded_path, os.path.join(target_dir, unique_filename)) print(f"已保存: {unique_filename}") else: print(f"未找到下载文件: {original_filename}") else: print(f"下载失败: {url}")
注意事项
- 若服务器返回的文件名与DataFrame中存储的
filename不一致,可通过对比下载前后的目录文件列表,找到最新下载的文件进行重命名。 - 确保Chrome配置中
download.default_directory指向正确的目标目录,无头模式下无弹窗干扰。
内容的提问来源于stack exchange,提问作者S Shekhar Mishra
相关产品推荐
相关产品推荐

