You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动