Chrome --headless模式下Selenium代码失效,普通模式运行正常
问题原因
- Instagram反机器人策略拦截:平台会精准识别使用默认
--headless参数启动的Chrome浏览器,判定为自动化操作。普通模式下浏览器特征符合正常用户行为不会被拦截,无头模式下登录后不会弹出后续的通知提示弹窗,甚至直接返回人机验证、登录失败页面,导致你定位的Not Now按钮不存在,触发超时错误。 - 浏览器特征差异:默认无头模式的User-Agent、窗口分辨率、设备指纹和普通Chrome存在明显差异,很容易被平台指纹检测系统识别。
- 无头模式版本兼容性问题:Chrome 96及以上版本存在新旧两套无头模式,旧版无头模式(默认的
--headless)更容易被网站拦截,新版无头模式行为和普通Chrome更接近,兼容性更好。
解决方法
第一步:修改Chrome启动参数
替换原有Chrome配置部分的代码,添加反检测配置:
def instagram_login(): chrome_options = webdriver.ChromeOptions() # 用新版无头模式替换旧版 chrome_options.add_argument("--headless=new") # 手动设置普通Chrome的User-Agent,可在普通Chrome地址栏输入chrome://version/查询本机UA后替换 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") # 移除自动化控制标记 chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) # 固定窗口分辨率,避免元素加载错位 chrome_options.add_argument("--window-size=1920,1080") # Linux环境下必要参数,解决资源限制问题 chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome("/home/chromedriver", options=chrome_options) # 覆盖webdriver特征,进一步避免检测 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
第二步:优化按钮定位逻辑
部分场景下登录后不会弹出通知提示框,添加异常捕获避免超时中断程序:
time.sleep(2) try: wait = WebDriverWait(driver, 10) wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Not Now']"))).click() except TimeoutException: # 未找到按钮直接跳过,不影响后续逻辑 pass
第三步:排查辅助
如果修改后仍然报错,可以在点击登录按钮后添加截图代码,确认无头模式下实际页面加载状态:
loginbt[1].click() time.sleep(5) # 保存截图排查是否出现人机验证、登录失败等异常页面 driver.save_screenshot("login_status.png")
内容的提问来源于stack exchange,提问作者pkk
相关产品推荐
相关产品推荐

