0

0

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

霞舞

霞舞

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

|

844人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

下载
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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

778

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

686

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

769

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

740

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1445

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

571

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

581

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

752

2023.08.11

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

2

2026.01.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

AngularJS教程
AngularJS教程

共24课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号