与RVest一起在R中使用Sys.sleep()时的建议

时间:2018-10-13 06:44:43

标签: r sleep rvest sys

我正在使用R软件包rvest抓取数千个网页。为了不使服务器过载,我将Sys.sleep()函数的时间设置为5秒。

在我们抓取到大约400个网页之前,它一直很好。但是,尽管没有抛出错误,但超出此值后,我什么也没得到,所有数据均为空。

我想知道是否有可能修改Sys.sleep()函数以将350个网页每个抓取5秒,然后等待5分钟,然后再继续处理350个网页...等等。 / p>

我正在查看Sys.sleep()函数文档,并且只有time作为参数出现。因此,如果使用此功能无法做到这一点,那么在抓取大量页面时还有其他可能性或功能来解决此问题吗?

更新示例

这是我的代码的一部分。对象links由8000多个链接组成。

title <- vector("character", length = length(links))
short_description <- vector("character", length = length(links))

for(i in seq_along(links)){
  Sys.sleep(5)
  aff_link <- read_html(links[i])
  title[i] <- aff_link %>%
    html_nodes("title") %>% 
    html_text()
  short_description[i] <- aff_link %>%
    html_nodes(".clp-lead__headline") %>% 
    html_text()
}

1 个答案:

答案 0 :(得分:1)

您可以检查循环变量的模数,每N次迭代额外睡眠一次。示例:

> for(i in 1:100){
  message("Getting page ",i)
  Sys.sleep(5)
  if((i %% 10) == 0){
    message("taking a break")
    Sys.sleep(10)
  }
 }

每10次迭代,表达式i %% 10TRUE,您将获得额外的10秒钟睡眠时间。

我可以想到更复杂的解决方案,但这可能对您有用。

另一种可能性是检查页面是否返回任何数据,如果没有,则睡两次,然后重试,重复多次。这是一些半伪代码:

get_page = function(page){
   sleep = 5
   for(try in 1:5){
     html = get_content(page)
     if(download_okay(html)){
      return(html)
     }
     sleep = sleep * 2
     Sys.sleep(sleep)
    }
    return("I tried - but I failed!")
}

诸如CURL之类的某些Web网页获取程序会使用正确的选项自动执行此操作-也许也有办法将其纳入您的代码中。