|
|
@@ -35,6 +35,21 @@ class Scraper1688:
|
|
|
if self.driver:
|
|
|
stealth(self.driver, languages=["zh-CN", "zh"], vendor="Google Inc.", platform="Win32", fix_hairline=True)
|
|
|
|
|
|
+ def _find_chrome(self):
|
|
|
+ """ 强力锁定 Chrome 安装路径 """
|
|
|
+ import winreg
|
|
|
+ reg_paths = [
|
|
|
+ (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe"),
|
|
|
+ (winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe")
|
|
|
+ ]
|
|
|
+ for hkey, subkey in reg_paths:
|
|
|
+ try:
|
|
|
+ with winreg.OpenKey(hkey, subkey) as key:
|
|
|
+ path, _ = winreg.QueryValueEx(key, "")
|
|
|
+ if os.path.exists(path): return path
|
|
|
+ except: continue
|
|
|
+ return None
|
|
|
+
|
|
|
def _cleanup(self):
|
|
|
""" 清理残留进程和锁定文件 """
|
|
|
if os.name == 'nt':
|
|
|
@@ -48,7 +63,9 @@ class Scraper1688:
|
|
|
except: pass
|
|
|
|
|
|
def _init_chrome(self, headless):
|
|
|
- """ 强化版初始化:解决 session not created 连接失败问题 """
|
|
|
+ """ 终极初始化:解决浏览器不弹出及连接失败问题 """
|
|
|
+ chrome_path = self._find_chrome()
|
|
|
+
|
|
|
def create_options():
|
|
|
opts = uc.ChromeOptions()
|
|
|
opts.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36')
|
|
|
@@ -56,22 +73,37 @@ class Scraper1688:
|
|
|
if headless: opts.add_argument('--headless=new')
|
|
|
opts.add_argument('--disable-blink-features=AutomationControlled')
|
|
|
opts.add_argument("--window-size=1920,1080")
|
|
|
- # 解决 session not created 报错的关键参数
|
|
|
+ # 兼容性全家桶
|
|
|
opts.add_argument("--no-sandbox")
|
|
|
opts.add_argument("--disable-dev-shm-usage")
|
|
|
opts.add_argument("--remote-allow-origins=*")
|
|
|
opts.add_argument("--disable-gpu")
|
|
|
+ opts.add_argument("--disable-software-rasterizer")
|
|
|
+ # 强制不检查默认浏览器
|
|
|
+ opts.add_argument("--no-default-browser-check")
|
|
|
+ opts.add_argument("--no-first-run")
|
|
|
return opts
|
|
|
|
|
|
try:
|
|
|
- # 增加 use_subprocess=True,显著提升 Windows 下的启动稳定性
|
|
|
- self.driver = uc.Chrome(options=create_options(), headless=headless, use_subprocess=True)
|
|
|
+ print(f"[*] 正在通过路径启动 Chrome: {chrome_path}")
|
|
|
+ # 显式指定浏览器路径 (browser_executable_path)
|
|
|
+ self.driver = uc.Chrome(
|
|
|
+ options=create_options(),
|
|
|
+ headless=headless,
|
|
|
+ browser_executable_path=chrome_path
|
|
|
+ )
|
|
|
+ print("[+] Chrome 浏览器已成功弹出!")
|
|
|
except Exception as e:
|
|
|
- print(f"[*] 首次启动失败: {e},正在执行强制清理并重试...")
|
|
|
- self._cleanup() # 彻底杀掉残留进程
|
|
|
- time.sleep(2)
|
|
|
- # 第二次尝试,使用 subprocess 模式
|
|
|
- self.driver = uc.Chrome(options=create_options(), headless=headless, use_subprocess=True)
|
|
|
+ print(f"[*] 首次路径启动失败: {e},尝试全自动兼容模式...")
|
|
|
+ try:
|
|
|
+ self._cleanup()
|
|
|
+ time.sleep(2)
|
|
|
+ # 兜底方案
|
|
|
+ self.driver = uc.Chrome(options=create_options(), headless=headless)
|
|
|
+ print("[+] Chrome 自动兼容模式启动成功!")
|
|
|
+ except Exception as e2:
|
|
|
+ print(f"[致命错误] 无法启动 Chrome: {e2}")
|
|
|
+ raise Exception("请检查是否安装了 Chrome 浏览器,并尝试关闭杀毒软件后运行。")
|
|
|
|
|
|
def clean_url(self, url):
|
|
|
"""极其鲁棒的 1688 URL 清洗逻辑"""
|