R爬虫捕获429错误失败:Google Scholar爬取tryCatch不生效
问题原因
你遇到的核心问题是:get_scholar_id返回的是警告(Warning)而非错误(Error),而tryCatch()的error分支只会捕获错误,对警告无效,所以你的暂停逻辑根本没被触发。
解决方法
要捕获警告并处理,得用withCallingHandlers()(专门处理消息、警告、错误的函数),同时调整循环逻辑确保遇到429时重复当前请求。
修改后的代码
scholar_ids <- character(nrow(info)) last_successful_iteration <- 0 # 记录最后成功的迭代位置 i <- 1 # 从第一行开始 while (i <= nrow(info)) { id <- NULL success <- FALSE withCallingHandlers({ id <- get_scholar_id(last_name = info$last_name[i], first_name = info$first_name[i], affiliation = "School Name") success <- TRUE last_successful_iteration <- i # 更新成功记录 }, warning = function(warn) { # 检查警告信息是否包含429 if (grepl("429", warn$message)) { cat("触发429限流,暂停15分钟...\n") Sys.sleep(900) # 900秒=15分钟 # 屏蔽警告输出,避免重复打印 invokeRestart("muffleWarning") } else { # 其他警告直接抛出 stop(warn) } }, error = function(err) { cat("请求出错:", err$message, "\n") # 非429错误标记为成功,避免死循环(可根据需求调整逻辑) success <- TRUE }) if (success) { scholar_ids[i] <- id i <- i + 1 # 正常请求后随机睡眠,降低触发限流的概率 sleep_time <- runif(n = 1, min = 10, max = 12) Sys.sleep(sleep_time) } }
关键改动说明
- 用
withCallingHandlers()替代tryCatch(),新增warning分支专门处理警告信息 - 加入
success标记,只有请求成功(或处理完非429错误)才推进循环变量i - 遇到429时调用
invokeRestart("muffleWarning")屏蔽重复的警告输出 - 把随机睡眠放到循环内部的成功分支里,确保每次正常请求后都有间隔
- 调整循环逻辑,遇到429时不推进
i,会重复当前行的请求
额外建议
- 可以进一步延长随机睡眠的时间范围(比如
min=15, max=20),降低触发限流的概率 - 如果频繁遇到429,考虑添加代理IP,避免被Google Scholar永久封禁
内容的提问来源于stack exchange,提问作者cardinalcat27
相关产品推荐
相关产品推荐

