You need to enable JavaScript to run this app. 使用Selenium点击网站「显示更多」按钮后,页面新增内容未加载如何排查解决?
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium点击网站「显示更多」按钮后,页面新增内容未加载如何排查解决?

「显示更多」点击无响应的原因与修复方案

当前代码的核心问题

  • 定位逻辑偏差:写死DOM层级的xpath鲁棒性极差,且代码实际定位的是按钮内部的<span>文本节点,网站的前端点击事件统一绑定在<button>根节点上,点击内部节点会被前端的事件拦截逻辑拦截,根本不会触发展开新商品的请求
  • 触发反爬拦截:使用无配置的裸Selenium驱动,会被网站的前端检测脚本直接识别为自动化爬虫,拦截后续的商品加载接口请求——这也是你之前点击其他元素会出现「访问被拒绝」的根源,哪怕成功触发点击事件,接口也不会返回商品数据
  • 交互状态不满足:代码直接滚动到页面最底部的pageFoot元素,但「显示更多」按钮位于商品列表区域的中下部,没有滚动到按钮的可视交互范围时,触发的click事件会被浏览器判定为无效交互,不会执行后续逻辑
  • 使用废弃API:代码中调用的find_element_by_xpath是Selenium 3.x版本就已弃用的旧接口,在新版驱动环境下会出现定位偏差

可正常运行的实现逻辑

  1. 给Chrome驱动加上反爬配置,去掉自动化特征标识,绕过前端的bot检测
  2. 用稳定的文本定位代替写死层级的xpath,直接匹配德文版「显示更多」(按钮文本为Mehr anzeigen)对应的按钮元素
  3. 用显式等待代替固定时长的sleep,等按钮滚动到可视区域、满足可点击状态后再执行交互
  4. 每次点击后通过商品列表节点数量的变化,判断新内容是否加载完成,再进入下一次循环,直到按钮完全消失(即全量商品加载完成)

调整后的可参考代码

from selenium import webdriver
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
from scrapy.selector import Selector
import time

url = 'https://www.galaxus.ch/de/s2/sector/haushalt-2'
# 配置反爬参数,绕过自动化检测
chrome_options = Options()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_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")

driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
wait = WebDriverWait(driver, 15)

# 循环加载直到没有「显示更多」按钮
while True:
    try:
        # 等待按钮处于可点击状态
        load_more_btn = wait.until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Mehr anzeigen')]"))
        )
        # 自动滚动到按钮可视位置
        load_more_btn.location_once_scrolled_into_view
        # 记录当前已加载的商品数量,作为加载完成的判断基准
        old_product_count = len(driver.find_elements(By.XPATH, "//a[contains(@href, '/de/product/')]"))
        # 触发点击
        load_more_btn.click()
        # 等待新商品加载完成:直到商品数量超过之前的记录值再进入下一轮
        wait.until(lambda d: len(d.find_elements(By.XPATH, "//a[contains(@href, '/de/product/')]")) > old_product_count)
        time.sleep(1)
    except:
        # 找不到加载按钮时,说明全量商品已加载完成
        break

# 解析全量商品内容
sel = Selector(text=driver.page_source)
# 后续接入你的商品字段解析逻辑
driver.close()

实操注意事项

  • 不要依赖固定时长的sleep判断加载状态,一定要用商品节点数量变化的逻辑做校验,避免出现点了按钮但内容未加载就进入下一轮的无效循环
  • 如果仍出现访问被拦截的提示,可以适当延长每次点击后的等待间隔,模拟普通用户的浏览节奏,避免高频点击触发反爬策略的限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 13:24:00