使用Selenium点击网站「显示更多」按钮后,页面新增内容未加载如何排查解决?
「显示更多」点击无响应的原因与修复方案
当前代码的核心问题
- 定位逻辑偏差:写死DOM层级的xpath鲁棒性极差,且代码实际定位的是按钮内部的
<span>文本节点,网站的前端点击事件统一绑定在<button>根节点上,点击内部节点会被前端的事件拦截逻辑拦截,根本不会触发展开新商品的请求 - 触发反爬拦截:使用无配置的裸Selenium驱动,会被网站的前端检测脚本直接识别为自动化爬虫,拦截后续的商品加载接口请求——这也是你之前点击其他元素会出现「访问被拒绝」的根源,哪怕成功触发点击事件,接口也不会返回商品数据
- 交互状态不满足:代码直接滚动到页面最底部的
pageFoot元素,但「显示更多」按钮位于商品列表区域的中下部,没有滚动到按钮的可视交互范围时,触发的click事件会被浏览器判定为无效交互,不会执行后续逻辑 - 使用废弃API:代码中调用的
find_element_by_xpath是Selenium 3.x版本就已弃用的旧接口,在新版驱动环境下会出现定位偏差
可正常运行的实现逻辑
- 给Chrome驱动加上反爬配置,去掉自动化特征标识,绕过前端的bot检测
- 用稳定的文本定位代替写死层级的xpath,直接匹配德文版「显示更多」(按钮文本为
Mehr anzeigen)对应的按钮元素 - 用显式等待代替固定时长的
sleep,等按钮滚动到可视区域、满足可点击状态后再执行交互 - 每次点击后通过商品列表节点数量的变化,判断新内容是否加载完成,再进入下一次循环,直到按钮完全消失(即全量商品加载完成)
调整后的可参考代码
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
相关产品推荐
相关产品推荐

