Python Selenium长按功能失效,如何修复以绕过Walmart验证码
Selenium长按鼠标绕过沃尔玛PerimeterX验证的修改方案
原代码核心错误
- 调用
move_to_element_with_offset()时参数计算错误:该方法的偏移量是相对于元素左上角的相对坐标,不需要额外叠加元素的全局坐标frame_x/frame_y,原代码的偏移量直接超出了元素范围,自然触发不了按住效果 - 动作逻辑过于机械:沃尔玛用的PerimeterX验证码对人工操作的行为特征校验严格,无过渡的瞬时点击+硬等待的模式很容易被判定为机器人
- 动作执行逻辑冗余:重复调用
release()和perform()反而会增加被检测的概率
修改后的可运行代码
from selenium import webdriver from selenium.webdriver import ActionChains import time driver = webdriver.Firefox() driver.get('https://www.walmart.com/blocked?url=L2lwL0Nsb3JveC1EaXNpbmZlY3RpbmctV2lwZXMtMjI1LUNvdW50LVZhbHVlLVBhY2stQ3Jpc3AtTGVtb24tYW5kLUZyZXNoLVNjZW50LTMtUGFjay03NS1Db3VudC1FYWNoLzE0ODk4MzY1&uuid=9ed7f800-f288-11eb-ad50-1b3c9c7d7310&vid=9cf07351-f288-11eb-9ab5-ef26d206453b&g=b') # 等待验证码元素加载完成,避免找不到元素报错 time.sleep(2) element = driver.find_element_by_xpath("//div[@id='px-captcha']") action = ActionChains(driver) # 仅计算元素中心的相对偏移,不需要叠加元素全局坐标 x_offset = element.size['width'] * 0.5 y_offset = element.size['height'] * 0.5 # 模拟人手移动停顿的动作特征,降低被识别概率 action.move_to_element_with_offset(element, x_offset, y_offset) action.pause(0.3) action.click_and_hold() action.pause(6) # 一般PX验证按住4-8秒即可通过,不需要10秒长等待 action.release() action.perform() # 等待验证结果加载 time.sleep(2)
额外优化建议
- 如果还是被拦截,可以给Firefox配置反检测参数,比如禁用webdriver特征、修改navigator字段
- 按住过程中可以加入1-2像素的小范围随机鼠标移动,更接近真人操作特征
- 不要用无头模式运行,无头模式下PerimeterX的拦截率会大幅提升
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

