R语言函数抓取Wayback Machine链接仅返回表头无数据,求解决方案
修复Wayback Machine存档页面抓取无数据的问题
1. 修正Wayback存档链接格式
你当前使用的固定时间戳20220000000000可能匹配不到有效存档,或对应存档的页面结构与原网站差异过大。应直接利用timemap返回的timestamp字段拼接精准的存档链接:
# 替换原links生成代码 links <- str_c("https://web.archive.org/web/", link_text$timestamp, "/", link_text$original)
这样能确保链接指向真实存在、与原请求匹配的存档页面。
2. 适配Wayback页面结构的CSS选择器
Wayback会给存档页面添加自身的导航栏和外层容器,原网站的内容会被嵌套在特定容器内(通常是#wb_main或.wb-page),直接使用原网站的选择器会找不到目标元素。修改抓取函数,先定位到原页面内容容器,再在其中查找节点:
tree_page <- function(url) { # 模拟浏览器请求,避免被Wayback拦截 html <- request(url) %>% req_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") %>% req_perform() %>% resp_body_html() %>% # 定位到Wayback中存储原页面内容的容器 html_element("#wb_main") # 处理找不到容器的情况,返回空结构避免报错 if(is.na(html)) { return(data.frame(division=character(), gender=character(), belt=character(), weight=character(), winner=character(), opponent=character())) } data.frame(division = html %>% html_nodes('.category-title__age-division') %>% html_text(trim = TRUE), gender = html %>% html_nodes('.category-title__age-division+ .category-title__label') %>% html_text(trim = TRUE), belt = html %>% html_nodes('.category-title__label:nth-child(3)') %>% html_text(trim = TRUE), weight = html %>% html_nodes('.category-title__label:nth-child(4)') %>% html_text(trim = TRUE), winner = html %>% html_nodes('.match-card__competitor--red') %>% html_text(trim = TRUE), opponent = html %>% html_nodes('hr+ .match-card__competitor') %>% html_text(trim = TRUE) ) }
3. 处理动态内容渲染问题
如果原网站是通过JavaScript动态加载数据,Wayback的静态存档可能未加载这部分内容。可以尝试两种方式解决:
- 在存档链接的时间戳后添加
/js/,强制Wayback渲染JS内容:
links <- str_c("https://web.archive.org/web/", link_text$timestamp, "/js/", link_text$original)
- 若上述方法无效,可使用
RSelenium或playwright工具模拟完整浏览器加载流程后再抓取数据。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

