我尝试将url_ok
与pbsapply
一起使用来测试大量网址:
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");
答案 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