如何绕过网络抓取时的超时

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

我对抓取还比较陌生,目前正在使用 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”是存储名字和姓氏的数据框。当信息匮乏时,数据框将被更新。

有人对如何解决这个问题有任何想法吗?

r web-scraping google-scholar
1个回答
0
投票

我怀疑您使用的随机延迟方法可能会导致一系列短暂延迟的请求,进而触发 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 小时)才能爬取所有条目。总是最好慢慢爬行,不要让自己受阻或受到限制。

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