You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:15:44