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
相关产品推荐
相关产品推荐

