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

Selenium/Pandas爬取Home Depot数据无法写入DataFrame问题求助

排查Home Depot爬虫存列表/DataFrame失败的常见原因

  • 列表操作逻辑错误
    检查列表是否在循环外部初始化——如果把products = []写在循环内部,每次循环都会重置列表,最终必然为空。另外确认循环内是用products.append(item)而非直接赋值(比如products = item),后者会直接覆盖列表而非追加元素。

  • 元素定位的时机/范围问题
    打印正常不代表存数据时元素状态一致:

    • 可能打印时你手动等待了页面加载,但代码里没加显式等待,存数据时元素还未渲染完成,导致获取空值或触发隐性异常(比如NoSuchElementException)。建议用显式等待确保元素加载:
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      # 等待商品列表加载完成
      items = WebDriverWait(driver, 10).until(
          EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".product-tile"))
      )
      
    • 检查循环内的元素定位是否基于当前遍历的item:如果每次都用driver.find_element而非item.find_element,可能会重复获取第一个元素,导致列表内容异常或为空。
  • 未捕获的隐性异常
    爬虫过程中可能出现元素找不到、超时等异常,但代码没加try-except块,导致程序中途退出,列表未填充完成。在循环内加入异常捕获,打印具体错误:

    for item in items:
        try:
            name = item.find_element(By.CSS_SELECTOR, ".product-title").text
            price = item.find_element(By.CSS_SELECTOR, ".price").text
            products.append({"name": name, "price": price})
        except Exception as e:
            print(f"处理元素失败: {str(e)}")
    
  • DataFrame构造不匹配
    确认列表结构和DataFrame列对应:

    • 如果列表是字典列表(比如[{"name": "xxx", "price": "yyy"}, ...]),直接pd.DataFrame(products)即可;如果是多个独立列表(比如names = [], prices = []),要写成pd.DataFrame({"name": names, "price": prices})。
    • 先打印len(products)确认列表长度,如果列表为空,构造的DataFrame自然也为空。
  • 动态加载内容未处理
    Home Depot的商品列表可能需要滚动加载更多内容,如果打印时你手动滚动了页面,但代码里没处理,只会抓取页面初始加载的少量元素。可以加入滚动逻辑:

    # 滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待加载完成
    time.sleep(2) # 或用显式等待替代固定休眠
    

内容的提问来源于stack exchange,提问作者ryan houghton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:58:18