如何用R抓取网站链接?返回character(0)求解决
问题与修复方案
问题描述
尝试抓取Wayback Machine中对应赛事分类页面的链接,使用rvest和tidyverse包,代码如下:
library(rvest) library(tidyverse) url=read_html('https://web.archive.org/web/*/https://www.bjjcompsystem.com/tournaments/1869/categories*') get_links <- url %>% html_nodes('#resultsUrl a') %>% html_attr('href') %>% paste0('https://web.archive.org/web/20220000000000*/', .) get_links
运行后仅返回character(0),尝试查找li类也未找到有效信息。
错误原因
- URL解析问题:
read_html()无法直接处理带通配符*的Wayback Machine搜索URL,这类URL是Wayback的搜索入口,并非可直接抓取的静态页面。 - 选择器不匹配:Wayback搜索结果页面的DOM结构中,不存在
#resultsUrl这个ID的元素,原选择器无法定位到目标节点。
修复方案
1. 构造可抓取的搜索结果URL
首先使用正确的Wayback搜索URL(去掉末尾多余的*,Wayback会自动识别搜索范围):
library(rvest) library(tidyverse) # 正确的搜索结果页面URL search_page <- read_html("https://web.archive.org/web/*/https://www.bjjcompsystem.com/tournaments/1869/categories")
2. 使用正确的CSS选择器提取链接
Wayback的归档条目统一在.wb-alldata容器下的a标签中,用以下代码提取:
# 提取所有历史归档链接 all_archive_links <- search_page %>% html_nodes(".wb-alldata a") %>% html_attr("href") # 过滤出目标赛事分类页面的链接 target_links <- all_archive_links[str_detect(all_archive_links, "tournaments/1869/categories")] # (可选)生成2022年范围内的归档链接 2022_archive_links <- target_links %>% str_replace("web/\\d+/", "web/20220000000000*/") %>% unique()
3. 验证结果
运行后2022_archive_links会返回2022年所有该页面的归档链接,target_links则包含所有历史版本的链接。
注意:Wayback Machine有反爬限制,频繁请求可能被拦截,建议添加请求延迟或遵守网站爬取规则。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

