使用Selenium批量下载PDF链接列表时单文件重复下载如何解决
解决方案
你遇到的重复下载问题可以通过添加本地文件校验、完善Chrome下载配置、增加下载完成等待逻辑三个方式解决,修改后的完整代码如下:
import os import time from random import randint from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 你的下载目录,提前创建好避免报错 zip_dir = "./pdf_downloads" os.makedirs(zip_dir, exist_ok=True) # 待下载链接,先做去重处理避免列表本身有重复项 test_list = ['https://dibbs2.bsm.dla.mil/Downloads/RFQ/8/SPE1C122Q0058.PDF', 'https://dibbs2.bsm.dla.mil/Downloads/RFQ/8/SPE2DH22Q0028.PDF', 'https://dibbs2.bsm.dla.mil/Downloads/RFQ/9/SPE2DH22Q0029.PDF', 'https://dibbs2.bsm.dla.mil/Downloads/RFQ/3/SPE2DS22Q0023.PDF', 'https://dibbs2.bsm.dla.mil/Downloads/RFQ/1/SPE2DS22Q0031.PDF', 'https://dibbs2.bsm.dla.mil/Downloads/RFQ/3/SPE2DS22Q0033.PDF'] # 按原有顺序去重 test_list = list(dict.fromkeys(test_list)) options = webdriver.ChromeOptions() prefs = {"download.default_directory": zip_dir, "download.directory_upgrade": True, "download.manager.showWhenStarting": False, "download.manager.useWindow": False, "helperApps.alwaysAsk.force":False, "download.manager.showAlertOnComplete": False, # 新增配置:禁止Chrome预览PDF,直接触发下载 "plugins.always_open_pdf_externally": True, "download.prompt_for_download": False} options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options) # 工具函数:检查文件是否已经下载完成 def is_file_downloaded(file_path, wait_time=30): start_time = time.time() # 等待最多30秒,看文件是否存在且大小不再变化 while time.time() - start_time < wait_time: if os.path.exists(file_path): # 检查文件大小是否稳定,避免未下载完成的临时文件被误判 initial_size = os.path.getsize(file_path) time.sleep(1) current_size = os.path.getsize(file_path) if initial_size == current_size and current_size > 0: return True time.sleep(1) return False for url in test_list: # 从url中提取PDF文件名 file_name = url.split("/")[-1] save_path = os.path.join(zip_dir, file_name) # 核心:如果文件已经存在,直接跳过不下载 if os.path.exists(save_path): print(f"{file_name} 已存在,跳过下载") continue # 休眠随机时间避免反爬 time.sleep(randint(3, 9)) driver.get(url) # 仅在页面存在同意按钮时点击,避免异常触发 try: agree_btn = driver.find_element("id", "butAgree") if agree_btn.is_displayed() and agree_btn.is_enabled(): agree_btn.click() except: pass # 等待当前文件下载完成再进入下一个链接,避免请求混乱 download_success = is_file_downloaded(save_path) if not download_success: print(f"{file_name} 下载超时,请检查链接有效性") # 所有任务完成后关闭浏览器 driver.quit()
关键优化点说明
- 首先对下载列表做了去重处理,避免列表本身隐藏重复链接
- 新增了本地文件校验逻辑,只要目标路径下已经存在对应PDF,就直接跳过下载
- 补充了Chrome的PDF自动下载配置,避免浏览器预览PDF导致重复触发下载
- 增加了下载完成等待逻辑,必须等当前文件下载完成、大小稳定后才会访问下一个链接,不会出现多个下载请求混乱的问题
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

