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

Python爬虫中如何循环点击加载更多按钮并解决点击报错问题

问题根因
  • 仅在页面初始加载时获取了一次加载更多按钮元素,每次点击触发页面DOM更新后,旧的元素引用会失效,触发StaleElementReferenceException
  • 循环终止逻辑缺陷:仅判断按钮是否展示,没有校验按钮可交互状态。所有商品加载完成后按钮不会消失,但已经处于不可点击状态,直接调用原生click()方法就会触发Button is not clickable at point报错
  • 点击逻辑不一致:首次点击用JS执行,循环内用Selenium原生点击,容易因为元素不在视口、被浮层遮挡触发点击失败
  • 索引计算错误:j = len(prodd)+1会导致每次采集跳过1个商品,出现链接漏抓
  • 异常捕获不全:没有捕获元素不可点击、点击被拦截的相关异常,遇到对应报错会直接终止程序,无法正常退出循环
修正后代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import (
    StaleElementReferenceException,
    ElementClickInterceptedException,
    ElementNotInteractableException
)
import time

url = 'https://mamaearth.in/shop'
# Selenium 4.6+版本内置Selenium Manager,无需手动指定chromedriver路径
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)

j = 0
while True:
    try:
        # 每次循环重新定位按钮,避免DOM更新导致元素引用过期
        load_more_btn = driver.find_element(
            By.XPATH,
            '//button[@class="Button__MinimalButton-sc-wiqi81-0 Button__Styled-sc-wiqi81-1 cLpIaN"]'
        )
        # 滚动到按钮位置,避免元素不在可视区域
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", load_more_btn)
        time.sleep(1)
        # 用JS触发点击,规避元素遮挡、样式拦截导致的原生点击失败
        driver.execute_script("arguments[0].click();", load_more_btn)
        time.sleep(5)

        # 提取当前加载完成的所有商品
        products = driver.find_elements(By.CLASS_NAME, "uniquewhite")
        # 仅提取上次采集后新增的商品链接
        new_products = products[j:]
        for product in new_products:
            product_link = product.find_element(By.TAG_NAME, 'a').get_attribute('href')
            print(product_link)
        # 更新索引,修复原逻辑+1导致的漏抓问题
        j = len(products)
        time.sleep(2)

    except (StaleElementReferenceException, ElementClickInterceptedException, ElementNotInteractableException):
        # 触发上述任意异常说明按钮已不可点击,所有商品加载完成,退出循环
        break

# 补抓最后一页加载完成后未采集的商品链接,避免漏数据
products = driver.find_elements(By.CLASS_NAME, "uniquewhite")
new_products = products[j:]
for product in new_products:
    product_link = product.find_element(By.TAG_NAME, 'a').get_attribute('href')
    print(product_link)

driver.quit()
关键调整说明
  • 适配新版Selenium API:替换所有已废弃的find_element_by_*旧写法,改用官方推荐的By类定位方式
  • 每次循环重新定位加载更多按钮,从根源解决DOM刷新导致的元素引用失效问题
  • 统一点击逻辑:点击前先滚动按钮到视口中间,再用JS触发点击,避免浮层遮挡、元素偏移导致的点击报错
  • 完善异常捕获逻辑:覆盖元素过期、点击被拦截、元素不可交互三类场景,触发异常即判定加载完成,自动退出循环,不会出现死循环
  • 修复索引计算错误,移除多余的+1偏移,避免商品链接漏抓
  • 循环退出后增加一次补采集逻辑,覆盖最后一页加载完成后未进入采集分支的场景,保证数据完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:36:21