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

Selenium滚动加载问题:无法获取全部产品URL

解决Selenium滚动加载页面无法获取全部产品URL的问题

针对你爬取https://www.autofurnish.com/audi-car-accessories产品URL时遇到的滚动加载问题,以下是可行的解决方案:

问题分析

你之前尝试的方法存在以下局限:

  • 直接滚动到页面底部:仅触发一次加载,无法触发网站连续的内容加载逻辑
  • 滚动到初始获取的元素:初始元素列表不会自动更新,无法加载后续新增的产品
  • 依赖scrollHeight判断:部分网站加载内容后不会立即更新scrollHeight,导致循环提前终止

解决方案:滚动到最后一个产品+显式等待新元素

改用滚动到当前最后一个可见产品,等待新元素加载,直到无新增产品的逻辑,同时用显式等待替代固定sleep,提升稳定性:

1. 导入必要模块

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import random
import time

2. 封装滚动加载函数

def scroll_to_load_all_products(driver):
    last_product_count = 0
    while True:
        # 获取当前所有产品链接元素
        current_products = driver.find_elements(By.XPATH, "//h2[@class='product-title']//a")
        current_count = len(current_products)
        
        # 无新增产品则退出循环
        if current_count == last_product_count:
            break
        
        last_product_count = current_count
        # 平滑滚动到最后一个产品位置,触发加载
        driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'end'});", current_products[-1])
        
        # 等待新产品加载,超时则认为无更多内容
        try:
            WebDriverWait(driver, 5).until(
                EC.presence_of_element_located((By.XPATH, f"(//h2[@class='product-title']//a)[{current_count + 1}]"))
            )
            # 随机等待,避免触发反爬
            time.sleep(random.uniform(0.5, 1.5))
        except:
            break

3. 优化核心爬取代码

把滚动加载逻辑整合到你的爬取流程中,替换固定sleep为显式等待:

prod_details = []
for model in models:
    # 点击品牌选择框
    driver.find_element(By.XPATH,"//span[@aria-labelledby='select2-brand-container']").click()
    
    # 等待搜索框可见并输入型号
    search_box = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, "//input[@class='select2-search__field']"))
    )
    search_box.send_keys(model)
    search_box.send_keys(Keys.ENTER)
    
    # 等待按钮可点击并点击
    sbv_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//div[@class='btnred sbv-link sbv-inactive']"))
    )
    sbv_btn.click()
    
    # 滚动加载所有产品
    scroll_to_load_all_products(driver)
    
    # 获取所有产品URL并去重
    prod = driver.find_elements(By.XPATH,"//h2[@class='product-title']//a")
    for item in prod:
        href = item.get_attribute("href")
        if href and href not in prod_details:
            prod_details.append(href)
    
    # 返回首页并等待加载完成
    driver.get('https://www.autofurnish.com/')
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, "//span[@aria-labelledby='select2-brand-container']"))
    )

额外注意事项

  • 显式等待比固定sleep更可靠,能避免因网络延迟导致的元素未加载问题
  • 添加随机等待时间,降低触发网站反爬机制的风险
  • 去重逻辑可避免重复抓取同一产品URL
  • 如果滚动仍有问题,可尝试用Keys.PAGE_DOWN模拟键盘翻页,多次触发加载:
    for _ in range(20):
        driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
        time.sleep(1)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:45:35