使用Beautiful Soup、Selenium、Pandas爬取div/span类产品价格失败
解决Flight Club商品价格爬取空数据问题
看起来你的代码在面对Flight Club这种动态渲染的页面时,主要遇到了两个核心问题:元素选择器不匹配页面实际结构和页面未完全加载就急于抓取内容。咱们一步步来修复:
问题根源分析
- 原选择器无效:你代码里定位的
div.product-essential row-fluid product-type-configurable类,在Flight Club的目标页面中根本不存在,自然找不到任何元素; - 页面动态渲染延迟:Flight Club的商品信息是通过JS动态加载的,直接调用
driver.page_source大概率还没拿到完整的渲染内容,导致BeautifulSoup解析不到有效数据。
修正后的可运行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import pandas as pd # 初始化浏览器(新版Selenium无需硬编码驱动路径,会自动匹配) driver = webdriver.Chrome() products = [] prices = [] target_url = 'https://www.flightclub.com/supreme-x-dunk-sb-low-varsity-red-varsity-red-white-black-152127?size=9.5' driver.get(target_url) try: # 等待价格元素加载完成,最多等待10秒,避免抓取未渲染的空内容 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'price')) ) # 获取完全渲染后的页面源码 content = driver.page_source soup = BeautifulSoup(content, "lxml") # 匹配页面实际的商品名称和价格元素 product_name = soup.find('h1', class_='product-name').get_text(strip=True) product_price = soup.find('span', class_='price').get_text(strip=True) products.append(product_name) prices.append(product_price) # 生成DataFrame并打印结果 df = pd.DataFrame({'Product Name': products, 'Price': prices}) print(df) finally: driver.quit() # 确保无论是否出错,浏览器都会关闭,避免资源泄漏
关键改动说明
- 添加等待机制:用
WebDriverWait强制等待核心元素加载完成,彻底解决动态页面的渲染延迟问题; - 修正元素选择器:
- 商品名称对应页面里的
<h1 class="product-name">标签; - 价格直接定位全局的
<span class="price">标签,不需要嵌套在无效的父级div中;
- 商品名称对应页面里的
- 优化浏览器管理:去掉硬编码的ChromeDriver路径,新版Selenium会自动适配驱动;添加
finally块确保浏览器资源正常释放;
每日价格监控进阶提示
如果要实现长期的每日价格波动跟踪,建议:
- 把代码封装成可复用函数,方便定时任务调用;
- 加入异常捕获逻辑,比如元素找不到时自动重试;
- 启用Chrome的无头模式运行,节省系统资源:
options = webdriver.ChromeOptions() options.add_argument('--headless=new') driver = webdriver.Chrome(options=options)
内容的提问来源于stack exchange,提问作者donlento7
相关产品推荐
相关产品推荐

