Rvest 网络爬虫实战:高效抓取日本职业棒球联盟(NPB)官网数据

2026-02-01 00:00:00 作者:霞舞

本文详解如何使用 r 语言的 rvest 包稳定抓取 npb.jp 网站上的棒球统计表格,重点解决 ssl 证书错误、动态结构识别与 css 选择器失效等常见问题,并提供可复用的健壮代码方案。

在使用 rvest 抓取日本职业棒球联盟(NPB)官网(如 https://www./link/b4a52d5e8d7a56355abf7597fe5b2bbd)时,初学者常遇到“无法定位表格”的问题——这并非因为网页结构复杂,而多源于三个关键因素:HTTPS 证书验证失败、HTML 实际结构与开发者工具显示不一致、以及过度嵌套的 CSS 选择器导致节点匹配失败

原始代码中使用的 CSS 选择器 #stdivmaintbl > table > tbody > tr > td > div:nth-child(1) 过于具体且依赖 DOM 渲染路径,而 NPB 官网实际采用的是语义化类名(如 .stdtblmain)包裹表格,且页面中存在多个同类型表格(例如投手/打者统计),直接硬编码层级极易断裂。

✅ 推荐做法是:优先使用语义清晰的 class 名称定位,避免深度层级依赖。实测表明,.stdtblmain 是该页面所有主统计表的统一容器类,配合 html_table() 可自动解析其内部

元素:
library(rvest)
library(magrittr)

# 方案一:绕过 SSL 证书问题(推荐用于调试)
# 将网页另存为本地 HTML 文件(右键 → “另存为” → 纯文本 HTML)
url <- "baseball.html"  # 替换为你的本地路径
tables <- url %>% 
  read_html() %>% 
  html_nodes(".stdtblmain") %>% 
  html_table(header = TRUE, fill = TRUE)

# 获取第一个主表(通常为打者综合统计)
df_batters <- tables[[1]]
head(df_batters[, 1:10])  # 查看前10列预览

⚠️ 注意事项:

  • 证书错误处理:若直接读取 URL 报错 SSL certificate problem(常见于 macOS 或旧版 libcurl),请先用浏览器保存网页源码为 baseball.html,再本地读取;或临时启用证书忽略(仅限测试环境):
    Sys.setenv("CURL_CA_BUNDLE" = "")  # 不推荐生产环境使用
  • 表格空值与合并单元格:NPB 表格大量使用 rowspan/colspan 和空
占位,html_table(fill = TRUE) 可自动填充缺失值,但需后续清洗(如删除重复标题行、清理 "***" 占位符)。
  • 多表提取:页面通常包含多个 .stdtblmain 表格(如打者、投手、守备),可用 length

    (tables) 查看数量,再按索引提取:
    df_pitchers <- tables[[2]]  # 第二个主表常为投手数据
  • ? 总结:成功抓取的核心在于「简化选择器 + 善用容错参数 + 本地化调试先行」。不要迷信浏览器开发者工具中看到的完整路径,而应观察

    的顶层容器类;始终开启 fill = TRUE 应对不规则 HTML;并将网络请求问题隔离为本地文件处理,大幅提升开发效率与稳定性。

    猜你喜欢

    联络方式:

    400 9058 355

    邮箱:8955556@qq.com

    Q Q:8955556

    微信二维码
    在线咨询 拨打电话

    电话

    400 9058 355

    微信二维码

    微信二维码