我对抓取还比较陌生,目前正在使用 R 中的 scholar 包 尝试从 Google Scholar 中抓取有关研究人员的信息。然而,我有大约 500 个名字需要抓取,所以我在 Google 上超时了。
为了解决这个问题,我尝试设置一个计时器,在每个附加名称被抓取后暂停,但我仍然超时。
for (i in seq_len(nrow(info))) {
# Get the Google Scholar ID
id <- get_scholar_id(last_name = info$last_name[i],
first_name = info$first_name[i],
affiliation = "School Name")
# Store the ID
scholar_ids[i] <- id
sleep_time <- runif(n = 1, min = 2, max = 4)
Sys.sleep(sleep_time)
}
其中“info”是存储名字和姓氏的数据框。当信息匮乏时,数据框将被更新。
有人对如何解决这个问题有任何想法吗?
我怀疑您使用的随机延迟方法可能会导致一系列短暂延迟的请求,进而触发 Google Scholar 的速率限制。我的经验是,速率限制将与您的 IP 关联一段时间。不确定什么时候会过期。您可以尝试等待,或者如果可能的话,通过 VPN 或代理运行爬虫,这将有效地为您提供不同的 IP 地址。
然后我建议使用确定性延迟。我的测试表明 15 秒是一个延迟,不会让你被 Google Scholar 限制。
这是一个测试脚本,它复制具有名称和隶属关系值的数据框。生成的数据帧有 500 个条目。然后它会迭代这些条目。我建议使用
for
,而不是使用 purrr::pmap_chr()
循环,但您也可以将其调整为简单的 for
循环。
library(tibble)
library(dplyr)
library(purrr)
library(scholar)
info <- tribble(
~first_name, ~last_name, ~affiliation,
"Maggie", "Collier", NA,
"Dennis", "Lichtenberger", NA,
"Ingo", "Steinbach", "Ruhr-Universitaet Bochum",
"Michael", "Sander", "ETH Zurich",
"ray", "craib", NA
)
info <- bind_rows(replicate(100, info, simplify = FALSE))
nrow(info)
scholar_ids <- pmap_chr(info, function(...) {
print(Sys.time())
Sys.sleep(15)
get_scholar_id(...)
})
由于 15 秒的延迟,需要一段时间(大约 2 小时)才能爬取所有条目。总是最好慢慢爬行,不要让自己受阻或受到限制。