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

Selenium遍历表格行爬取RealGM球员数据遇加载及点击问题求助

问题排查与修正方案

原代码核心问题

  • 多类名定位错误:By.CLASS_NAME不支持空格分隔的多个类名,原代码里的'nowrap tablesaw-cell-persist'会导致定位失败。
  • 未过滤无效行:通过By.TAG_NAME, 'tr'获取的所有行包含表头、分页栏等非数据行,这些行里没有球员链接,会引发找不到元素的错误,导致流程卡住。
  • 元素操作逻辑错误:get_attribute('href')返回的是字符串,不能直接调用.click(),必须先定位到链接元素再执行点击。
  • 页面返回后元素失效:循环中调用driver.back()回到列表页后,之前获取的rows列表会变成「过时元素」,后续循环无法正常执行。

修正后的代码

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化浏览器
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)  # 显式等待,最长10秒

url = 'https://basketball.realgm.com/international/league/4/Spanish-ACB/stats/2024/Averages/Qualified/All/points/PG/desc/1/Regular_Season'
driver.get(url)

# 存储球员数据的列表
player_data = []

try:
    # 定位所有数据行(排除表头,只取包含球员链接的行)
    data_rows = wait.until(EC.presence_of_all_elements_located(
        (By.CSS_SELECTOR, 'tr[class^="row"]')  # 数据行的class以row开头
    ))

    for index, _ in enumerate(data_rows):
        # 重新定位当前行(避免循环中元素失效)
        current_row = wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, f'tr.row-{index}')
        ))
        
        # 定位球员链接(用CSS_SELECTOR处理多类名)
        player_link = current_row.find_element(By.CSS_SELECTOR, '.nowrap.tablesaw-cell-persist a')
        
        # 打开新标签页访问球员详情,避免返回列表页导致元素失效
        player_link.send_keys(Keys.CONTROL + Keys.ENTER)
        driver.switch_to.window(driver.window_handles[1])

        # 等待详情页加载,获取所需数据
        try:
            # 获取身高、体重、年龄
            height = wait.until(EC.presence_of_element_located(
                (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Height"]]')
            )).text.strip()
            weight = wait.until(EC.presence_of_element_located(
                (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Weight"]]')
            )).text.strip()
            age = wait.until(EC.presence_of_element_located(
                (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Age"]]')
            )).text.strip()
            # 获取球员图片URL
            player_img = wait.until(EC.presence_of_element_located(
                (By.CSS_SELECTOR, 'div.player-headshot img')
            )).get_attribute('src')

            # 存入数据列表
            player_data.append({
                'Height': height,
                'Weight': weight,
                'Age': age,
                'Image URL': player_img
            })
        except Exception as e:
            print(f"获取球员数据失败: {str(e)}")
        
        # 关闭当前详情页,切回列表页
        driver.close()
        driver.switch_to.window(driver.window_handles[0])

finally:
    driver.quit()

# 将数据转为DataFrame并保存(可选)
df = pd.DataFrame(player_data)
print(df)
df.to_csv('acb_players_data.csv', index=False)

关键改进点

  • 用CSS_SELECTOR定位多类名元素:.nowrap.tablesaw-cell-persist可以正确匹配同时拥有这两个类的元素。
  • 显式等待替代隐式等待:WebDriverWait配合expected_conditions可以更精准地等待元素加载,避免页面未加载完成就执行操作导致的加载卡住问题。
  • 新标签页打开详情页:避免返回列表页导致的元素失效问题,提升流程稳定性。
  • 过滤有效数据行:通过tr[class^="row"]只定位包含球员数据的行,跳过表头和其他无效行。

内容的提问来源于stack exchange,提问作者B. Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:46:19