在R中ping一个网站

时间:2011-08-10 14:50:08

标签: r ping

我想在R中创建一个ping给定网站的脚本。我没有找到任何有关此特定信息的信息。

首先,我需要的是有关网站是否响应ping的信息。

是否有人拥有有关现有脚本的信息或最适合使用的软件包?

5 个答案:

答案 0 :(得分:18)

我们可以使用system2调用来获取shell中ping命令的返回状态。在Windows(以及可能是Linux)上,以下工作将起作用:

ping <- function(x, stderr = FALSE, stdout = FALSE, ...){
    pingvec <- system2("ping", x,
                       stderr = FALSE,
                       stdout = FALSE,...)
    if (pingvec == 0) TRUE else FALSE
}

# example
> ping("google.com")
[1] FALSE
> ping("ugent.be")
[1] TRUE

如果要捕获ping的输出,可以设置stdout = ""或使用系统调用:

> X <- system("ping ugent.be", intern = TRUE)
> X
 [1] ""                                                         "Pinging ugent.be [157.193.43.50] with 32 bytes of data:" 
 [3] "Reply from 157.193.43.50: bytes=32 time<1ms TTL=62"       "Reply from 157.193.43.50: bytes=32 time<1ms TTL=62"      
 [5] "Reply from 157.193.43.50: bytes=32 time<1ms TTL=62"       "Reply from 157.193.43.50: bytes=32 time<1ms TTL=62"      
 [7] ""                                                         "Ping statistics for 157.193.43.50:"                      
 [9] "    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)," "Approximate round trip times in milli-seconds:"          
[11] "    Minimum = 0ms, Maximum = 0ms, Average = 0ms"         

使用选项intern = TRUE可以将输出保存在向量中。我把它留给读者作为练习重新排列,以获得一些不错的输出。

答案 1 :(得分:7)

RCurl::url.exists适用于localhost(ping并不总是)并且比RCurl::getURL更快。

> library(RCurl)
> url.exists("google.com")
[1] TRUE
> url.exists("localhost:8888")
[1] TRUE
> url.exists("localhost:8012")
[1] FALSE

请注意,可以设置超时(默认情况下相当长)

> url.exists("google.com", timeout = 5) # timeout in seconds
[1] TRUE

答案 2 :(得分:2)

如果您想查看网站是否响应HTTP请求,您可以使用RCurl library测试R中的URL,curl HTTP client library是{{3}}的R接口。

示例:

> library(RCurl);
> getURL("http://www.google.com")
[1] "<!doctype html><ht....

如果你想检查响应代码(200,404等),你需要编写一个自定义函数作为getURL()的“header”选项传递。

答案 3 :(得分:1)

有一个包... {pingr} Link to CRAN

library(pingr)

# check if domain can be reached via port 80
is_up(destination = "example.com")

## [1] TRUE


# check how domain name is resolved to ip adress
nsl("example.com")

## $answer
##          name class type   ttl          data
## 1 example.com     1    1 85619 93.184.216.34
## 
## $flags
## aa tc rd ra ad cd 
## NA NA NA NA NA NA 


# check HTTP port
pingr::ping_port("example.com", 80)


# check HTTPS port
pingr::ping_port("example.com", 443)


答案 4 :(得分:0)

获取状态码

library(httr)

b <- GET("http://www.google.com")

b$status_code

[1] 200