如何用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
相关产品推荐
相关产品推荐

