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

如何使用Python和Selenium绕过iHerb网站的按住式验证码?

解决iHerb验证码(px-captcha)爬取障碍的方案

一、修正当前定位与操作代码(针对iframe+Shadow Root场景)

你的代码失败核心原因是未正确处理iframe和Shadow DOM的层级关系,直接定位#px-captcha无效,必须按以下步骤操作:

  1. 切换到验证码所在的iframe
    iHerb的px-captcha通常嵌套在独立iframe中,先找到并切换到该iframe:
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains

# 切换到验证码iframe(需根据实际页面调整选择器,比如通过title、src属性定位)
captcha_iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[title*="captcha"]')
driver.switch_to.frame(captcha_iframe)
  1. 定位Shadow Root内的验证码元素
    px-captcha的交互元素封装在Shadow DOM中,需通过JS获取Shadow Root后再定位目标元素:
# 获取Shadow Root
shadow_root = driver.execute_script('return document.querySelector("#px-captcha").shadowRoot')

# 在Shadow Root内找到滑块元素(示例选择器,需根据实际DOM调整,比如.px-slider或.px-captcha-slider)
slider_element = shadow_root.find_element(By.CSS_SELECTOR, '.px-slider')
  1. 模拟符合验证逻辑的操作
    多数px-captcha需要拖动滑块而非单纯按住,模拟真实用户的拖动轨迹:
action = ActionChains(driver)
# 按住滑块
action.click_and_hold(slider_element).perform()
# 模拟拖动(偏移量根据页面滑块长度调整,比如300px)
action.move_by_offset(300, 0).perform()
# 短暂停留后释放
time.sleep(0.3)
action.release().perform()

# 切回主文档(后续操作需要的话)
driver.switch_to.default_content()

二、其他绕过验证码的补充方案

如果上述方法仍无法通过验证,可尝试以下反爬规避手段:

  • 使用undetected-chromedriver替代原生ChromeDriver:它会自动屏蔽Selenium的自动化特征(如webdriver标识),降低被反爬系统识别的概率。
  • 控制请求频率:每次请求间隔设置为3-5秒以上,避免短时间内大量请求触发验证码。
  • 轮换代理IP与User-Agent:使用代理池随机切换IP,同时每次请求更换不同的浏览器UA字符串,模拟真实用户的访问行为。
  • 避免重复操作:不要频繁刷新页面或重复提交相同请求,保持操作流程与真实用户一致。

注意事项

爬取iHerb数据需严格遵守网站的robots.txt协议与用户条款,过度爬取可能导致IP封禁或法律风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:13