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

Selenium爬取动态网站数据报错求助:提取参与者信息失败

修复方案与代码实现

问题根源

  1. 页面未完全加载就执行元素定位,触发NoSuchElementException
  2. 元素定位逻辑错误:用find_element只能获取单个元素,且模块数的选择器过于宽泛,无法精准匹配目标内容
  3. 缺少分页爬取的循环逻辑

修复后的完整代码

from selenium import webdriver
import csv
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

# 初始化浏览器驱动(自动适配Chrome版本)
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")  # 最大化窗口避免元素被隐藏
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
wait = WebDriverWait(driver, 10)  # 设置10秒显式等待超时

url = "https://learn.microsoft.com/training/challenges?id=f66f0d57-d644-44d1-9faf-112b18a0ef92"
driver.get(url)

all_data = []

try:
    # 获取总页数
    pagination_container = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "pagination")))
    total_pages = int(pagination_container.find_element(By.CSS_SELECTOR, "button.pagination-link[aria-label*='of']").get_attribute("aria-label").split()[-1])

    for page in range(1, total_pages + 1):
        # 等待当前页的参与者列表加载完成
        wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".leaderboard-row")))
        
        # 获取当前页所有参与者行
        rows = driver.find_elements(By.CSS_SELECTOR, ".leaderboard-row")
        
        for row in rows:
            # 在每行内定位姓名和完成模块数
            name = row.find_element(By.CSS_SELECTOR, ".is-hidden-mobile.leaderboard-name").text.strip()
            modules = row.find_element(By.CSS_SELECTOR, "div:nth-child(3) span").text.strip()  # 精准定位第三列的模块数span
            all_data.append([name, modules])
        
        # 如果不是最后一页,点击下一页按钮
        if page < total_pages:
            next_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.pagination-next")))
            next_btn.click()

    # 写入CSV文件
    with open('participants.csv', 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['Participant Name', 'Modules Completed'])
        writer.writerows(all_data)
    
    print(f"成功爬取{len(all_data)}条数据,已保存到participants.csv")

finally:
    driver.quit()

关键修复点说明

  • 显式等待:用WebDriverWait等待元素加载完成,避免页面动态渲染导致的元素找不到问题
  • 精准元素定位:先定位每个参与者的行元素,再在每行内查找姓名和模块数,避免选择器宽泛导致的匹配错误;将find_element改为find_elements以批量获取元素
  • 分页逻辑:通过分页栏的aria-label属性获取总页数,循环点击下一页按钮,覆盖所有分页内容
  • 驱动优化:用webdriver-manager自动安装对应版本的ChromeDriver,避免版本不兼容;添加窗口最大化参数,防止元素因窗口过小被隐藏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:36:03