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

Selenium无头模式下跳转指定页面后自动返回主页如何解决

核心原因

这个问题是两个因素共同导致的:

  • 站点近期新增了自动化访问检测规则,默认参数启动的无头Chrome会携带navigator.webdriver标识、特殊UA等明显的爬虫特征,被识别后会直接拦截路由跳转,强制重定向到首页。GUI模式下不存在这些特征泄露,所以功能正常。
  • 原有跳转+刷新的逻辑依赖GUI模式下的执行延迟:JS修改URL后,浏览器需要几十毫秒完成hash路由状态同步,再刷新才能正常加载目标页。无头模式没有渲染节流,JS执行速度比GUI模式快3-5倍,刚改完URL还没等状态写入就触发刷新,站点读不到合法路由参数,直接走兜底逻辑跳回首页。
分步解决方案
  • 首先修复无头模式的特征泄露,不要用默认裸启的无头配置:
from selenium import webdriver
options = webdriver.ChromeOptions()
# 用新版无头模式,比旧版无头的特征更少
options.add_argument("--headless=new")
# 覆盖默认UA,去掉HeadlessChrome标识,版本号和你本地GUI的Chrome版本保持一致即可
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

driver = webdriver.Chrome(options=options)
# 启动后覆写webdriver属性,绕过基础检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
  • 替换原有JS跳转+硬刷新的逻辑,用原生导航方法加显式等待,避免时序问题:
    不要用window.open加window.location.reload()的硬操作,这类操作在单页应用里很容易触发路由守卫拦截,改成Selenium原生导航,等页面状态到位再做后续操作:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 直接导航到目标页
driver.get("https://rivalregions.com/#listed/country/-2/0/hospital")
# 先确认地址栏已经更新为目标URL,避免状态未同步
WebDriverWait(driver, 5).until(EC.url_contains("hospital"))
# 如果确实需要刷新才加载数据,等URL更新后再调刷新
driver.refresh()
# 等目标页专属元素加载完成再做后续数据抓取,这里的选择器替换成医院页独有的元素即可,比如医院列表的容器
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".hospital_list, #hospital_table"))
)
  • 排查会话状态问题:无头模式默认每次启动都用临时配置文件,不会保留你之前在GUI模式下保存的登录态,如果站点要求登录才能访问医院页面,未登录状态下也会被重定向到首页。可以指定固定的用户数据目录,复用已登录的会话:
# 路径替换成你本地新建的空文件夹即可,不要和正在运行的Chrome实例共用同一个目录
options.add_argument(r"--user-data-dir=C:\selenium\rr_profile")
  • 如果上述操作后还是被重定向,就对比两种模式下的网络请求差异:分别在GUI和无头模式下开启浏览器网络日志,看跳转过程中哪个请求返回了重定向状态码,检查是否缺失特定cookie、请求头,对应补上即可。

注意:所有页面操作不要靠固定时长的sleep等待,无头模式的执行速度波动很大,必须用显式等待判断元素、URL状态符合预期后再执行下一步,否则GUI下能跑通的逻辑,在无头里大概率会因为时序问题报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:21:27