Python Selenium无头模式下无法下载SSRS报表文件的问题咨询
Python Selenium无头模式下无法下载SSRS报表文件的问题咨询
嘿,各位大佬,我最近在做一个项目,需要从SSRS的Web服务器上下载几百份报表,用Python写了个Selenium脚本。需求是要在后台下载,所以想着用无头模式来跑,但遇到了个棘手的问题:
正常模式下我的代码能正常下载报表,还解决了弹出的身份验证窗口问题,但只要一加--headless=new参数,脚本运行时控制台闪一下就关闭,报表完全没下载下来,实在搞不懂为啥会这样,有没有大佬能帮忙分析下原因呀?
下面是我的完整代码(URL做了隐私处理):
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from subprocess import CREATE_NO_WINDOW import time import datetime import os service = Service(executable_path=r'C:\Program Files\chromedriver_win32\chromedriver.exe') chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--auth-server-whitelist=*") chrome_options.add_argument("--auth-negotiate-delegate-whitelist=*") chrome_options.add_argument("--log-level=0") service.creation_flags = CREATE_NO_WINDOW print('starting download') driver=webdriver.Chrome(service=service,options=chrome_options) driver.get("http://10.1.2.69:99/ReportServer") time.sleep(3) print('file downloaded') driver.quit()
我尝试过的有效情况:
- 去掉
--headless=new参数后,脚本完全正常,能处理身份验证弹窗并成功下载报表。
我的疑问:
为什么同样的配置,无头模式下就无法完成下载?有没有什么我漏掉的配置或者无头模式特有的限制呀?
可能的原因和解决方向:
- 无头模式下未配置下载路径
Chrome的无头模式默认不会使用常规的用户下载目录,也可能不会自动处理下载逻辑。可以尝试明确指定下载目录并配置相关偏好:
# 提前创建下载目录 download_dir = os.path.abspath("./ssrs_reports") os.makedirs(download_dir, exist_ok=True) # 添加下载配置到chrome_options chrome_options.add_experimental_option("prefs", { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True # 避免安全拦截下载 })
- 等待时间不足
无头模式下页面加载、文件下载的速度可能和正常模式有差异,固定的time.sleep(3)可能不足以完成下载。建议改用显式等待,或者等待下载文件完成:
def wait_for_download_completed(download_dir, timeout=60): end_time = time.time() + timeout while time.time() < end_time: for filename in os.listdir(download_dir): # 排除Chrome的临时下载文件(.crdownload后缀) if not filename.endswith(".crdownload"): return True time.sleep(1) return False # 在driver.get之后调用等待逻辑 driver.get("http://10.1.2.69:99/ReportServer") if wait_for_download_completed(download_dir): print('file downloaded successfully') else: print('download timed out')
- 身份验证在无头模式下的兼容性
虽然你加了认证白名单参数,但无头模式下的认证流程可能有差异。可以尝试把认证信息直接嵌入URL(如果SSRS支持这种方式的话):
# 格式:http://username:password@server_url,注意不要硬编码账号密码,建议从配置文件读取 driver.get("http://your_username:your_password@10.1.2.69:99/ReportServer")
- ChromeDriver与Chrome版本不匹配
无头模式对版本兼容性要求更高,确保你的ChromeDriver版本和本地安装的Chrome浏览器版本完全一致,版本不匹配可能导致各种异常行为。
备注:内容来源于stack exchange,提问作者aparajeya
相关产品推荐
相关产品推荐

