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

如何在R中按条件删除含重复核心URL的行

解决Wayback Machine抓取数据的URL去重问题

核心思路是先给每条记录生成不含查询参数的核心URL,再基于这个核心URL对原数据框去重,这样就能完整保留原数据框的所有列信息,而不是只输出链接向量。

方法1:简洁字符串处理法

直接通过字符串操作剥离URL的查询参数部分,再去重:

library(rvest); library(tidyverse); library(stringr)
library(httr2); library(janitor)

# 原抓取流程不变
link_text = "https://web.archive.org/web/timemap/json?url=https://www.bjjcompsystem.com/tournaments/1869/categories&matchType=prefix&collapse=urlkey&output=json&fl=original,mimetype,timestamp,endtimestamp,groupcount,uniqcount&filter=!statuscode:[45]..&limit=10000&_=1663136483842" %>% 
  request() %>% 
  req_perform() %>% 
  resp_body_json(simplifyVector = TRUE) %>% 
  as_tibble() %>% 
  row_to_names(1)

link_text = link_text[-c(1, 788:790),]

# 生成核心URL并去重
link_text_dedup <- link_text %>%
  # 去掉?及后面的所有参数,得到核心URL
  mutate(core_url = str_remove(original, "\\?.*$")) %>%
  # 按核心URL去重,保留每组的第一行
  distinct(core_url, .keep_all = TRUE)

# 查看去重后的完整数据框
head(link_text_dedup)

方法2:规范URL解析法

用httr2的URL解析工具拆分URL各部分,组合出核心路径,适合复杂URL场景:

link_text_dedup <- link_text %>%
  # 解析每条URL,拆分出协议、主机、路径等部分
  mutate(url_parsed = map(original, url_parse)) %>%
  unnest_wider(url_parsed) %>%
  # 拼接协议+主机+路径,得到核心URL
  mutate(core_url = str_c(scheme, "://", hostname, path)) %>%
  # 去重并保留所有原列
  distinct(core_url, .keep_all = TRUE) %>%
  # 可选:删除解析产生的中间列,让数据框更整洁
  select(-scheme, -hostname, -path, -query, -fragment, -url_parsed)

head(link_text_dedup)

进阶调整:保留特定行

如果不想保留每组的第一行,而是要保留最新时间戳的记录,可以先排序再去重:

link_text_dedup <- link_text %>%
  mutate(core_url = str_remove(original, "\\?.*$")) %>%
  # 按timestamp降序排列,让最新的记录排在前面
  arrange(desc(timestamp)) %>%
  # 去重时就会保留每组的第一条(也就是最新的)记录
  distinct(core_url, .keep_all = TRUE)

内容的提问来源于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 10:40:25