如何让R语言脚本忽略错误,批量检测网站状态?
解决URL活跃状态检测脚本的异常处理问题
核心修改点
- 预处理URL:自动补全缺失HTTP协议的URL,标记空白URL
- 错误捕获机制:用
tryCatch包裹请求逻辑,遇到无法解析、连接失败等错误时不会中断脚本,而是返回对应标记
修改后的完整代码
library(tidyverse) # 读取并预处理URL数据 url_list <- read.csv("./file.csv") %>% select(-c(4:6, 8:11, 13)) %>% # 处理空白URL,给缺失http/https前缀的URL补全协议 mutate( url = case_when( is.na(url) | url == "" ~ "[空白URL]", !str_detect(url, "^http(s)?://") ~ str_c("http://", url), TRUE ~ url ) ) # 带异常处理的URL状态检测函数 check_status_code <- function(url) { # 先处理空白URL的情况 if (url == "[空白URL]") { return("空白URL") } # 用tryCatch捕获所有请求错误 tryCatch( { headers <- curlGetHeaders(url, verify = FALSE) http_status <- attributes(headers)$status # 提取状态码(比如"200 OK"只保留数字部分) str_extract(http_status, "^\\d+") }, error = function(e) { # 根据错误类型返回对应信息 if (str_detect(e$message, "No host part")) { "无效URL(无主机部分)" } else if (str_detect(e$message, "Could not resolve host")) { "无法解析主机" } else { str_c("请求错误:", e$message) } } ) } # 批量检测所有URL状态 status_codes <- sapply(url_list$url, check_status_code) # 输出结果到CSV data.frame(URL = url_list$url, status_code = status_codes) %>% write.csv("url_status_codes.csv", row.names = FALSE)
代码说明
- 预处理阶段:用
case_when统一处理三种情况:空白URL标记为[空白URL],缺少http/https的自动补全,正常URL保持不变,避免因协议缺失导致的请求错误。 - 错误捕获:
tryCatch会拦截curlGetHeaders抛出的所有异常,根据错误信息返回更易读的状态描述,而不是直接中断脚本。 - 状态码提取:从返回的状态信息(如"200 OK")中提取纯数字状态码,结果更简洁。
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

