Python Selenium如何让Chrome driver在函数结束后保持运行以完成大文件下载
解决方案
核心思路是在所有触发下载的代码执行完成后,添加阻塞等待逻辑,确认所有文件下载完成后再结束函数、销毁Chrome driver,具体实现可选择以下方案:
- 方案1:监控Chrome下载临时文件
Chrome下载未完成的文件默认会带有.crdownload后缀,只需轮询检测下载目录下是否存在该后缀的文件,即可判断下载是否全部完成,适合同时下载多个文件、无法提前预知所有文件名的场景。
实现代码如下:
import os import time def wait_for_all_downloads(download_dir, poll_interval=10): # 大文件可适当调大轮询间隔,减少不必要的IO操作 while True: has_incomplete = any(file.endswith('.crdownload') for file in os.listdir(download_dir)) if not has_incomplete: break time.sleep(poll_interval)
将上述函数集成到你的原有逻辑中:
def get_data(self,download_list,first_year,first_month,last_year,last_month): self.driver=super().get_chrome_drvier(download_path=self.download_path) self.driver.get(self.target_url) for ... in ...: for... in ...: download_file_code .... # 所有下载触发完成后,阻塞等待下载完成 wait_for_all_downloads(self.download_path) # 确认下载完成后再关闭driver self.driver.quit()
- 方案2:校验单个文件大小稳定性
如果可提前获取待下载文件的文件名,可通过连续检测文件大小是否无变化判断下载完成,避免下载目录内其他无关临时文件造成干扰,也支持单文件下载完成后再触发下一个下载,避免带宽占满导致的下载失败。
实现代码如下:
def wait_for_single_file(file_full_path, poll_interval=10, stable_times=3): prev_size = -1 current_stable = 0 # 连续3次检测文件大小无变化,判定为下载完成 while current_stable < stable_times: if not os.path.exists(file_full_path): time.sleep(poll_interval) continue current_size = os.path.getsize(file_full_path) if current_size == prev_size: current_stable += 1 else: current_stable = 0 prev_size = current_size time.sleep(poll_interval)
- 前置配置注意事项
请确认初始化Chrome driver时已添加以下配置,避免下载弹窗、安全拦截等问题阻塞下载流程:
from selenium.webdriver.chrome.options import Options chrome_options = Options() download_prefs = { "download.default_directory": self.download_path, "download.prompt_for_download": False, # 关闭下载确认弹窗 "download.directory_upgrade": True, "safebrowsing.enabled": True # 跳过安全校验,避免正规站点文件被误拦截 } chrome_options.add_experimental_option("prefs", download_prefs) # 若使用无头模式,需使用新版无头参数避免下载限制 chrome_options.add_argument("--headless=new")
内容的提问来源于stack exchange,提问作者석재현
相关产品推荐
相关产品推荐

