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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:04