网络抓取时 R 代码无法识别错误(tryCatch)

问题描述 投票:0回答:1

我正在尝试从 Google Scholar 中抓取数据。我在编码和抓取方面没有太多经验,因此遇到了很多问题。我在here发表了类似的帖子,但我有一个新问题。当我收到错误消息时

“警告:响应代码 429。Google 正在限制您过快发出过多请求的速率。”

我想暂停循环并等待 15 分钟直到超时到期。我尝试放入 tryCatch(),但它无法识别 429 错误。我知道这一点是因为控制台只是一遍又一遍地输出 429 错误,而不是暂停 15 分钟。我不知道为什么它不起作用,因为它看起来是正确的。以下是控制台输出:

警告:响应代码 429。Google 正在限制您过快发出过多请求。警告:响应代码 429。Google 正在限制您过快发出过多请求。警告:响应代码 429。Google 正在限制您进行速率因为太快提出太多请求。

我的代码目前是


scholar_ids <- character(nrow(info))

last_successful_iteration <- 0  # Initialize last successful iteration

i <- 1  # Start at the first row

while (i <= nrow(info)) {
  id <- NULL
  
  tryCatch({
    id <- get_scholar_id(last_name = info$last_name[i],
                         first_name = info$first_name[i],
                         affiliation = "School Name")
    last_successful_iteration <- i  # Update last successful iteration
  }, error = function(err) {
    cat("Error message:", err$message, "\n")  # Print the error message
    if (grepl("429", err$message)) {  # Check if the error contains 429
      cat("Timeout. Pausing for 15 minutes.\n")
      Sys.sleep(900)  # Pause for 15 minutes (900 seconds)
      i <- last_successful_iteration  # Restart the loop from the last successful iteration
    } else {
      stop(err)  # If it's not error 429, stop and display the error
    }
  })

    scholar_ids[i] <- id  # Store the ID in the vector

    # Increment the loop variable to move to the next iteration
    i <- i + 1
  }
  
  # Random sleep to avoid hitting rate limits
  sleep_time <- runif(n = 1, min = 10, max = 12)
  Sys.sleep(sleep_time)
}

其中“info”是一个数据框,其中包含名字和姓氏的列。我计划稍后在获得 Google ID 后将其添加到信息数据框中。

我在网上查看了许多关于如何捕获错误的资源,我的代码与他们的一致,但显然有些东西不太正确。

当我收到 429 错误时,我希望它显示“超时。暂停 15 分钟。 " 如上所述。即使我收到 429 错误,我的代码也根本不输出此内容。

任何帮助将不胜感激。

r web-scraping error-handling
1个回答
0
投票

根据您的控制台输出,它似乎从未命中错误分支/打印错误消息。您可能需要向 tryCatch 分支添加警告处理。类似于

error = function(err) { ... } 

您可以尝试添加

warning = function(warn) { ... } 

所以它看起来像这样:

tryCatch({
    id <- get_scholar_id(last_name = info$last_name[i],
                         first_name = info$first_name[i],
                         affiliation = "School Name")
    last_successful_iteration <- i  # Update last successful iteration
  }, error = function(err) {
    cat("Error message:", err$message, "\n")  # Print the error message
    if (grepl("429", err$message)) {  # Check if the error contains 429
      cat("Timeout. Pausing for 15 minutes.\n")
      Sys.sleep(900)  # Pause for 15 minutes (900 seconds)
      i <- last_successful_iteration  # Restart the loop from the last successful iteration
    } else {
      stop(err)  # If it's not error 429, stop and display the error
    }
  }, warning = function(warn) { cat("Warning branch\n") })

虽然不知道返回对象的详细信息,但打印到控制台的消息可能不是真正的 R 错误/警告(例如,只是一条打印语句)。

© www.soinside.com 2019 - 2024. All rights reserved.