我正在尝试从 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 错误,我的代码也根本不输出此内容。
任何帮助将不胜感激。
根据您的控制台输出,它似乎从未命中错误分支/打印错误消息。您可能需要向 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 错误/警告(例如,只是一条打印语句)。