使用R爬取QS2021世界大学排名遇JSON错误,求数据转数据框方法
QS 2021世界大学排名爬取报错解决及数据提取方案
错误原因
你使用的JSON数据链接已失效,QS官网会定期更新数据文件的存储路径与参数,导致原请求返回的不是有效JSON内容,因此jsonlite::fromJSON()抛出Argument 'txt' must be a JSON string, URL or file错误。
两种可行解决方法
方法一:获取最新JSON数据源链接
- 打开QS 2021排名页面,按F12打开浏览器开发者工具。
- 切换至「Network」标签页,刷新页面,在筛选栏输入
json或rank定位返回JSON格式数据的请求。 - 复制该请求的完整URL,替换到代码中执行:
library(httr) library(jsonlite) # 替换为你找到的有效JSON数据源URL response <- GET("新的JSON数据源URL") # 先验证请求是否成功 if (response$status_code == 200) { # 以文本形式获取响应内容 data_json <- content(response, as = "text", encoding = "UTF-8") data <- jsonlite::fromJSON(data_json) df <- as.data.frame(data) } else { stop("请求失败,状态码:", response$status_code) }
方法二:直接爬取页面表格(稳定性更高)
如果找不到有效API链接,可使用rvest直接解析页面排名表格。若表格为动态加载(需滚动显示更多内容),则结合RSelenium模拟浏览器操作:
静态表格爬取(适用于已加载完整表格的场景)
library(rvest) library(dplyr) url <- "https://www.topuniversities.com/university-rankings/world-university-rankings/2021" # 读取页面并提取表格 page <- read_html(url) df <- page %>% html_element("table") %>% html_table(fill = TRUE) # 清理数据(按需调整列选择与过滤规则) df <- df %>% filter(!is.na(Rank)) %>% select(Rank, University, Location, `Overall Score`)
动态表格爬取(处理滚动加载内容)
library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("https://www.topuniversities.com/university-rankings/world-university-rankings/2021") # 模拟滚动加载所有内容 for (i in 1:10) { remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(2) # 等待页面加载 } # 提取页面源码并解析表格 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) df <- page %>% html_element("table") %>% html_table(fill = TRUE) # 关闭浏览器与驱动 remDr$close() driver$server$stop() # 数据清理 df <- df %>% filter(!is.na(Rank)) %>% select(Rank, University, Location, `Overall Score`)
内容的提问来源于stack exchange,提问作者Teerut Suksakulwat
相关产品推荐
相关产品推荐

