为什么Selenium使用Chrome无头模式无法正常获取目标网页的页面源码?
问题原因
你遇到的访问拒绝是纳斯达克站点的反爬机制识别到Chrome无头模式的特征,拦截了自动化请求,具体原因如下:
- User-Agent标识异常:Chrome旧版无头模式默认的请求头User-Agent会携带
HeadlessChrome字样,站点反爬规则匹配到该特征后会直接判定为爬虫,返回403拒绝访问。 - 浏览器特征指纹匹配:无头模式下存在大量和普通用户浏览器不一致的特征,比如
window.navigator.webdriver属性值为true、默认无扩展插件、部分浏览器API返回值异常等,反爬系统的指纹识别规则会命中这些特征,拦截请求。
解决方案
你可以按以下顺序修改配置尝试解决:
替换为新版无头模式参数
如果你使用的是Chrome 112及以上版本,将旧版无头参数替换为新版无头参数,新版无头模式的运行特征和有头模式几乎完全一致,可绕过大部分基础检测:
把原来的chrome_options.add_argument("--headless")
替换为chrome_options.add_argument("--headless=new")自定义正常浏览器的User-Agent
在配置项中添加你本地正常打开Chrome时的User-Agent,覆盖无头模式默认的UA:
# 注意替换下方UA为你自己浏览器的真实UA chrome_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')
- 抹除webdriver标识
在发起请求前执行CDP命令修改浏览器特征,隐藏webdriver属性:
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver",options=chrome_options) # 新增以下代码 browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})' })
- 固定窗口分辨率
无头模式下maximize_window()可能不生效,直接指定固定分辨率避免参数异常被检测:
chrome_options.add_argument('--window-size=1920,1080')
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

