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

Selenium无法触发Kaggle排名页滚动,爬取数据仅20条求助

问题解决思路与修正代码

核心问题分析

  1. 滚动容器定位错误:Kaggle笔记本排行榜的内容并非在document.body中,而是嵌套在带有leaderboards__scroll-container类的div容器里,直接滚动body无法触发加载逻辑。
  2. 滚动次数不足:目标要抓取2000条数据,每页加载20条,至少需要滚动100次,原代码仅设置10次滚动完全不够。
  3. 等待逻辑粗糙:单纯依赖time.sleep无法适配网络波动,容易出现新内容未加载完成就停止滚动的情况。

修正后的完整代码

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import re
import pandas as pd
import numpy as np
import time
from datetime import date

# Notebook rankings url
url = 'https://www.kaggle.com/rankings?group=notebooks&page=1&pageSize=20'
wait_delay = 15 # 延长等待时间适配网络波动
scroll_pause_time = 3

firefox_options = webdriver.FirefoxOptions()
firefox_options.add_argument('-private')

driver = webdriver.Firefox(options=firefox_options)
driver.get(url)

try:
    # 等待排行榜滚动容器加载完成
    scroll_container = WebDriverWait(driver, wait_delay).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'leaderboards__scroll-container'))
    )
    print("排行榜容器加载完成!")
except Exception as e:
    print(e)
    print("页面加载超时!")
    driver.close()
    exit()

target_count = 2000
current_count = 0

while current_count < target_count:
    # 获取当前已加载的用户链接数量
    lista = driver.find_elements(By.XPATH, '//div[@role="button"]//div[@class="leaderboards__name"]/p/a')
    current_count = len(lista)
    print(f"当前已加载 {current_count} 条数据")
    
    if current_count >= target_count:
        break
    
    # 滚动排行榜容器到底部,触发加载
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container)
    
    # 等待新元素加载,超时则判定为页面底部
    try:
        WebDriverWait(driver, wait_delay).until(
            lambda d: len(d.find_elements(By.XPATH, '//div[@role="button"]//div[@class="leaderboards__name"]/p/a')) > current_count
        )
    except:
        print("已加载到页面底部,无法获取更多数据")
        break
    
    time.sleep(scroll_pause_time)

# 提取最终所有用户链接
lista_parseada = [link.get_attribute('href') for link in lista]
print(f"最终获取到 {len(lista_parseada)} 条用户链接")

driver.close()

关键修改点说明

  • 精准定位滚动容器:通过leaderboards__scroll-container类找到真正的内容滚动区域,使用容器内部滚动触发加载逻辑。
  • 动态循环终止条件:以获取数据量达到2000或无法加载新内容为终止条件,替代固定滚动次数的死板逻辑。
  • 智能等待机制:滚动后等待新元素出现,比单纯sleep更适配网络速度,同时处理页面到底的边界情况。
  • 进度监控:增加实时加载数量打印,方便跟踪爬取进度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:00:58