如何通过Selenium配置无头浏览器,使其模拟完整浏览器运行Web应用?
解决无头浏览器被Web应用识别并跳转的问题
我之前也踩过这个坑!很多Web应用会通过各种浏览器指纹识别逻辑,区分无头浏览器和正常有头浏览器,然后直接跳转到浏览器升级页面。不过不用慌,咱们只需要调整无头浏览器的几个核心配置,让它更贴近正常浏览器的行为,就能绕过这个检测。下面分Chrome和Firefox两种情况给你具体方案:
针对Google Chrome无头模式的解决方案
1. 替换User-Agent字符串
Chrome无头模式默认的User-Agent会包含HeadlessChrome标识,这是最容易被检测到的点。咱们直接把它换成普通Chrome的User-Agent:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") # 推荐用新版无头模式,行为更接近正常浏览器 # 替换成对应Chrome版本的User-Agent,这里用的是Chrome 118的示例 options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options)
2. 禁用自动化检测标志
Chrome在无头模式下会开启AutomationControlled特性,这会让navigator.webdriver返回true,正常浏览器则是undefined。咱们直接禁用这个特性:
options.add_argument("--disable-blink-features=AutomationControlled") # 可选:添加一些正常浏览器的启动参数,模拟真实使用场景 options.add_argument("--no-sandbox") options.add_argument("--start-maximized")
3. 手动修改navigator.webdriver属性
如果上面的参数没生效,还可以通过注入JavaScript强制修改这个属性:
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
针对Mozilla Firefox无头模式的解决方案
1. 替换User-Agent字符串
Firefox无头模式的User-Agent同样会带有Headless标识,咱们通过配置偏好替换它:
from selenium import webdriver from selenium.webdriver.firefox.options import Options options = Options() options.add_argument("--headless") # 替换成对应Firefox版本的User-Agent,这里用的是Firefox 118的示例 options.set_preference("general.useragent.override", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:118.0) Gecko/20100101 Firefox/118.0") driver = webdriver.Firefox(options=options)
2. 禁用WebDriver检测
Firefox默认会让navigator.webdriver返回true,咱们通过修改配置把它关掉:
options.set_preference("dom.webdriver.enabled", False) # 可选:如果开启了指纹抵抗,可能会影响检测,按需关闭 options.set_preference("privacy.resistFingerprinting", False)
3. 设置正常窗口大小
Firefox无头模式默认窗口尺寸很小,容易被检测到,咱们设置成常规桌面窗口大小:
options.add_argument("--width=1920") options.add_argument("--height=1080")
小提示
这些方法都是通过修改浏览器的内置配置或属性,让无头模式的行为尽可能贴近正常有头浏览器,从而避开应用的检测逻辑。如果还是不行,可以检查目标应用是否有更复杂的指纹检测(比如Canvas、WebGL指纹),但按照你的需求,仅修改浏览器配置的话,上面的方案应该能解决大部分情况。
内容的提问来源于stack exchange,提问作者Harsha G V




