Selenium爬取动态网站数据报错求助:提取参与者信息失败
修复方案与代码实现
问题根源
- 页面未完全加载就执行元素定位,触发
NoSuchElementException - 元素定位逻辑错误:用
find_element只能获取单个元素,且模块数的选择器过于宽泛,无法精准匹配目标内容 - 缺少分页爬取的循环逻辑
修复后的完整代码
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
相关产品推荐
相关产品推荐

