使用rvest爬取NRL赛事排名表返回NULL结果求排查
NRL官网2023赛季第27轮排名表爬取问题排查
问题根源分析
你的代码返回NULL,大概率是以下两个原因:
- 页面元素结构已变更:原代码依赖的
div.vue-ladder节点或q-data属性已不存在,静态HTML里找不到目标数据。 - 数据动态加载:NRL官网用前端框架动态渲染排名数据,
read_html只能获取初始静态页面,无法捕获动态加载的内容。
解决方法
方法1:重新定位页面元素(仅适用于数据仍在静态HTML的情况)
- 打开目标页面,按F12调出开发者工具,切换到「Elements」面板。
- 用选择器工具定位排名表对应的DOM节点,确认新的类名/属性名。
- 更新代码中的
html_nodes和html_attr参数,示例如下(需替换为实际找到的节点信息):
library(rvest) library(jsonlite) url <- "https://www.nrl.com/ladder/?competition=111&round=27&season=2023" page <- read_html(url) contentnodes <- page %>% html_nodes("div.ladder-container") %>% html_attr("data-ladder") %>% jsonlite::fromJSON()
方法2:直接调用API接口(推荐,更稳定)
NRL官网的排名数据通常通过后端API接口加载,抓包获取接口后直接请求更可靠:
- 打开开发者工具的「Network」面板,刷新页面,筛选「XHR/Fetch」类型请求。
- 搜索包含「ladder」「rank」等关键词的请求,找到返回排名数据的接口(地址通常类似
https://api.nrl.com/v2/ladder,参数包含competition、round、season)。 - 用
httr直接请求接口:
library(httr) library(jsonlite) # 替换为实际抓包得到的API地址 api_url <- "https://api.nrl.com/v2/ladder?competitionId=111&round=27&season=2023" # 模拟浏览器请求头避免反爬 headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) response <- GET(api_url, headers) ladder_data <- fromJSON(content(response, "text"))
方法3:处理反爬拦截
如果静态页面请求被拦截,需在请求中添加浏览器UA:
library(rvest) library(jsonlite) url <- "https://www.nrl.com/ladder/?competition=111&round=27&season=2023" page <- read_html(GET(url, add_headers("User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"))) # 重新定位元素后提取 contentnodes <- page %>% html_nodes("更新后的选择器") %>% html_attr("更新后的属性") %>% fromJSON()
内容的提问来源于stack exchange,提问作者gimmethedata123
相关产品推荐
相关产品推荐

