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

使用R语言抓取带下拉选择器的动态NBA数据页面问题

解决Covers NBA球员Prop数据爬取的两个问题

问题背景

  • 目标页面:https://www.covers.com/sport/basketball/nba/matchup/290850/props
  • 页面动态特性:
    1. URL中的数字ID(如示例中的290850)随赛事变化,后缀固定为/props
    2. 页面存在名为“props”的下拉选择器,切换后内容会动态更新
  • 遇到的技术问题:
    A. 无法用rvest提取每行核心信息(姓名、Prop值、预测值、最佳赔率、分析)并整理为表格
    B. 不知道如何在R中操作“props”下拉选择器,切换后下载对应数据
  • 已尝试的代码:
covers_page <- "https://www.covers.com/sport/basketball/nba/matchup/290850/props"
tmp <- read_html(covers_page)
nodes_1 <- tmp %>% html_elements("div") %>% xml_find_all("//div[contains(@class,'player-props-table-container')]")

问题A:提取动态渲染的表格数据

页面内容由JavaScript动态生成,read_html只能获取初始静态HTML,无法拿到渲染后的表格内容。必须用浏览器模拟工具先加载完整页面,再提取数据。

方案1:用playwright实现(推荐,轻量高效)

  1. 先安装依赖:
install.packages("playwright")
playwright::install_browsers()
  1. 爬取表格数据的代码:
library(playwright)
library(rvest)
library(dplyr)

# 启动Firefox浏览器
pw <- playwright$firefox()
page <- pw$new_page()

# 访问目标页面,等待网络空闲确保内容加载完成
page$goto("https://www.covers.com/sport/basketball/nba/matchup/290850/props", wait_until = "networkidle")

# 提取表格容器的HTML并解析
table_html <- page$locator(".player-props-table-container")$inner_html() %>% read_html()

# 遍历表格行,提取各字段数据
rows <- table_html %>% html_elements(".player-props-table-row")
player_data <- lapply(rows, function(row) {
  tibble(
    姓名 = row %>% html_element(".player-name") %>% html_text2(),
    Prop值 = row %>% html_element(".prop-value") %>% html_text2(),
    预测值 = row %>% html_element(".prediction-value") %>% html_text2(),
    最佳赔率 = row %>% html_element(".best-odds") %>% html_text2(),
    分析 = row %>% html_element(".analysis-text") %>% html_text2()
  )
}) %>% bind_rows()

# 关闭浏览器
pw$close()

# 查看结果
print(player_data)

方案2:用RSelenium实现

  1. 安装依赖:
install.packages("RSelenium")
  1. 代码示例:
library(RSelenium)
library(rvest)
library(dplyr)

# 启动浏览器驱动
driver <- rsDriver(browser = "firefox")
remDr <- driver[["client"]]

# 访问页面并等待加载
remDr$navigate("https://www.covers.com/sport/basketball/nba/matchup/290850/props")
Sys.sleep(3)

# 获取渲染后的页面HTML
page_source <- remDr$getPageSource()[[1]] %>% read_html()

# 解析数据(逻辑同playwright版本)
rows <- page_source %>% html_elements(".player-props-table-row")
player_data <- lapply(rows, function(row) {
  tibble(
    姓名 = row %>% html_element(".player-name") %>% html_text2(),
    Prop值 = row %>% html_element(".prop-value") %>% html_text2(),
    预测值 = row %>% html_element(".prediction-value") %>% html_text2(),
    最佳赔率 = row %>% html_element(".best-odds") %>% html_text2(),
    分析 = row %>% html_element(".analysis-text") %>% html_text2()
  )
}) %>% bind_rows()

# 关闭驱动
remDr$close()
driver$server$stop()

问题B:切换“props”下拉选择器并获取对应数据

同样需要用浏览器模拟工具操作下拉控件,以下用playwright为例:

library(playwright)
library(rvest)
library(dplyr)

pw <- playwright$firefox()
page <- pw$new_page()
page$goto("https://www.covers.com/sport/basketball/nba/matchup/290850/props", wait_until = "networkidle")

# 获取下拉选择器的所有选项文本和对应值
props_options <- page$locator("select[name='props'] option")$all_text_contents()
props_values <- page$locator("select[name='props'] option")$all_attribute_values("value")

# 遍历所有选项,切换后抓取数据
all_props_data <- list()
for (i in seq_along(props_options)) {
  # 切换到当前选项
  page$select_option("select[name='props']", value = props_values[i])
  Sys.sleep(2) # 等待页面内容更新
  
  # 提取当前选项的表格数据
  table_html <- page$locator(".player-props-table-container")$inner_html() %>% read_html()
  rows <- table_html %>% html_elements(".player-props-table-row")
  
  current_data <- lapply(rows, function(row) {
    tibble(
      Prop类型 = props_options[i],
      姓名 = row %>% html_element(".player-name") %>% html_text2(),
      Prop值 = row %>% html_element(".prop-value") %>% html_text2(),
      预测值 = row %>% html_element(".prediction-value") %>% html_text2(),
      最佳赔率 = row %>% html_element(".best-odds") %>% html_text2(),
      分析 = row %>% html_element(".analysis-text") %>% html_text2()
    )
  }) %>% bind_rows()
  
  all_props_data[[i]] <- current_data
}

# 合并所有数据并保存
all_props_data <- bind_rows(all_props_data)
write.csv(all_props_data, "nba_player_props_all.csv", row.names = FALSE)

# 关闭浏览器
pw$close()

关键说明

  • 动态页面必须依赖浏览器模拟工具,仅用rvest无法处理JS渲染内容
  • 切换下拉选项后需等待页面更新,用Sys.sleep或playwright的内置等待方法更可靠
  • 适配不同赛事时,只需替换URL中的数字ID(如290850)即可

内容的提问来源于stack exchange,提问作者dfaberjob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:28