使用R的rvest包结合XPath抓取动态大学排名表格遇阻求助
解决动态表格抓取问题
问题原因
目标页面的排名表格由JavaScript动态渲染,rvest仅能抓取静态初始HTML,无法获取JS加载后的内容,这是代码失败的核心原因。
解决方案1:使用RSelenium模拟浏览器渲染
RSelenium可以模拟真实浏览器加载页面,获取完整渲染后的HTML,再用rvest解析表格。
步骤与代码
- 安装并加载所需包
install.packages(c("RSelenium", "rvest", "dplyr")) library(RSelenium) library(rvest) library(dplyr)
- 启动Chrome浏览器驱动(需确保本地已安装Chrome和对应版本的ChromeDriver)
driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]]
- 访问目标页面并等待加载完成
remDr$navigate("https://www.topuniversities.com/university-rankings/university-subject-rankings/2023/arts-humanities?&tab=indicators") # 等待表格加载,可根据网络情况调整等待时间 Sys.sleep(5)
- 获取渲染后的页面源码,解析表格
page_source <- remDr$getPageSource()[[1]] rank_table <- read_html(page_source) %>% html_element(xpath = '//table[contains(@class, "ranking-table")]') %>% html_table(header = TRUE)
- 关闭浏览器驱动
remDr$close() driver$server$stop()
解决方案2:使用rvest结合V8解析JS数据
部分动态页面会通过JS接口加载数据,可直接提取页面中的JS数据,用V8引擎解析后转为数据框。
步骤与代码
- 安装并加载所需包
install.packages(c("rvest", "V8", "jsonlite")) library(rvest) library(V8) library(jsonlite)
- 获取静态页面源码,提取包含排名数据的JS脚本
page <- read_html("https://www.topuniversities.com/university-rankings/university-subject-rankings/2023/arts-humanities?&tab=indicators") js_script <- page %>% html_elements(xpath = '//script[contains(text(), "rankingsData")]') %>% html_text()
- 清理JS脚本,提取JSON数据并解析
# 提取rankingsData对应的JSON部分 json_data <- stringr::str_extract(js_script, 'rankingsData\\s*=\\s*(\\{.*?\\});') %>% stringr::str_replace('rankingsData\\s*=\\s*', '') %>% stringr::str_remove(';$') # 用V8解析JSON ctx <- v8() ctx$eval(paste0('var data = ', json_data)) rank_data <- ctx$get("data") # 将数据转为数据框 rank_df <- as.data.frame(rank_data$data)
注意事项
- 使用RSelenium时,需确保ChromeDriver版本与本地Chrome版本匹配,否则会启动失败。
- 第二种方法依赖页面JS结构的稳定性,若网站更新JS代码,可能需要调整提取规则。
内容的提问来源于stack exchange,提问作者Sigma
相关产品推荐
相关产品推荐

