Python Selenium下载文件自动追加.part后缀问题求助
解决Selenium Firefox下载文件自动追加.part后缀的问题
我来帮你捋捋这个问题——.part后缀其实是Firefox在下载过程中使用的临时文件标识,只有当下载完全完成、文件彻底写入磁盘后才会自动移除。你遇到这个情况主要有两个核心原因,咱们一步步解决:
1. 固定等待时间不可靠,下载未完成就终止了
你现在用time.sleep(15)来等下载完成,但这个固定时间太死板了——一旦文件偏大或者网络波动,15秒根本不够,这时你提前调用driver.quit()会直接中断下载,导致.part文件保留甚至被删除(你备注里说quit后文件消失就是这个原因)。
替换固定sleep的方案:监听下载目录,等待.part文件消失或者目标文件出现。给你写个实用的监听函数:
import os import time def wait_for_download_completion(download_dir, expected_filename): # 循环监听,直到目标文件出现且临时.part文件消失 while True: part_file_path = os.path.join(download_dir, f"{expected_filename}.part") target_file_path = os.path.join(download_dir, expected_filename) if os.path.exists(target_file_path) and not os.path.exists(part_file_path): break status_msg = "正在下载中..." if os.path.exists(part_file_path) else "等待文件开始下载..." print(status_msg) time.sleep(2)
之后在你的search()函数里,把time.sleep(15)替换成这个函数就行,记得传入你的下载目录和预期文件名。
2. 调整Firefox的下载偏好设置
你的Options里缺了几个关键配置,尤其是headless模式下的下载优化,以及防止Firefox提前清理临时文件的设置:
修改你的firefoxOptions()函数:
def firefoxOptions(): options = Options() options.headless = True download_dir = "你的绝对下载路径" # 这里一定要用绝对路径,避免Firefox识别出错 options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.dir", download_dir) # 禁止弹出下载提示框 options.set_preference("browser.download.manager.showWhenStarting", False) # 扩展支持的MIME类型,覆盖常见的CSV/Excel格式,根据你实际下载的文件调整 options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/csv, text/csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") # 关键:关闭下载管理器退出时的自动清理,防止未完成文件被删除 options.set_preference("browser.download.manager.cleanUpOnExit", False) # 适配headless模式的下载设置 options.set_preference("browser.download.useDownloadDir", True) options.set_preference("dom.disable_open_during_load", False) return options
3. 最后调整你的search函数
把等待逻辑替换成咱们写的监听函数,确保下载完成再关闭浏览器:
def search(): url = 'site_URL' download_dir = "你的绝对下载路径" # 和firefoxOptions里的路径保持一致 expected_filename = "你要下载的文件名.csv" # 替换成实际文件名 driver = webdriver.Firefox(options=firefoxOptions()) driver.get(url) time.sleep(3) # 等待页面加载完成 driver.find_element( By.CSS_SELECTOR, "css_selector_first_button").click() time.sleep(1) # 点击下载按钮 driver.find_element(By.CSS_SELECTOR, "css_selector_second_button").click() # 等待下载完成 wait_for_download_completion(download_dir, expected_filename) print("download complete!") driver.quit()
这样调整后,应该就能解决.part后缀的问题了——核心就是确保下载真正完成后再关闭浏览器,同时优化Firefox的下载配置适配你的场景。
内容的提问来源于stack exchange,提问作者user9329808
相关产品推荐
相关产品推荐

