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

使用Python Selenium无法获取Ultra Liquors网站商品价格的求助

解决Selenium爬取Ultra Liquors商品价格失败的问题

问题根源分析

  • 动态类名不可靠:你使用的price-value-10677是动态生成的类名,数字后缀会随商品或页面加载变化,无法作为稳定的元素定位依据。
  • 缺少元素等待机制:页面动态渲染未完成就执行元素查找,导致目标元素尚未加载完毕。
  • Headless模式渲染限制:部分网站在无头模式下会有不同的渲染逻辑,可能导致元素无法正常显示。

修复步骤与优化代码

1. 改用稳定的元素定位器

放弃依赖动态类名,选择基于父容器或固定属性的定位方式,比如价格元素所在的product-price容器,或带有data-price属性的标签。

2. 添加显式等待

使用WebDriverWait等待元素可见,确保页面完成动态渲染后再执行查找操作。

3. 优化Headless配置

设置窗口大小并模拟真实用户代理,避免网站对无头模式的限制。

修改后的完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 配置Chrome参数
options = Options()
options.add_argument('--headless=new')  # 使用新版无头模式,兼容性更好
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--window-size=1920,1080')  # 设置窗口尺寸,保证元素正常渲染
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')

# 初始化驱动
service = Service('path_to_chromedriver')  # 替换为你的chromedriver实际路径
driver = webdriver.Chrome(service=service, options=options)

# 打开商品页面
driver.get('https://george.ultraliquors.co.za/olof-bergh-olof-bergh-brandy-750ml')

wait = WebDriverWait(driver, 10)  # 最长等待10秒

try:
    # 等待商品名称加载完成并获取文本
    product_name = wait.until(EC.visibility_of_element_located((By.XPATH, '//h1[@class="product-title"]'))).text
    print(f"Product Name: {product_name}")
except Exception as e:
    print(f"Could not locate product name: {e}")

try:
    # 通过父容器定位价格元素(稳定的定位方式)
    price_element = wait.until(EC.visibility_of_element_located((By.XPATH, '//div[@class="product-price"]//span[contains(@class, "price-value")]')))
    price = price_element.text
    print(f"Price: {price}")
except Exception as e:
    print(f"Could not locate price: {e}")

# 关闭驱动
driver.quit()

额外建议

  • 检查iframe:如果价格元素嵌套在iframe内,需要先调用driver.switch_to.frame()切换到对应iframe再查找元素。
  • 控制请求频率:添加适当的延迟,避免触发网站反爬机制。
  • 直接请求API:通过Chrome开发者工具的Network标签,检查价格数据是否由AJAX接口返回,直接请求接口会比模拟浏览器更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:52:20