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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:42:37