Windows下PyQT5打包应用中隐藏undetected-chromedriver控制台失败求助
隐藏undetected-chromedriver控制台窗口(PyQt5+PyInstaller打包场景)
我需要将基于undetected-chromedriver、webdriver-manager实现的Selenium爬虫集成到PyInstaller打包的PyQt5应用后台,目标是隐藏chromedriver的控制台窗口,但常规解决方案均无效,以下是我尝试过的方法及可行解决方案:
已尝试的无效方案
方案1:初始化Service时设置creationflags
参考常规方案创建Service对象并设置CREATE_NO_WINDOW,但创建driver后该参数被自动重置:
import undetected_chromedriver.v2 as uc from selenium.webdriver.common.service import Service from webdriver_manager.chrome import ChromeDriverManager class Scrapper: def __init__(self): self.driver = None self.page_load_time_out = 20 def get_driver(self): options = uc.ChromeOptions() # 省略其他options配置 chrome_service = Service(ChromeDriverManager().install()) print(chrome_service.creationflags) try: from subprocess import CREATE_NO_WINDOW chrome_service.creationflags = CREATE_NO_WINDOW except ImportError: pass print(chrome_service.creationflags) driver = uc.Chrome( options=options, service=chrome_service ) self.driver = driver print(self.driver.service.creationflags) def get_page(self, url): self.get_driver() print(self.driver.service.creationflags) self.driver.set_page_load_timeout(self.page_load_time_out) self.driver.get(url) # 省略后续逻辑
控制台输出:
0 134217728 0 0
参数在driver创建后被重置为0,控制台窗口仍弹出。
方案2:创建driver后重新设置creationflags
修改代码在driver创建完成后再设置creationflags,参数值保持正确,但控制台窗口依旧弹出:
import undetected_chromedriver.v2 as uc from selenium.webdriver.common.service import Service from webdriver_manager.chrome import ChromeDriverManager class Scrapper: def __init__(self): self.driver = None self.page_load_time_out = 20 def get_driver(self): options = uc.ChromeOptions() # 省略其他options配置 chrome_service = Service(ChromeDriverManager().install()) print(chrome_service.creationflags) try: from subprocess import CREATE_NO_WINDOW chrome_service.creationflags = CREATE_NO_WINDOW except ImportError: pass print(chrome_service.creationflags) driver = uc.Chrome( options=options, service=chrome_service ) self.driver = driver # 创建driver后重新设置参数 try: from subprocess import CREATE_NO_WINDOW self.driver.service.creationflags = CREATE_NO_WINDOW except ImportError: pass print(self.driver.service.creationflags) def get_page(self, url): self.get_driver() print(self.driver.service.creationflags) self.driver.set_page_load_timeout(self.page_load_time_out) self.driver.get(url) # 省略后续逻辑
控制台输出:
0 134217728 134217728 134217728
参数值正确,但控制台窗口问题未解决。
方案3:修改Selenium源码
直接修改selenium.webdriver.common.service源码,本地环境有效,但打包后分享给他人运行时程序会冻结,无法正常使用。
可行解决方案
针对undetected-chromedriver的特性,需要在服务启动环节强制注入CREATE_NO_WINDOW标志,以下是两种可靠方法:
方法1:自定义Service类继承并重写start方法
通过自定义Service类,在服务启动前强制设置CREATE_NO_WINDOW,避免被undetected-chromedriver覆盖:
import undetected_chromedriver.v2 as uc from selenium.webdriver.common.service import Service from webdriver_manager.chrome import ChromeDriverManager import subprocess class HiddenChromeService(Service): def start(self): try: self.creationflags = subprocess.CREATE_NO_WINDOW except AttributeError: pass super().start() class Scrapper: def __init__(self): self.driver = None self.page_load_time_out = 20 def get_driver(self): options = uc.ChromeOptions() # 可选:添加无头模式等配置 options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') chrome_service = HiddenChromeService(ChromeDriverManager().install()) driver = uc.Chrome( options=options, service=chrome_service ) self.driver = driver def get_page(self, url): self.get_driver() self.driver.set_page_load_timeout(self.page_load_time_out) self.driver.get(url) # 省略后续逻辑
方法2:PyInstaller打包时额外配置
打包时添加--noconsole参数,并确保chromedriver的依赖被正确打包:
pyinstaller --onefile --windowed --noconsole --hidden-import undetected_chromedriver.v2 --hidden-import webdriver_manager your_script.py
结合方法1使用,可彻底避免控制台窗口弹出。
内容的提问来源于stack exchange,提问作者555Russich
相关产品推荐
相关产品推荐

