You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R爬取页面所有分组链接?爬取遇NA及仅获单链接求解

解决方案:爬取BJJ竞赛系统的分组链接

问题原因

目标网站的分组内容是动态加载的——初始HTML仅包含页面框架,实际分组数据由JavaScript在页面加载后异步获取并渲染。直接用read_html()只能抓取初始静态页面,无法获取动态生成的分组链接,这就是你之前代码返回NA或仅单个链接的原因。

两种可行解决方法

方法1:用RSelenium模拟浏览器加载动态内容

通过模拟真实浏览器的行为,等待页面完全加载后再抓取内容:

library(RSelenium)
library(rvest)
library(tidyverse)

# 启动Chrome驱动(需确保ChromeDriver已安装并配置路径)
driver <- rsDriver(browser = "chrome", chromever = "latest")
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.bjjcompsystem.com/tournaments/1869/categories")

# 等待5秒让动态内容加载完成(可根据网络速度调整时长)
Sys.sleep(5)

# 获取完整页面源码并解析
page_source <- remDr$getPageSource()[[1]]
pageMen <- read_html(page_source)

# 提取所有分组链接(匹配包含目标路径的a标签)
get_links <- pageMen %>% 
  html_elements("a[href*='/tournaments/1869/categories/']") %>% 
  html_attr("href") %>% 
  paste0("https://www.bjjcompsystem.com", .)

# 输出结果
print(get_links)

# 关闭浏览器会话
remDr$close()
driver$server$stop()

方法2:直接请求网站API接口

通过浏览器开发者工具(F12 → Network → XHR)可发现,网站会调用API接口获取分组数据。直接请求该接口能更高效地获取数据:

library(httr)
library(jsonlite)
library(tidyverse)

# 请求分组数据API(实际接口可通过浏览器开发者工具确认)
response <- GET("https://www.bjjcompsystem.com/api/tournaments/1869/categories")
category_data <- fromJSON(content(response, "text"))

# 拼接完整分组链接
get_links <- category_data %>% 
  mutate(full_link = paste0("https://www.bjjcompsystem.com/tournaments/1869/categories/", slug)) %>% 
  pull(full_link)

# 输出结果
print(get_links)

对之前代码问题的说明

  • 第一次使用.panel-default选择器:初始静态页面中该类元素无href属性,且动态加载的元素未被抓取,因此返回NA。
  • 第二次使用绝对XPath:仅能定位到初始页面的第一个链接,无法覆盖动态生成的其他分组。

内容的提问来源于stack exchange,提问作者bandcar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:46:37