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

如何用R抓取网页表格?Sportico高薪运动员表格抓取失败求助

解决Sportico全球最高收入运动员榜单抓取问题

问题根源

这个页面的表格是JavaScript动态渲染生成的,并非直接嵌入在静态HTML结构中。rvest::html_table()只能识别静态HTML里的表格节点,自然无法抓取到动态加载的内容。

两种可行解决方案

方案1:用RSelenium模拟浏览器加载(直观易操作)

RSelenium可以模拟真实浏览器打开页面,等待JS完成渲染后再获取完整页面源码:

  1. 安装依赖包:
install.packages(c("RSelenium", "rvest", "dplyr"))
  1. 编写抓取代码:
library(RSelenium)
library(rvest)
library(dplyr)

# 启动Chrome驱动(需确保驱动版本与本地Chrome一致)
driver <- rsDriver(browser = "chrome", chromever = "你的Chrome版本号")
remDr <- driver[["client"]]

# 跳转目标页面并等待加载
remDr$navigate("https://www.sportico.com/personalities/athletes/2022/100-highest-paid-athletes-in-the-world-2022-full-list-1234674901/")
Sys.sleep(5) # 根据网络情况调整等待时间

# 获取渲染后的页面源码并解析表格
page_source <- remDr$getPageSource()[[1]]
html <- read_html(page_source)
# 需用浏览器开发者工具确认表格的CSS选择器,示例为常见的表格class
athlete_table <- html %>% html_element("table[class*='styled-table']") %>% html_table()

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

方案2:直接抓取页面内嵌的JSON数据(高效无浏览器依赖)

很多动态网站会把数据以JSON形式内嵌在JS脚本中,可直接提取解析:

  1. 安装依赖包:
install.packages(c("V8", "rvest"))
  1. 编写抓取代码:
library(V8)
library(rvest)

# 获取静态页面源码,提取包含数据的JS脚本
html <- read_html("https://www.sportico.com/personalities/athletes/2022/100-highest-paid-athletes-in-the-world-2022-full-list-1234674901/")
script_list <- html %>% html_elements("script") %>% html_text()

# 筛选包含运动员数据的脚本(可通过关键词筛选,比如"athleteData")
target_script <- grep("athleteData", script_list, value = TRUE)

# 用V8解析JS对象为R数据结构
ctx <- v8()
ctx$eval(target_script)
athlete_data <- ctx$get("athleteData")

# 转换为数据框
athlete_df <- as.data.frame(athlete_data)

注意事项

  • 使用RSelenium时,ChromeDriver版本必须与本地Chrome浏览器版本匹配,否则驱动无法启动。
  • 直接抓取数据时,注意控制请求频率,避免触发网站反爬机制导致IP被封禁。
  • 可通过浏览器开发者工具(F12)的Elements面板确认表格选择器,或Network面板查找数据接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:47:13