如何用R抓取网页表格?Sportico高薪运动员表格抓取失败求助
解决Sportico全球最高收入运动员榜单抓取问题
问题根源
这个页面的表格是JavaScript动态渲染生成的,并非直接嵌入在静态HTML结构中。rvest::html_table()只能识别静态HTML里的表格节点,自然无法抓取到动态加载的内容。
两种可行解决方案
方案1:用RSelenium模拟浏览器加载(直观易操作)
RSelenium可以模拟真实浏览器打开页面,等待JS完成渲染后再获取完整页面源码:
- 安装依赖包:
install.packages(c("RSelenium", "rvest", "dplyr"))
- 编写抓取代码:
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脚本中,可直接提取解析:
- 安装依赖包:
install.packages(c("V8", "rvest"))
- 编写抓取代码:
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
相关产品推荐
相关产品推荐

