使用R语言爬取Wayback Machine中指定网站的历史版本
获取Wayback Machine网站历史版本的R语言高效方案
问题分析
你之前用正则匹配HTML源码失败,大概率是因为Wayback Machine的HTML结构变化,或者正则表达式的匹配规则没覆盖到实际的链接格式。下面提供两种更可靠的方案,均适用于任意网站的历史版本获取。
方案一:使用Wayback Machine CDX API(推荐)
Wayback提供官方的CDX索引API,直接返回结构化的历史快照数据,无需解析HTML,稳定性和效率都更高。
代码实现
library(jsonlite) library(lubridate) # 目标网站URL target_url <- "https://covid.cdc.gov/covid-data-tracker/" # 构造CDX API请求URL,自动编码特殊字符 cdx_request_url <- sprintf( "https://web.archive.org/cdx/search/cdx?url=%s&output=json", URLencode(target_url) ) # 获取JSON格式的快照数据 cdx_raw_data <- fromJSON(cdx_request_url) # 转换为数据框并设置列名 colnames(cdx_raw_data) <- c("urlkey", "timestamp", "original", "mimetype", "statuscode", "digest", "length") cdx_df <- as.data.frame(cdx_raw_data[-1, ], stringsAsFactors = FALSE) # 处理日期、时间和完整快照链接 cdx_df$date <- format(ymd_hms(cdx_df$timestamp), "%b-%d-%Y") cdx_df$time <- format(ymd_hms(cdx_df$timestamp), "%H:%M:%S") cdx_df$links <- sprintf("https://web.archive.org/web/%s/%s", cdx_df$timestamp, cdx_df$original) # 提取需要的列并查看结果 result_df <- cdx_df[, c("date", "links", "time")] head(result_df)
扩展说明
- 可以添加参数过滤时间范围,比如只获取2023年的快照:
&from=20230101&to=20231231 - 若需要去重(同一时间的多个快照),可以添加参数
&collapse=timestamp:10(按10分钟粒度去重)
方案二:使用网页解析包rvest解析Wayback页面
如果不想依赖API,用rvest解析HTML比正则更可靠,因为它直接基于DOM结构定位元素,不易受小范围HTML变化影响。
代码实现
library(rvest) library(lubridate) # Wayback Machine的目标网站历史页面URL wayback_page_url <- "https://web.archive.org/web/*/https://covid.cdc.gov/covid-data-tracker/" # 读取页面内容 page <- read_html(wayback_page_url) # 提取所有历史快照链接(根据Wayback页面结构调整选择器) raw_links <- page %>% html_elements("a[href^='/web/']") %>% html_attr("href") # 过滤出目标网站的快照链接 target_links <- raw_links[grepl("https://covid\\.cdc\\.gov/covid-data-tracker/", raw_links)] # 构造完整的快照链接 full_links <- sprintf("https://web.archive.org%s", target_links) # 从链接中提取时间戳并转换格式 timestamps <- sub("/web/(\\d+)/.*", "\\1", target_links) dates <- format(ymd_hms(timestamps), "%b-%d-%Y") times <- format(ymd_hms(timestamps), "%H:%M:%S") # 生成结果数据框 result_df <- data.frame(date = dates, links = full_links, time = times, stringsAsFactors = FALSE) head(result_df)
注意事项
- 若Wayback页面结构更新,可能需要调整
html_elements中的CSS选择器(比如查看页面源码,找到快照链接所在的容器类名)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

