LuTong 3 ماه پیش
والد
کامیت
3e962cd58d
1فایلهای تغییر یافته به همراه41 افزوده شده و 9 حذف شده
  1. 41 9
      src/scraper.py

+ 41 - 9
src/scraper.py

@@ -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 清洗逻辑"""