如何解決 undetected_chromedriver 啟動慢問題

要解決 undetected_chromedriver 啟動慢的問題,可以從以下幾個方面優化配置和代碼:

1. 指定本地 Chrome 二進制路徑

避免自動搜索 Chrome 路徑,直接指定位置:

driver = uc.Chrome(browser_executable_path=r'C:\Program Files\Google\Chrome\Application\chrome.exe'
)

2. 禁用 GPU 和沙盒(關鍵優化)

添加以下啟動參數加速初始化:

options = uc.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')  # Linux/macOS 需要
options.add_argument('--disable-dev-shm-usage')  # Linux 需要driver = uc.Chrome(options=options)

3. 復用用戶數據目錄

避免每次創建新配置文件(保留登錄狀態):

options.add_argument(f'--user-data-dir={CUSTOM_PROFILE_PATH}')

4. 禁用圖片加載(可選)

減少網絡請求提升加載速度:

prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)

5. 關閉瀏覽器管理功能

禁用無關服務:

options.add_argument('--disable-browser-side-navigation')
options.add_argument('--disable-features=CloudManagement,Translate')

6. 指定 Chromedriver 路徑

避免自動下載和版本檢查:

driver = uc.Chrome(driver_executable_path=r'path/to/existing/chromedriver'
)

7. 關閉詳細日志輸出

減少控制臺輸出延遲:

import logging
logging.getLogger('undetected_chromedriver').setLevel(logging.WARNING)

8. 使用 Headless 模式(謹慎使用)

部分場景可用(但可能被檢測):

options.add_argument('--headless=new')  # Chrome 112+ 推薦

完整優化示例代碼

import undetected_chromedriver as uc
import logging# 關閉冗余日志
logging.getLogger('undetected_chromedriver').setLevel(logging.WARNING)options = uc.ChromeOptions()# 核心優化參數
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')# 可選優化
options.add_argument('--disable-browser-side-navigation')
options.add_argument('--disable-infobars')
options.add_argument('--disable-extensions')# 指定本地Chrome路徑
browser_path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'# 啟動配置
driver = uc.Chrome(options=options,browser_executable_path=browser_path,driver_executable_path=r'D:\chromedriver.exe',  # 指定已下載的驅動headless=False,use_subprocess=False  # 避免額外進程開銷
)driver.get("https://example.com")

其他建議:

  • 定期更新:確保 undetected_chromedriver、Chrome 和 Chromedriver 版本兼容。
  • 硬件加速:在物理機而非虛擬機中運行。
  • 網絡檢查:排除代理/VPN 導致的延遲。
  • 緩存利用:首次啟動較慢屬正常,后續啟動會因緩存加快。

通過上述優化,通常可將啟動時間從 10+ 秒縮短至 3-5 秒。如仍緩慢,建議檢查系統資源占用或嘗試在純凈環境中測試。

思考1:如果不指定本地 Chrome 二進制路徑,uc.Chrome如何尋找路徑的?

undetected_chromedriver(簡稱 UC)在未指定 Chrome 二進制路徑時,會通過智能搜索機制自動查找系統中的 Chrome 安裝位置。其查找邏輯如下:

自動查找路徑的順序

  1. 操作系統特定路徑

    • Windows
      • 注冊表查找:HKEY_CURRENT_USER\Software\Google\Chrome\BLBeaconinstall_path
      • 默認安裝路徑:
        [r"C:\Program Files\Google\Chrome\Application\chrome.exe",r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",r"%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe"
        ]
        
    • macOS
      ["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
      ]
      
    • Linux
      ["/usr/bin/google-chrome","/usr/bin/chromium-browser","/usr/bin/chromium","/snap/bin/chromium"
      ]
      
  2. 環境變量檢測

    • 檢查系統 PATH 環境變量中的 google-chromechromium-browser
    • 嘗試執行 which google-chrome (Linux/macOS) 或 where chrome.exe (Windows)
  3. 版本優先邏輯

    • 當檢測到多個 Chrome 安裝時,UC 會:
      1. 解析每個可執行文件的版本號(通過 chrome.exe --version
      2. 自動選擇最新版本的 Chrome 實例

自動查找的源碼邏輯(簡化版)

UC 的核心查找函數大致如下:

def find_chrome_executable():# 1. 檢查顯式指定的環境變量if env_path := os.getenv("CHROME_PATH"):if os.path.exists(env_path):return env_path# 2. 平臺特定路徑探測candidates = []if sys.platform == "win32":# 注冊表探測try:import winregwith winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Software\Google\Chrome\BLBeacon") as key:path = winreg.QueryValueEx(key, "install_path")[0] + "\\chrome.exe"candidates.append(path)except Exception: pass# 添加常見路徑candidates.extend([...])  # 前述默認路徑elif sys.platform == "darwin":candidates = [...]  # macOS 路徑else:  # Linux/BSDcandidates = [...]  # Linux 路徑# 3. PATH 環境變量搜索for exe in ("google-chrome", "chromium-browser", "chromium", "chrome"):if path := shutil.which(exe):candidates.append(path)# 4. 驗證并選擇最新版本valid_paths = []for path in candidates:if os.path.exists(path) and "chrome" in os.path.basename(path).lower():version = get_version(path)  # 執行 --version 獲取版本valid_paths.append((version, path))if not valid_paths:raise ChromeNotFoundError("Chrome executable not found")# 按版本號降序排序并返回最新版valid_paths.sort(key=lambda x: x[0], reverse=True)return valid_paths[0][1]

為什么自動查找可能導致啟動慢?

  1. 多路徑掃描開銷

    • 需要檢查 5-10 個可能路徑
    • 每個路徑都需要文件系統訪問(I/O 操作)
  2. 版本檢測延遲

    • 對每個候選路徑執行 chrome --version
    • 啟動子進程并解析輸出(約 100-500ms/次)
  3. 注冊表查詢(Windows)

    • 訪問 Windows 注冊表引入額外延遲
  4. 環境變量搜索

    • 遍歷 PATH 目錄列表可能較慢(尤其 PATH 很長時)

優化建議

# 顯式指定路徑可避免所有探測開銷
driver = uc.Chrome(browser_executable_path=r"C:\Ground Truth\Chrome\chrome.exe"  # 實測提速 0.5-2 秒
)

診斷技巧

查看 UC 實際使用的路徑:

driver = uc.Chrome()
print(driver.capabilities['browserVersion'])  # 瀏覽器版本
print(driver.service.service.path)            # chromedriver 路徑
# Chrome 路徑需檢查 UC 啟動日志或通過進程管理器查看

通過顯式指定路徑,可完全跳過自動查找過程,通常能減少 0.5-3 秒的啟動時間(具體取決于系統性能)。

思考2:undetected_chromedriver.exe是如何根據本機的版本自動下載對應的driver版本?

是的,undetected_chromedriver(通常簡稱為 UC)會自動處理 Chromedriver 的版本匹配和下載。這是它的核心功能之一,工作流程如下:

自動版本匹配機制

  1. 檢測 Chrome 版本

    • 首先檢測系統中安裝的 Chrome 瀏覽器版本(通過 chrome --version
    • 獲取完整版本號如 124.0.6367.91
  2. 檢查本地緩存

    • 在用戶目錄緩存中查找匹配的 Chromedriver
    • 默認緩存路徑:
      • Windows: C:\Users\<用戶名>\AppData\Local\undetected_chromedriver
      • Linux/macOS: ~/.cache/undetected_chromedriver
  3. 下載匹配版本

    • 若緩存中沒有匹配版本,自動從官方源下載:
      • 主源:https://chromedriver.storage.googleapis.com
      • 備用源:https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing
    • 優先下載完全匹配版本(如 124.0.6367.91)
    • 若無完全匹配,下載最接近的主版本(如 124.x.x.x)
  4. 版本兼容處理

    graph TD
    A[檢測Chrome版本] --> B{緩存存在?}
    B -->|是| C[使用緩存驅動]
    B -->|否| D[下載匹配驅動]
    D --> E{完全匹配?}
    E -->|是| F[使用精確版本]
    E -->|否| G[使用最近主版本]
    G --> H[驗證兼容性]
    H --> I[保存到緩存]
    

關鍵特性

  1. 跨平臺支持

    • 自動下載 Windows/macOS/Linux 對應的驅動版本
    • 處理執行權限(Linux/macOS)
  2. 智能回退

    • 當精確版本不可用時,自動選擇:
      • 相同主版本的最新版(如 Chrome 124.0.6367.91 → Chromedriver 124.0.6367.91 或 124.0.6367.60)
      • 若主版本不匹配,嘗試 ±1 的主版本
  3. 緩存管理

    • 自動維護緩存目錄
    • 舊版本自動清理(默認保留最近3個版本)

手動控制方式

  1. 指定主版本號

    driver = uc.Chrome(version_main=124)  # 強制使用Chrome 124系列的驅動
    
  2. 禁用自動下載

    driver = uc.Chrome(driver_executable_path='/path/to/your/chromedriver',auto_download=False
    )
    
  3. 自定義下載源

    import undetected_chromedriver as uc
    uc.install(executable_path='chromedriver', chromedriver_main_url='https://your-mirror.com/')
    

常見問題解決

Q: 下載慢或失敗?

# 解決方案1:使用國內鏡像
os.environ['CHROMEDRIVER_DOWNLOAD_URL'] = 'https://npmmirror.com/mirrors/chromedriver'# 解決方案2:手動下載后放入緩存目錄
# 文件名格式:{版本號}_chromedriver_{系統} 
# 示例:124.0.6367.91_chromedriver_win32.zip

Q: 版本不兼容?

  • 更新 UC 庫:pip install -U undetected_chromedriver
  • 確保 Chrome 瀏覽器為最新版

驗證驅動版本

driver = uc.Chrome()
print(f"瀏覽器版本: {driver.capabilities['browserVersion']}")
print(f"驅動版本: {driver.capabilities['chrome']['chromedriverVersion'].split(' ')[0]}")

通過這種智能版本管理,UC 確保了:

  1. 始終使用兼容的瀏覽器/驅動組合
  2. 避免手動下載和版本匹配的麻煩
  3. 首次使用后啟動更快(驅動已緩存)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91322.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 程序設計講義(42):組合數據類型——元組類型:創建元組

Python 程序設計講義&#xff08;42&#xff09;&#xff1a;組合數據類型——元組類型&#xff1a;創建元組 目錄Python 程序設計講義&#xff08;42&#xff09;&#xff1a;組合數據類型——元組類型&#xff1a;創建元組一、元組的特征二、創建元組1、使用圓括號&#xff0…

windows 設置 vscode 免密遠程

我們可以使用 vscode ssh 進行遠程編輯文件項目。也可以使用 ssh 密匙 來實現免密登錄。 本人在本地windows系統有多個密匙&#xff0c;使用 D:\SPB_Data\.ssh\id_rsa_local 進行本地設備進行登錄。 在 vscode ssh 配置文件中添加 IdentityFile 配置 Host 本地設備ipHostName …

ubuntu自動搭建Android平臺NDK編譯環境

sh setup_ndk_env.sh自動下載NDK并解壓 提取Android平臺工具鏈 驗證Android工具鏈 設置工具鏈變量 export CROSS_TRIPLE=aarch64_linux_android export CROSS_ROOT=/home/ubuntu/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}/bin/llvm-as exp…

添加捕捉吸附標識(使用QT+OpenGL開發三維CAD)

捕捉吸附標識怎么畫出來&#xff1f;在點吸附的時候能夠展示吸附標識可以讓用戶更直觀的看到當前捕捉點&#xff0c;從而更準確的進行設計和繪制。 效果視頻見原文&#xff1a;添加捕捉吸附標識&#xff08;使用QTOpenGL開發三維CAD&#xff09; 16.Add snap label 鼠標捕捉吸…

元宇宙中的“蟲洞“:技術實現、應用場景與未來挑戰

一、技術定義與核心架構1.1 蟲洞的元宇宙隱喻概念來源&#xff1a;蟲洞在物理學中是連接不同時空的通道&#xff0c;而在元宇宙中&#xff0c;這一概念被引申為連接不同虛擬世界的跨平臺協議。英偉達Omniverse平臺通過USD&#xff08;通用場景描述&#xff09;實現了這一隱喻&a…

使用GIS中基于森林的分類與回歸模型來估算房屋價值

“基于森林的分類與回歸”&#xff0c;它可以幫助分析師有效地設計、測試和部署預測模型。 基于森林的分類與回歸應用了 Leo Breiman 的隨機森林算法&#xff0c;這是一種用于分類和預測的流行監督機器學習方法。該工具允許分析師輕松整合表格屬性、基于距離的要素和解釋柵格來…

《 java 隨想錄》| LeetCode鏈表高頻考題

前言&#xff1a;這是專門針對java語言講解的算法解析&#xff08;題目順序大致參考《代碼隨想錄》&#xff09;思維導圖操作鏈表刪除節點刪除鏈表中 D 節點時&#xff0c;只需將其前驅節點 C 的 next 指針指向 D 的下一個節點 E。添加節點?先讓 新節點 F 的 next 指針 指向 C…

學習嵌入式的第三十一天-數據結構-(2025.7.23)網絡協議封裝

今天的內容主要是網絡協議以及常用工具的介紹。協議頭與數據封包/拆包數據封包示例&#xff1a;MAC|IP|TCP|hello| ———————————— IP數據報IP頭信息默認20字節常用網絡測試工具telnetnetstatpingarpwiresharktcpdumpssh2secure crt工具安裝命令sudo ufw disable sud…

STL學習(十、常用排序、拷貝、替換算法)

目錄 一、常用排序算法 1.sort (1) 內置數據類型 (2)自定義數據類型 2. random_shuffle(iterator beg, iterator end) 3.merge 4.reverse 二、常用的拷貝和替換算法 1.copy(起始不如直接賦值) 2.replace 3.replace_if 4.swap 一、常用排序算法 1.sort 函數原型 s…

【Datawhale AI夏令營】科大訊飛AI大賽(大模型技術)/夏令營:讓AI理解列車排期表(Task3)

我沒招了jpgimport pandas as pd import requests import re import json from tqdm import tqdm from datetime import datetime, timedeltadef calculate_stop_duration(arrival_time_str, departure_time_str):"""計算列車停留時長&#xff0c;處理跨天和異常…

【前后端】node mock.js+json-server

JSON-Server 一個在前端本地運行&#xff0c;可以存儲json數據的server。前端開發可以模擬服務端接口數據&#xff0c;在本地搭建一個JSON服務&#xff0c;自己產生測試數據。 使用npm全局安裝json-server &#xff1a;npm install -g json-server可以通過查看版本號&#xff0…

疏老師-python訓練營-Day30模塊和庫的導入

浙大疏錦行 知識點回顧&#xff1a; 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯&#xff1a;找到根目錄&#xff08;python解釋器的目錄和終端的目錄不一致&#xff09; 作業&#xff1a;自己新建幾個不同路徑文件嘗試下如何導入 一.學習知識點 DAY30 …

神經網絡知識討論

AI 核心任務與數據類型&#xff1a;特征提取核心&#xff1a;AI 的核心是從原始輸入數據中提取特征&#xff0c;CV 是將圖像數據轉換為計算機可識別的特征&#xff0c;NLP 是將文本數據轉換為特征&#xff0c;數據挖掘是將結構化數據轉換為特征。數據類型特點&#xff1a;圖像數…

kotlin類型可為空,進行空安全的區別

定義一個可為空的變量b(String?),默認沒有&#xff1f;是不可以為空的 var b: String? "Kotlin" b null print(b) // 輸出 null默認不可為空 var a: String "Kotlin" a null // 編譯器報錯&#xff0c;null 不能被賦給不為空的變量空安全調用&#x…

Mysql事務基礎

事務是一個不可分割的數據庫操作序列&#xff0c;也是數據庫并發控制的基本單位&#xff0c;其執行的結果必須使數據庫從一種一致性狀態變到另一種一致性狀態。事務是邏輯上的一組操作&#xff0c;要么都執行&#xff0c;要么都不執行 事務的特點 A&#xff08;Atomicity&#…

FastAPI入門:安裝、Pydantic、并發和并行

本系列參考FastAPI官方文檔&#xff1a;https://fastapi.tiangolo.com/zh/python-types/安裝 使用pip安裝&#xff1a; pip install fastapi此外還需要 ASGI 服務器&#xff0c;生產環境可以使用 Uvicorn 或者 Hypercorn。 ASGI服務器&#xff1a;異步服務網關接口&#xff0c;…

歡樂的周末 - 華為OD統一考試(JavaScript 題解)

題目描述 小華和小為是很要好的朋友,他們約定周末一起吃飯。 通過手機交流,他們在地圖上選擇了多個聚餐地點(由于自然地形等原因,部分聚餐地點不可達)。 求小華和小為都能到達的聚餐地點有多少個? 輸入描述 第一行輸入m和n,m代表地圖的長度,n代表地圖的寬度 第二行…

算法競賽階段二-數據結構(38)數據結構動態鏈表list

動態鏈表&#xff08;List&#xff09;的基本概念動態鏈表是一種線性數據結構&#xff0c;通過節點間的指針連接實現動態內存分配。與數組不同&#xff0c;鏈表的大小可隨需增減&#xff0c;插入和刪除操作的時間復雜度為 O(1)&#xff08;已知位置時&#xff09;&#xff0c;但…

Qt 移動應用推送通知實現

推送通知是移動應用提升用戶粘性的核心功能——無論是即時消息提醒、活動推送還是狀態更新&#xff0c;都需要通過推送功能觸達用戶。Qt雖未直接提供跨平臺推送API&#xff0c;但可通過集成原生服務&#xff08;如Firebase Cloud Messaging、Apple Push Notification service&a…

Word和WPS文字如何制作分欄試卷?想分幾欄分幾欄

使用Word和WPS文字制作試卷的時候&#xff0c;通常會使用A3大小的紙張&#xff0c;橫向布局。但是如果題目的題干、問題、選項文字太少&#xff0c;會帶來試卷上有較大的空白&#xff0c;既不美觀又浪費紙&#xff0c;解決辦法就是將試卷分欄&#xff0c;根據需要分成多欄&…