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

R语言网页爬取求助:佛罗里达坦帕赛事结果数据提取

解决动态页面的R爬虫问题

你的问题在于目标页面是动态JavaScript渲染的:read_html()只能抓取页面初始加载的静态HTML,而赛事结果数据是页面加载完成后通过JS从后端接口异步获取的,所以直接用rvest无法拿到数据。下面提供两种入门方案,优先推荐模拟浏览器的方法,更适合新手理解。

方案1:用RSelenium模拟浏览器加载页面

RSelenium可以模拟真实浏览器的行为,让页面完整渲染出数据后再抓取。

步骤1:安装依赖包

install.packages(c("RSelenium", "rvest", "dplyr"))

步骤2:爬虫代码

library(RSelenium)
library(rvest)
library(dplyr)

# 启动Chrome驱动(需确保本地安装Chrome及对应版本的chromedriver)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 导航到正确的赛事页面(注意你提供的URL是2534,之前代码里写的2573是错误的)
remDr$navigate("https://results2.xacte.com/#/e/2534/placings")

# 等待页面加载数据(网络慢的话可以延长睡眠时间)
Sys.sleep(5)

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

# 定位每个选手的行元素
runner_rows <- page %>% html_nodes(".md-list-item-inner")

# 提取姓名、完赛时间、配速并整理成DataFrame
results_df <- lapply(runner_rows, function(row) {
  name <- row %>% html_nodes(".md-subhead") %>% html_text(trim = TRUE)
  finish_time <- row %>% html_nodes(".md-body-1:nth-child(2)") %>% html_text(trim = TRUE)
  pace <- row %>% html_nodes(".md-body-1:nth-child(3)") %>% html_text(trim = TRUE)
  
  tibble(
    姓名 = ifelse(length(name) > 0, name, NA),
    完赛时间 = ifelse(length(finish_time) > 0, finish_time, NA),
    配速 = ifelse(length(pace) > 0, pace, NA)
  )
}) %>% bind_rows()

# 查看结果
head(results_df)

# 关闭浏览器和驱动
remDr$close()
driver$server$stop()

注意事项

  • 如果启动Chrome失败,需要检查chromedriver版本是否与本地Chrome版本匹配,可从Chrome官方下载对应版本的驱动。
  • 若需要提取更多字段(如排名、年龄组),可以打开Chrome开发者工具(F12),定位对应元素的选择器,添加到提取逻辑中。

方案2:直接请求后端API(更高效)

打开Chrome开发者工具的「Network」标签,刷新页面后筛选「XHR」请求,能找到返回赛事数据的API接口。比如可能的接口类似https://results2.xacte.com/api/events/2534/placings(实际地址需自行确认),用httr请求后解析JSON:

library(httr)
library(dplyr)
library(jsonlite)

# 替换为实际找到的API地址
api_url <- "https://results2.xacte.com/api/events/2534/placings"
response <- GET(api_url)
data <- fromJSON(content(response, "text"))

# 整理成DataFrame(结构需根据返回的JSON调整)
results_df <- as_tibble(data$placings)
head(results_df)

这种方法不需要模拟浏览器,速度更快,但需要你能找到正确的API接口并理解返回的JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:58:09