Selenium无法触发Kaggle排名页滚动,爬取数据仅20条求助
问题解决思路与修正代码
核心问题分析
- 滚动容器定位错误:Kaggle笔记本排行榜的内容并非在
document.body中,而是嵌套在带有leaderboards__scroll-container类的div容器里,直接滚动body无法触发加载逻辑。 - 滚动次数不足:目标要抓取2000条数据,每页加载20条,至少需要滚动100次,原代码仅设置10次滚动完全不够。
- 等待逻辑粗糙:单纯依赖
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
相关产品推荐
相关产品推荐

