如何用Python为Selenium下载的PDF文件添加原下载URL至文件名
Selenium下载PDF后按原URL重命名文件
要实现下载PDF后将文件名包含原URL的需求,需要解决两个核心问题:定位刚下载的文件和处理URL中的非法文件名字符。以下是修改后的完整代码:
import os import time import glob from selenium import webdriver folderName = input("Enter The FolderName:\t").upper() newDir = "C:\\Users\\sulta\\Data Science CV\\" + folderName print(newDir) if not os.path.exists(newDir): os.makedirs(newDir) # 配置Chrome下载选项 options = webdriver.ChromeOptions() options.add_experimental_option('prefs', { "download.default_directory": newDir, "download.prompt_for_download": False, "download.directory_upgrade": True, "plugins.always_open_pdf_externally": True }) driver = webdriver.Chrome(options=options) # 处理URL中的非法文件名字符 def sanitize_filename(url): # 替换Windows文件名禁止的字符为下划线 invalid_chars = '<>:"/\\|?*' for char in invalid_chars: url = url.replace(char, '_') # 限制文件名长度(Windows最大255字符) return url[:200] + ".pdf" # 保留后缀,避免过长 # 获取下载目录中最新的文件 def get_latest_file(dir_path): # 遍历目录下所有文件,按修改时间排序 files = glob.glob(os.path.join(dir_path, "*")) if not files: return None return max(files, key=os.path.getctime) for current_link in link: # 直接遍历link列表更简洁 try: # 记录下载前的文件列表,避免误判 pre_download_files = set(glob.glob(os.path.join(newDir, "*"))) driver.get(current_link) driver.set_page_load_timeout(10) # 等待文件下载完成(最多等待15秒,可根据实际调整) wait_time = 0 while wait_time < 15: post_download_files = set(glob.glob(os.path.join(newDir, "*"))) new_files = post_download_files - pre_download_files if new_files: break time.sleep(1) wait_time += 1 if not new_files: print(f"下载超时或未找到文件: {current_link}") continue # 获取最新下载的文件 latest_file = get_latest_file(newDir) # 生成新文件名 new_filename = sanitize_filename(current_link) new_file_path = os.path.join(newDir, new_filename) # 重命名文件(处理可能的重名,添加序号) counter = 1 while os.path.exists(new_file_path): new_filename = f"{sanitize_filename(current_link)[:-4]}_{counter}.pdf" new_file_path = os.path.join(newDir, new_filename) counter += 1 os.rename(latest_file, new_file_path) print(f"文件已重命名: {new_filename}") except Exception as e: print(f"处理链接出错: {current_link}, 错误信息: {str(e)}") continue driver.quit()
关键说明:
- 非法字符处理:
sanitize_filename函数会把URL中Windows禁止的文件名字符替换为下划线,同时限制长度避免超出系统限制。 - 下载等待逻辑:通过对比下载前后的文件列表,确保文件完成下载后再进行重命名,避免因文件未完全写入导致的错误。
- 重名处理:如果多个链接处理后文件名重复,会自动添加序号区分。
- 遍历优化:直接遍历
link列表比用range(len(link))更简洁易读。
内容的提问来源于stack exchange,提问作者Sultan Haider
相关产品推荐
相关产品推荐

