使用Selenium Python实现网页全元素加载的无限滚动问题
滚动加载所有元素的修复方案
你的代码在前期能正常运行,但后续失效的核心原因是依赖document.body.scrollHeight判断加载完成的逻辑不适用该网站——bigbasket的商品列表嵌套在独立滚动容器内,而非直接基于body滚动;同时仅等待"显示更多"按钮可点击的条件不够严谨,容易出现误判。
以下是针对性的修复方案:
1. 定位正确的滚动容器
先找到商品列表所在的滚动容器(而非整个body),通过该容器的滚动高度变化判断内容加载情况。以bigbasket为例,商品列表通常在类名包含products-container的容器内(可通过浏览器开发者工具确认):
# 定位商品列表容器 container = driver.find_element(By.XPATH, "//div[contains(@class, 'products-container')]")
2. 修改循环逻辑与等待条件
- 滚动目标改为容器内部,而非window
- 同时等待新内容加载完成(通过商品数量变化验证)
- 处理"显示更多"按钮消失的情况(无更多内容时按钮会隐藏)
修改后的完整代码:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver.get('https://www.bigbasket.com/ps/?q=rice') wait = WebDriverWait(driver, 10) # 定位商品列表容器 container = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'products-container')]"))) # 初始化商品数量 prev_item_count = len(driver.find_elements(By.XPATH, "//div[contains(@class, 'product-card')]")) while True: # 滚动容器到底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", container) try: # 等待"显示更多"按钮可点击并点击 show_more_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='show-more']/button"))) show_more_btn.click() # 等待新商品加载(等待商品数量增加) wait.until(lambda d: len(d.find_elements(By.XPATH, "//div[contains(@class, 'product-card')]")) > prev_item_count) prev_item_count = len(driver.find_elements(By.XPATH, "//div[contains(@class, 'product-card')]")) # 短暂等待容器滚动高度更新 time.sleep(1) except: # 按钮不存在或无法点击,说明已加载完所有内容 break
3. 关键优化点说明
- 滚动容器定位:避免了body滚动高度不更新的问题,精准针对商品列表区域
- 双条件验证:同时检查按钮状态和商品数量变化,确保新内容确实加载完成
- 异常捕获:处理无更多内容时按钮消失的场景,避免循环卡死
内容的提问来源于stack exchange,提问作者Salman Ansari
相关产品推荐
相关产品推荐

