Selenium Python自动登录遇HTTP 405被识别为机器人,求解决及非无头验证疑问
一、如何避免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

