使用Selenium Python下载CSV文件时得到不完整.tmp文件的问题求助
Selenium Python下载CSV生成不完整tmp文件的解决方案
核心根因:代码触发下载操作后未等待任务完成就终止运行,Chrome进程被强制销毁,未下载完成的临时文件无法转为完整CSV,是这类问题的高频诱因。
- 方法1:补全Chrome下载配置项
当前prefs配置缺少禁止下载弹窗、权限自动升级等必要配置,修改配置段如下:
prefs = { "download.default_directory": "你的下载目录路径", "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": False, "profile.default_content_settings.popups": 0 }
- 方法2:添加显式等待保证操作合法性
避免元素未加载完成就触发点击导致请求异常,所有交互操作前添加显式等待:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver, 20) # 等待登录按钮可点击 login_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[normalize-space()="Login"]'))) login_btn.click() # 等待协议同意按钮可点击 agree_btn = wait.until(EC.element_to_be_clickable((By.NAME, "agree"))) agree_btn.click() # 等待下载按钮可点击 download_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Get the resource']"))) download_btn.click()
- 方法3:添加下载完成轮询逻辑
触发下载后轮询下载目录,直到临时文件消失、CSV文件大小稳定后再终止脚本,示例逻辑如下:
import os import time def wait_for_download_complete(download_dir, timeout=300): start_time = time.time() while True: tmp_files = [f for f in os.listdir(download_dir) if f.endswith('.tmp') or f.endswith('.crdownload')] csv_files = [f for f in os.listdir(download_dir) if f.endswith('.csv')] if not tmp_files and len(csv_files) > 0: # 校验文件大小1秒内无变化,避免写入未完成 csv_path = os.path.join(download_dir, csv_files[0]) size1 = os.path.getsize(csv_path) time.sleep(1) size2 = os.path.getsize(csv_path) if size1 == size2: return True if time.time() - start_time > timeout: raise TimeoutError("下载超时") time.sleep(2) # 触发下载后调用即可 wait_for_download_complete("你的下载目录路径")
- 方法4:使用requests携带Cookie下载(稳定性更高)
避免浏览器下载的不稳定问题,获取登录态后直接用请求库下载文件:
import requests # 同步Selenium的登录Cookie cookies = driver.get_cookies() session = requests.Session() for cookie in cookies: session.cookies.set(cookie['name'], cookie['value']) # 替换为实际的下载链接,可从下载按钮的href属性获取 download_url = "实际下载链接" resp = session.get(download_url, stream=True) with open("保存的CSV文件全路径", "wb") as f: for chunk in resp.iter_content(chunk_size=1024): if chunk: f.write(chunk)
内容的提问来源于stack exchange,提问作者Alex88
相关产品推荐
相关产品推荐

