如何在 URL 获取请求之间暂停?
How can I pause between URL Get requests?
我有一个函数,它接受两个参数,组装一个 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 的速度逐步通过它们?
您正在从 block
函数返回后调用 Sys.sleep
。但是,我不确定它是否可以用 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"
我有一个函数,它接受两个参数,组装一个 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 的速度逐步通过它们?
您正在从 block
函数返回后调用 Sys.sleep
。但是,我不确定它是否可以用 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"