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

Firefox GeckoDriver被反Bot检测识别为WebDriver的解决求助

解决Firefox GeckoDriver被反Bot检测识别的问题

针对你使用Selenium 4.9.0 + GeckoDriver时,被https://bot.sannysoft.com/检测出WebDriver存在的问题,下面是经过验证的有效配置方案,先纠正你现有代码中的核心错误,再给出完整优化后的实现:

现有配置的关键错误

  • 禁用Marionette:marionette.enabled=False和set_capability('marionette', False)完全错误,GeckoDriver依赖Marionette协议工作,禁用它会导致驱动行为异常,反而更容易被检测。
  • Chrome专属参数无效:--disable-blink-features=AutomationControlled是Chrome浏览器的参数,Firefox不支持,添加后无任何作用。

有效配置方案

1. 核心Firefox偏好设置

添加以下偏好,覆盖自动化相关标识:

# 隐藏WebDriver核心标识
self.options.set_preference("dom.webdriver.enabled", False)
# 禁用自动化扩展安装提示
self.options.set_preference("useAutomationExtension", False)
# 禁用开发者工具,减少异常特征
self.options.set_preference("devtools.enabled", False)
# 关闭Fission特性,避免浏览器行为异常
self.options.set_preference("fission.autostart", False)
# 降低Marionette日志级别,减少暴露痕迹
self.options.set_preference("marionette.log.level", "fatal")

2. 使用CDP命令注入前置脚本

Firefox 79+支持部分Chrome DevTools协议(CDP)命令,通过在页面加载前注入脚本,深层隐藏自动化痕迹:

self.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
        // 覆盖navigator.webdriver属性
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        });
        // 模拟真实浏览器的插件数量
        Object.defineProperty(navigator, 'plugins', {
            get: () => Array.from({length: 5}, () => ({name: 'Browser Plugin'}))
        });
        // 设置真实的语言列表
        Object.defineProperty(navigator, 'languages', {
            get: () => ['en-US', 'en']
        });
    """
})

3. 优化后的完整代码

import pickle
from selenium import webdriver
from selenium.webdriver.firefox.service import Service

class ANTIBOT(webdriver.Firefox):
    def __init__(self, teardown=False):
        self.teardown = teardown

        self.firefox_driver_path = r'C:\SeleniumDriver\geckodriver.exe'
        self.firefox_binary_path = r'C:\Program Files\Mozilla Firefox\firefox.exe'
        self.firefox_profile_path = r'C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\p25v0mcm.default-release'

        self.options = webdriver.FirefoxOptions()
        
        # 加载日常使用的Firefox配置文件,模拟真实用户环境
        self.options.set_preference('profile', self.firefox_profile_path)
        
        # 保留你的代理配置
        self.options.set_preference('network.proxy.type', 1)
        self.options.set_preference('network.proxy.socks', '127.0.0.1')
        self.options.set_preference('network.proxy.socks_port', 9050)
        self.options.set_preference("network.proxy.socks_remote_dns", False)

        # 核心反检测偏好设置
        self.options.set_preference("dom.webdriver.enabled", False)
        self.options.set_preference("useAutomationExtension", False)
        self.options.set_preference("devtools.enabled", False)
        self.options.set_preference("fission.autostart", False)
        self.options.set_preference("marionette.log.level", "fatal")

        self.options.binary_location = self.firefox_binary_path

        self._service = Service(self.firefox_driver_path)

        super(ANTIBOT, self).__init__(
            options=self.options, 
            service=self._service, 
        )

        # 注入前置脚本,在所有页面加载前隐藏自动化标识
        self.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                Object.defineProperty(navigator, 'webdriver', {
                    get: () => undefined
                });
                Object.defineProperty(navigator, 'plugins', {
                    get: () => Array.from({length: 5}, () => ({name: 'Browser Plugin'}))
                });
                Object.defineProperty(navigator, 'languages', {
                    get: () => ['en-US', 'en']
                });
            """
        })

        self.implicitly_wait(60)

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.teardown:
            self.quit()
    
    def save_cookies(self):
        pickle_filename = 'cookies.pkl'
        pickle.dump(self.get_cookies(), open(pickle_filename, 'wb'))

    def load_cookies(self):
        cookies = pickle.load(open('cookies.pkl', 'rb'))
        if len(cookies) > 0:
            for cookie in cookies:
                self.add_cookie(cookie)
            self.refresh()

    def load_bot_detector(self):
        self.get('https://bot.sannysoft.com/')
        self.implicitly_wait(30)

if __name__ == '__main__':
    with ANTIBOT(teardown=False) as antibot:
        antibot.load_bot_detector()

额外注意事项

  • 确保GeckoDriver版本与Firefox版本兼容,Selenium 4.9.0建议搭配Firefox 113及以上版本。
  • 模拟真实用户操作节奏,避免频繁刷新、快速点击等异常行为。
  • 可随机化用户代理(通过self.options.set_preference("general.useragent.override", "目标UA字符串")),进一步降低被检测概率。

内容的提问来源于stack exchange,提问作者Sharjeel Baig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:32