BOM发料对比

This commit is contained in:
hjq
2026-06-23 11:25:56 +08:00
parent b0dfc6214f
commit d9e6c5b6f8

View File

@@ -13,7 +13,9 @@ import urllib.request
from pathlib import Path from pathlib import Path
from dotenv import load_dotenv from dotenv import load_dotenv
from DrissionPage import ChromiumPage, ChromiumOptions from DrissionPage import ChromiumPage, ChromiumOptions
from DrissionPage._base.chromium import handle_options from DrissionPage._base.chromium import Chromium, handle_options
from DrissionPage._base.driver import BrowserDriver
from DrissionPage._pages.chromium_tab import ChromiumTab
# ── 加载 .env ───────────────────────────────────────────────────────────────── # ── 加载 .env ─────────────────────────────────────────────────────────────────
load_dotenv(Path(__file__).parent / ".env") load_dotenv(Path(__file__).parent / ".env")
@@ -99,6 +101,17 @@ def cleanup_debug_port(address: str) -> None:
) )
def clear_drission_singletons() -> None:
"""
清理 DrissionPage 的全局单例缓存。
失败后的半初始化对象会残留在这些缓存中,后续重试会错误复用脏对象。
"""
Chromium._BROWSERS.clear()
ChromiumPage._PAGES.clear()
ChromiumTab._TABS.clear()
BrowserDriver.BROWSERS.clear()
def probe_devtools_endpoints(address: str, log_output: bool = True) -> dict: def probe_devtools_endpoints(address: str, log_output: bool = True) -> dict:
"""探测 DevTools HTTP 端点,并返回解析后的版本信息与标签页信息。""" """探测 DevTools HTTP 端点,并返回解析后的版本信息与标签页信息。"""
result = {"version": None, "list": None} result = {"version": None, "list": None}
@@ -166,6 +179,9 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
browser_path = resolve_browser_path() browser_path = resolve_browser_path()
effective_headless = headless or is_docker effective_headless = headless or is_docker
if is_docker:
clear_drission_singletons()
if effective_headless: if effective_headless:
co.set_argument("--headless=new") co.set_argument("--headless=new")
co.set_argument("--disable-gpu") co.set_argument("--disable-gpu")
@@ -227,6 +243,7 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
if is_linux_env() and fallback_page_ws and "Handshake status 404 Not Found" in str(e): if is_linux_env() and fallback_page_ws and "Handshake status 404 Not Found" in str(e):
log("WARN", f"[DEBUG] Browser WS 握手失败,尝试降级连接 Page WS: {fallback_page_ws}") log("WARN", f"[DEBUG] Browser WS 握手失败,尝试降级连接 Page WS: {fallback_page_ws}")
try: try:
clear_drission_singletons()
fallback_co = ChromiumOptions() fallback_co = ChromiumOptions()
fallback_co.set_address(fallback_page_ws) fallback_co.set_address(fallback_page_ws)
page = ChromiumPage(fallback_co) page = ChromiumPage(fallback_co)
@@ -238,6 +255,7 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
log("WARN", f"[DEBUG] 尝试清理地址 {actual_address} 后重试...") log("WARN", f"[DEBUG] 尝试清理地址 {actual_address} 后重试...")
try: try:
clear_drission_singletons()
cleanup_debug_port(actual_address) cleanup_debug_port(actual_address)
time.sleep(1) time.sleep(1)
page = ChromiumPage(opt) page = ChromiumPage(opt)