代码之家  ›  专栏  ›  技术社区  ›  antecessor

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

  •  -2
  • antecessor  · 技术社区  · 7 年前

    rvest . 为了不使服务器过载,我对 Sys.sleep() 运行5秒。

    我想知道是否有可能修改这一条款 系统睡眠() 功能以每5秒的时间刮取350个网页,然后等待实例5分钟,然后继续使用另一个350个网页。。。等等。

    我在检查 系统睡眠() 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 回复  |  直到 7 年前
        1
  •  1
  •   Spacedman    7 年前

    您可以对循环变量的模进行检查,并每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 %% 10 TRUE

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

    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这样的网页获取程序会自动地使用正确的选项来实现这一点——可能也有一种方法可以将其添加到您的代码中。