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

使用Python&Selenium爬取产品编码时触发索引越界错误求助

问题排查与解决方案

1. 页面加载与元素同步问题

直接通过索引(比如driver.find_elements()[index])定位元素时,页面往往还没完成滚动加载,实际渲染的产品元素数量会小于当前要访问的索引值,直接触发Index out of range。

  • 修复方案:
    • 每次滚动或点击「查看更多」后,添加显式等待逻辑,确保产品元素数量至少达到当前需要的阈值,或者等待新元素加载完成。示例代码:
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      # 假设产品元素的CSS选择器为.product-item
      def wait_for_target_product_count(driver, expected_count):
          WebDriverWait(driver, 10).until(
              lambda d: len(d.find_elements(By.CSS_SELECTOR, ".product-item")) >= expected_count
          )
      
    • 在scroll_and_click_view_more函数中,点击「查看更多」后必须等待内容加载完成再继续操作——可以等待按钮状态变化(比如从可点击变不可点击),或者等待产品列表长度增加。

2. 产品元素定位稳定性问题

如果prod_vitals函数依赖固定索引提取编码、名称(比如从子元素列表的固定位置取值),一旦遇到HTML结构有差异的产品(比如部分产品缺少某个子元素),就会触发索引越界。

  • 修复方案:
    • 放弃固定索引定位,改用属性或语义化选择器。比如产品编码如果有data-product-id属性,直接提取该属性值:
      def prod_vitals(product_element):
          product_code = product_element.get_attribute("data-product-id")
          product_name = product_element.find_element(By.CSS_SELECTOR, ".product-name").text
          return product_code, product_name
      
    • 给元素提取逻辑加异常捕获,遇到结构异常的产品直接跳过或记录日志,避免中断整个爬取流程:
      def prod_vitals(product_element):
          try:
              product_code = product_element.find_elements(By.TAG_NAME, "span")[0].text
              product_name = product_element.find_elements(By.TAG_NAME, "h3")[0].text
              return product_code, product_name
          except IndexError:
              print(f"产品结构异常,HTML内容:{product_element.get_attribute('outerHTML')}")
              return None, None
      

3. 滚动加载逻辑缺陷

如果滚动加载逻辑没有正确判断是否已加载完所有产品,或者重复加载部分元素,会导致产品列表长度计算偏差,当设置max_count_of_products时,实际可获取的产品数量不足。

  • 修复方案:
    • 在scroll_and_click_view_more中记录每次加载前后的产品数量,只有当数量增加时才继续操作,避免无效滚动或点击:
      import time
      
      def scroll_and_click_view_more(driver, max_count):
          previous_count = 0
          product_selector = By.CSS_SELECTOR, ".product-item"
          while len(driver.find_elements(*product_selector)) < max_count:
              current_count = len(driver.find_elements(*product_selector))
              if current_count == previous_count:
                  # 数量不再增加,说明已加载完所有产品
                  break
              previous_count = current_count
              # 滚动到页面底部
              driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
              # 尝试点击查看更多按钮
              try:
                  view_more_btn = driver.find_element(By.CSS_SELECTOR, ".view-more-btn")
                  if view_more_btn.is_displayed() and view_more_btn.is_enabled():
                      view_more_btn.click()
              except:
                  pass
              time.sleep(2)
      

4. API方式补充排查

如果API方式也出现类似问题,大概率是API返回的分页数据缺失,或者请求参数设置错误(比如分页页码计算错误)。

  • 修复方案:
    • 打印每次API请求的响应内容,检查返回的产品数量是否符合预期,是否存在某一页返回空数据但仍继续请求的情况。
    • 给API请求加异常处理,当返回数据为空或格式错误时,停止请求并记录日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:43:19