讲师中心 微信公众号
AI工具推荐 视频效率加速

如何使用 Selenium 遍历表格行并逐个访问球员详情页抓取数据

陌晨酱_6695

陌晨酱_6695

发布时间:2026-01-27 12:12:02

|

864人浏览过

|

来源于php中文网

原创

如何使用 Selenium 遍历表格行并逐个访问球员详情页抓取数据

本文详解如何用 selenium 稳健地遍历 realgm 篮球球员列表页的每一行,提取链接后逐一访问详情页,精准抓取姓名、头像、出生信息和身高体重等结构化数据,并规避隐式等待、dom 重渲染和定位失效等常见陷阱。

在 Web 自动化抓取中,直接在循环内对页面执行 click() → back() 操作极易导致脚本不稳定:每次返回后 DOM 结构可能重建,原 row 元素变为“stale”,find_element 报 StaleElementReferenceException;同时 implicitly_wait 无法保证元素可交互(仅控制查找超时),且不适用于等待页面加载完成或元素可见——这正是你代码中 Chrome “持续加载”却无响应的根本原因。

✅ 正确做法是分两阶段处理

  1. 一次性采集所有目标链接(避免重复查找与状态干扰);
  2. 逐个 driver.get(href) 访问详情页(干净上下文,稳定可控)。

以下是优化后的完整实现(已通过 RealGM 页面实测):

Pptx To Html
Pptx To Html

使用 MinerU 将 PowerPoint (.pptx) 演示文稿转换为 HTML,保留幻灯片内容与结构,生成可直接在网页使用的 HTML格式。

下载
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.maximize_window()
wait = WebDriverWait(driver, 10)  # 显式等待:最长10秒,更精准可靠

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

    # ✅ 精准定位主表格(避免匹配到页眉页脚其他 table)
    table = wait.until(EC.visibility_of_element_located((By.XPATH, "//table[contains(@id, 'table')]")))

    # ✅ 定位 tbody 下的有效数据行(排除表头、分页行等)
    rows = table.find_elements(By.XPATH, "./tbody/tr")

    # ? 第一阶段:安全采集所有球员详情页链接
    hrefs = []
    for i, row in enumerate(rows):
        try:
            # 使用语义化 XPath:找 href 包含 '/player' 的 a 标签(比依赖易变的 class 名更鲁棒)
            link = row.find_element(By.XPATH, ".//a[contains(@href, '/player')]")
            href = link.get_attribute("href")
            if href and "realgm.com" in href:  # 基础校验,防空或无效链接
                hrefs.append(href)
        except Exception as e:
            print(f"⚠️ 跳过第 {i+1} 行(无有效球员链接): {e}")
            continue

    print(f"✅ 成功采集 {len(hrefs)} 个球员链接")

    # ? 第二阶段:逐个访问,提取结构化数据
    players_data = []
    for idx, href in enumerate(hrefs, 1):
        print(f"\n? 正在处理第 {idx}/{len(hrefs)} 个球员: {href}")
        driver.get(href)

        # 等待球员资料卡片完全加载(关键!)
        profile_box = wait.until(
            EC.visibility_of_element_located((
                By.XPATH, 
                "//div[contains(@class, 'profile-box')]//div[contains(@class, 'half-column-left')]"
            ))
        )

        try:
            name = profile_box.find_element(By.TAG_NAME, "h2").text.strip()

            # 获取头像 URL(注意:部分球员可能无图,需容错)
            img_elem = profile_box.find_element(By.TAG_NAME, "img")
            img_src = img_elem.get_attribute("src") or "N/A"

            # 提取 Born 和 Height/Weight 等字段(利用 strong 标签定位 + parent::p 获取整行文本)
            born_text = profile_box.find_element(
                By.XPATH, ".//strong[text()='Born:']/parent::p"
            ).text.strip()

            anthropo_text = profile_box.find_element(
                By.XPATH, ".//strong[text()='Height:']/parent::p"
            ).text.strip()

            players_data.append({
                "name": name,
                "img_url": img_src,
                "born": born_text,
                "anthropometry": anthropo_text,
            })
            print(f"✅ 已保存: {name}")

        except Exception as e:
            print(f"❌ 提取第 {idx} 个球员数据失败: {e}")
            players_data.append({
                "name": "UNKNOWN",
                "img_url": "N/A",
                "born": "N/A",
                "anthropometry": "N/A",
            })

    print(f"\n? 全部完成!共成功获取 {len(players_data)} 名球员数据。")
    # 示例:导出为 CSV(需 pandas)
    # import pandas as pd
    # pd.DataFrame(players_data).to_csv("acg_players_2024.csv", index=False)

finally:
    driver.quit()

? 关键优化点总结

  • 显式等待替代隐式等待:WebDriverWait + expected_conditions 确保元素真正可见、可交互,大幅提高稳定性;
  • XPath 语义化定位:用 contains(@href, '/player') 替代易碎的 CLASS_NAME,抗页面样式变更;
  • 链接预采集机制:避免 click() → back() 导致的 stale 元素问题,也减少重复 DOM 查询开销;
  • 全流程异常捕获:单条数据失败不影响整体流程,日志清晰便于调试;
  • 轻量级结构化输出:字典列表格式,可直接转 pandas.DataFrame 或 JSON 存储。

? 进阶建议:若追求极致效率,可结合 requests + BeautifulSoup(BS4)解析静态 HTML(RealGM 页面内容基本静态),速度提升 3–5 倍;Selenium 仅在必要时(如需 JS 渲染或登录态)启用。但本方案兼顾可读性、健壮性与教学完整性,是生产级爬虫的良好起点。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1955

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2602

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

896

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2919

2025.09.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2446

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4319

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

3087

2026.03.24

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

653

2023.11.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 206人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn