使用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
相关产品推荐
相关产品推荐

