如何在URL Get请求之间暂停?

时间:2015-11-13 19:17:28

标签: r rcurl

我有一个函数,它接受两个参数,组装一个URL,并提交一个GET请求。我给函数提供了一个参数列表(每个记录的一对参数),一切都回来了。

但是,我想确保我一次只发送一个请求。结果反应如此之快,以至于我不确定我是否正在敲打他们的服务器。

这就是我所拥有的(df是一个包含25行的数据帧,所以我在这种情况下提交了25个请求):

 library(RCurl)

 block <- function(latty, longy){
             url <- paste0("http://data.fcc.gov/api/block/2010/find?latitude=", latty, "&longitude=", longy)
             response <- getURL(url)
             blockID <- substr(sub(".*Block FIPS=\\\"","",response), 0, 15)
             return(blockID)
             Sys.sleep(0.25)
           }

 result <- do.call(block, list(latty=df$lat, longy=df$long))

当我运行这个脚本时,服务器是否充满了请求,还是以Sys.sleep速率踩过它们?

1 个答案:

答案 0 :(得分:2)

Sys.sleep函数返回后,您正在调用block。但是,我不确定它是否可以用do.call来解决,因为它只传递了所有参数。我会使用sapply或其他矢量化函数。例如

sapply(1:nrow(df$long), block)
block <- function(i){
                 latty <- df$lat[i]
                 longy <- df$long[i]
                 Sys.sleep(0.25)
                 url <- paste0("http://data.fcc.gov/api/block/2010/find?latitude=", latty, "&longitude=", longy)
                 response <- getURL(url)
                 substr(sub(".*Block FIPS=\\\"","",response), 0, 15)
               }

sapply将在开始另一次迭代之前等待每次迭代完成,例如

> sapply(1:10, function(x) {Sys.sleep(1); print(Sys.time())})
[1] "2015-11-13 11:36:28 PST"
[1] "2015-11-13 11:36:29 PST"
[1] "2015-11-13 11:36:30 PST"
[1] "2015-11-13 11:36:31 PST"
[1] "2015-11-13 11:36:32 PST"
[1] "2015-11-13 11:36:33 PST"
[1] "2015-11-13 11:36:34 PST"
[1] "2015-11-13 11:36:35 PST"
[1] "2015-11-13 11:36:36 PST"
[1] "2015-11-13 11:36:37 PST"