rvest爬取Covers网站NBA球员URL失效,咨询原因与解决方法
问题排查与解决方法
首先明确:rvest的html_attr/html_nodes用法没有变化,问题出在Covers网站的页面结构更新了,你的旧代码依赖的HTML结构已经不存在。
具体原因分析
现在访问目标阵容页面,查看HTML结构会发现:
- 球员的专属链接不再是页面中所有
<a>标签里随便包含/players/的类型,而是被包裹在特定容器元素内,且<a>标签带有专属类名(比如当前页面中,球员名字的链接类为PlayerCard_playerName__3Y7Yl); - 另一种可能是部分内容通过JavaScript动态渲染,
read_html()只能抓取页面初始加载的静态HTML,动态加载的内容无法直接获取。
修复方案
方案1:针对静态可抓取结构,使用精准CSS选择器
先通过浏览器开发者工具(F12)定位到球员链接的<a>标签,找到其专属选择器,修改代码如下:
library(rvest) library(tidyverse) covers_page <- "https://www.covers.com/sport/basketball/nba/teams/main/boston-celtics/2022-2023/roster" tmp <- read_html(covers_page) # 用精准CSS选择器定位球员链接 href <- tmp %>% html_nodes(".PlayerCard_playerName__3Y7Yl") %>% html_attr("href") %>% as_tibble_col(column_name = "value") %>% filter(grepl("/players/", value))
方案2:处理动态加载内容(若静态抓取失效)
如果发现页面球员数据是AJAX动态加载的,read_html()无法获取,需使用模拟浏览器渲染的工具,比如RSelenium,示例代码如下:
library(RSelenium) library(rvest) library(tidyverse) # 启动Chrome浏览器驱动(需提前安装对应版本的chromedriver) driver <- rsDriver(browser = "chrome") remDr <- driver[["client"]] # 访问目标页面并等待加载完成 remDr$navigate("https://www.covers.com/sport/basketball/nba/teams/main/boston-celtics/2022-2023/roster") Sys.sleep(3) # 获取渲染后的页面源码并解析 page_source <- remDr$getPageSource()[[1]] tmp <- read_html(page_source) # 抓取球员链接 href <- tmp %>% html_nodes(".PlayerCard_playerName__3Y7Yl") %>% html_attr("href") %>% as_tibble_col(column_name = "value") %>% filter(grepl("/players/", value)) # 关闭驱动 remDr$close() driver$server$stop()
注意事项
- 网站HTML结构可能频繁更新,后续若再次失效,需重新用开发者工具定位最新选择器;
- 爬取前请遵守网站
robots.txt协议与使用条款,避免触发反爬机制。
内容的提问来源于stack exchange,提问作者dfaberjob
相关产品推荐
相关产品推荐

