直接调用click()易被反爬识别,因缺乏真实鼠标轨迹;应使用ActionChains模拟带随机偏移、停顿和贝塞尔曲线的移动路径,并配合浏览器指纹伪装等综合策略。

为什么直接调用 click() 会被反爬识别
多数网站(尤其是风控严格的电商、票务、登录页)会通过监听 MouseEvent 的 movementX/movementY、buttons、触发时间间隔、贝塞尔曲线特征等判断是否为真实鼠标。Selenium 默认的 element.click() 是瞬时触发,不产生位移轨迹,driver.execute_script("arguments[0].click()") 更是绕过事件系统,极易被 document.addEventListener('mousemove', ...) 或前端行为分析脚本标记为机器人。
用 ActionChains 模拟带轨迹的移动和点击
核心是分步构造「移动路径」:先从起点(如页面左上角)移动到目标元素中心,再微调偏移、加入随机停顿和加速度变化。关键点:
-
ActionChains的move_by_offset()和move_to_element_with_offset()才生成真实mousemove事件,move_to_element()内部可能优化掉中间轨迹 - 必须用
perform()触发整条链,且链中插入pause()(单位秒,支持小数),否则移动太快仍像脚本 - 目标坐标建议用
element.location_once_scrolled_into_view确保元素在视口内,否则move_to_element可能失败
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
<p>driver = webdriver.Chrome()
driver.get("<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>")
elem = driver.find_element(By.ID, "submit-btn")</p><h1>先滚动到元素可见位置</h1><p>elem.location_once_scrolled_into_view</p><h1>构造带随机偏移和停顿的轨迹</h1><p>actions = ActionChains(driver)
actions.move_by_offset(100, 200).pause(0.3) # 起始偏移(模拟手抖)
actions.move_to_element_with_offset(elem, 5, -3).pause(0.15) # 微调到中心附近
actions.click().pause(0.2)
actions.perform()
进阶:用贝塞尔曲线生成更自然的移动路径
纯线性移动仍显机械。可预生成一组符合贝塞尔公式的中间坐标点,用循环逐点 move_by_offset() 实现。注意:
立即学习“Python免费学习笔记(深入)”;
- 不要硬编码固定点数——太少像折线,太多拖慢执行;通常 8–15 点较合理
- 每次
move_by_offset()后必须pause(0.01~0.05),否则浏览器合并事件,轨迹丢失 - 起始/结束速度应趋近于 0(加速度非恒定),可用
math.sin()或三次贝塞尔插值模拟 - 路径终点建议略偏离元素中心(±3px),再用一次小偏移校准,模仿人类最后微调
绕过前端检测的几个隐蔽细节
光有轨迹还不够。以下参数常被前端采集但容易被忽略:
-
navigator.webdriver值必须为false:启动 Chrome 时加--disable-blink-features=AutomationControlled并执行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})覆盖 - 鼠标移动的
clientX/clientY必须与当前窗口尺寸匹配,否则move_to_element_with_offset()计算出的坐标可能溢出 - 连续操作间的时间戳差(
performance.now())不能过于规律,需在 pause 中加入 ±10ms 随机抖动 - 避免在
iframe内直接操作外层元素,跨 frame 需先switch_to.frame(),否则坐标系错乱
轨迹本身不是银弹——它只是让行为“看起来像人”,而反爬真正拦的是“不像人”的组合特征。坐标、时间、浏览器指纹、网络请求节奏,缺一不可。


















