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 页面实测):

ZOER
ZOER

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不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

419

2023.08.07

json是什么
json是什么

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

535

2023.08.23

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

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

311

2023.10.13

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

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

77

2025.09.10

chrome什么意思
chrome什么意思

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

833

2023.08.11

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

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

744

2023.11.06

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

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

293

2023.11.13

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

60

2025.12.04

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

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

精品课程

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

共46课时 | 3万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 24.6万人学习

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

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