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

Selenium Python自动登录遇HTTP 405被识别为机器人,求解决及非无头验证疑问

解决Selenium被识别为机器人及无头模式实时查看的问题

一、如何避免Selenium被网站识别为机器人?

遇到"Pardon our Interruption"这类反爬提示,核心原因是网站通过浏览器指纹(比如自动化标识、用户代理、行为模式)识别出了Selenium的自动化特征。可以从以下几个方向针对性优化:

  • 隐藏Selenium自动化标识:Chrome默认会暴露navigator.webdriver等特征,需要通过配置和脚本隐藏:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    # 禁用自动化提示条和扩展
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    # 重写navigator.webdriver属性
    driver = webdriver.Chrome(options=options)
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    
  • 配置真实用户代理:替换Selenium默认的UA,模拟主流浏览器的请求标识:

    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")
    
  • 模拟人类行为节奏:

    • 避免瞬间完成所有操作,添加随机延迟(比如import random; time.sleep(random.uniform(1,3)))
    • 优先使用WebDriverWait显式等待元素加载,代替硬编码的sleep
    • 模拟鼠标移动、页面滚动、随机点击无关元素等行为,让操作更贴近真实用户
  • 使用反检测专用驱动:比如undetected-chromedriver,它针对常见反爬机制做了预配置,能大幅降低被识别概率:

    import undetected_chromedriver as uc
    
    driver = uc.Chrome()
    driver.get("你的目标登录页面")
    # 后续登录逻辑和普通Selenium一致
    
  • 处理HTTP 405错误:405通常是请求方法不被允许,确保你是通过模拟用户点击登录按钮触发POST请求,而非直接构造HTTP请求;同时检查是否需要携带Referer、Cookie等请求头。

二、关于无头模式能否实时查看执行状态的判断

你的判断不完全准确!默认的无头模式(--headless)确实不会显示浏览器界面,但可以通过以下两种方式实现实时查看:

  • 新无头模式+远程调试:Chrome 96+支持--headless=new参数,配合远程调试端口开启后,能通过另一Chrome窗口查看实时界面:

    options.add_argument("--headless=new")
    options.add_argument("--remote-debugging-port=9222")
    driver = webdriver.Chrome(options=options)
    

    打开另一Chrome浏览器,访问chrome://inspect,点击"Configure"添加localhost:9222,就能看到无头浏览器的实时操作界面,还能进行调试。

  • 虚拟显示工具:使用pyvirtualdisplay创建虚拟显示器,让无头浏览器的界面显示在虚拟窗口中,本地环境下可以直接看到:

    from pyvirtualdisplay import Display
    import time
    
    # 创建虚拟显示窗口
    display = Display(visible=1, size=(1920, 1080))
    display.start()
    
    # 正常初始化浏览器并执行操作
    driver = webdriver.Chrome(options=options)
    driver.get("你的目标页面")
    time.sleep(5)  # 停留查看状态
    
    # 结束后清理资源
    driver.quit()
    display.stop()
    

    这种方式既保留了无头模式的后台运行特性,又能实时验证代码执行状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:26