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
相关产品推荐
相关产品推荐

