使用R语言抓取带下拉选择器的动态NBA数据页面问题
解决Covers NBA球员Prop数据爬取的两个问题
问题背景
- 目标页面:
https://www.covers.com/sport/basketball/nba/matchup/290850/props - 页面动态特性:
- URL中的数字ID(如示例中的290850)随赛事变化,后缀固定为
/props - 页面存在名为“props”的下拉选择器,切换后内容会动态更新
- URL中的数字ID(如示例中的290850)随赛事变化,后缀固定为
- 遇到的技术问题:
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实现(推荐,轻量高效)
- 先安装依赖:
install.packages("playwright") playwright::install_browsers()
- 爬取表格数据的代码:
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实现
- 安装依赖:
install.packages("RSelenium")
- 代码示例:
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
相关产品推荐
相关产品推荐

