使用httr :: url_ok验证某些URL上的URL,并忽略超时

时间:2015-07-02 17:06:44

标签: r url timeout

我尝试将url_okpbsapply一起使用来测试大量网址:

pbsapply(foo$URL, function(x) try(url_ok(x)))

但程序仍然卡在某些错误的网址上,例如url_ok("www.isdnet.net")。此URL将在浏览器中返回403 Forbidden,但会使R卡住。还有其他不良网址情况,我不知道大数据集中有多少个坏网址。

我尝试创建一个超时时间,如果几秒后无法返回任何内容就会停止,给它一个FALSE然后转到下一个网址。

我尝试了这个,但没有工作,仍然卡住了:

evalWithTimeout(url_ok("www.isdnet.net"), timeout=1.08, onTimeout="warning");

1 个答案:

答案 0 :(得分:0)

不幸的是,HEAD请求(url_ok使用的)不能在所有网络服务器上运行,并且可能会导致超时死亡 - 螺旋给您不准确的结果(以及其他问题)。避免这种情况的唯一方法是使用GET请求,这将导致下载更多的有效负载。但是,您可能会担心格式错误的URL(我很少遇到大而干净的URL数据集),这会导致实际的R错误。你最好的选择是写一个更健壮的网站,然后#34;例程(更新以添加timeout):

library(httr)
library(pbapply)

# this is a dangerous setting for normal operations
set_config(config(ssl_verifypeer=0L, ssl_verifyhost=0L), override=TRUE)

url_ok_via_get <- function(...) {

  ret <- FALSE

  tryCatch( {
x <- GET(..., timeout(5), user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.61 Safari/537.36"))
    ret <- identical(status_code(x), 200L)
  }, error=function(e) {
    ret <- FALSE
  }, finally=return(ret))

}

url_ok_via_get("aladslsdf")
## [1] FALSE

url_ok_via_get("http://www.isdnet.net")
## [1] FALSE

url_ok_via_get("http://dds.ec/guaranteed_to_return_404")
## [1] FALSE

url_ok_via_get("http://rud.is/")
## [1] TRUE

url_ok_via_get("http://www.gn.dk")
## [1] FALSE

pbsapply(c("aladslsdf", "http://www.isdnet.net",
           "http://dds.ec/guaranteed_to_return_404", "http://rud.is/",
           "http://www.gn.dk"), url_ok_via_get)

##                              aladslsdf 
##                                  FALSE 
##                  http://www.isdnet.net 
##                                  FALSE 
## http://dds.ec/guaranteed_to_return_404 
##                                  FALSE 
##                         http://rud.is/ 
##                                   TRUE 
##                       http://www.gn.dk 
##                                  FALSE