使用rvest爬取NRL球员数据:CSS选择器与属性匹配问题
解决NRL球员数据爬取的页面结构变化问题
第一步:定位数据存储位置
页面结构更新后,得自己用浏览器开发者工具(Chrome/Firefox按F12)找数据位置:
- 打开目标页面,切换到Elements面板,用左上角的元素选择工具点击球员统计区域,定位包裹数据的父元素
- 检查该元素的所有属性,找包含JSON格式文本的属性(比如
data-*类属性,或类似原q-data的自定义属性) - 如果Elements面板里找不到直接的JSON数据,切换到Network面板,刷新页面后筛选
XHR/Fetch请求,找返回球员数据的API接口(URL通常含stats、player这类关键词)
第二步:调整R代码的三种方案
方案1:更新CSS选择器和属性(数据仍在页面元素中)
假设通过开发者工具找到数据在div.stats-wrapper元素的data-match-stats属性里,代码修改如下:
library(rvest) library(jsonlite) page <- read_html("https://www.foxsports.com.au/nrl/nrl-premiership/match-centre/NRL20220101/playerstats") contentnodes <- page %>% html_nodes("div.stats-wrapper") %>% # 替换为你找到的新选择器 html_attr("data-match-stats") %>% # 替换为对应属性名 jsonlite::fromJSON()
方案2:直接调用API(更稳定,推荐)
如果在Network面板找到数据接口(比如https://api.foxsports.com.au/nrl/match/NRL20220101/player-stats),直接用httr请求:
library(httr) library(jsonlite) api_url <- "https://api.foxsports.com.au/nrl/match/NRL20220101/player-stats" # 替换为实际API地址 response <- GET(api_url) player_stats <- fromJSON(content(response, "text"))
方案3:处理动态渲染页面(数据由JS加载)
如果read_html抓不到内容,说明页面是JS动态渲染的,用RSelenium模拟浏览器加载:
library(RSelenium) library(rvest) library(jsonlite) # 启动Chrome浏览器(需提前安装对应驱动) driver <- rsDriver(browser = "chrome") remDr <- driver[["client"]] remDr$navigate("https://www.foxsports.com.au/nrl/nrl-premiership/match-centre/NRL20220101/playerstats") # 获取页面源码 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 后续同方案1,解析数据 contentnodes <- page %>% html_nodes("你的新选择器") %>% html_attr("对应的属性名") %>% fromJSON() # 关闭浏览器 remDr$close() driver$server$stop()
额外提示
部分网站有反爬机制,请求API时可添加请求头模拟真实浏览器,比如:
headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) response <- GET(api_url, headers)
内容的提问来源于stack exchange,提问作者user12025050
相关产品推荐
相关产品推荐

