I would like to create a script in R that pings a given website. I haven\'t found any information about this specific for R.
To start with, all I need is the informa
If you want to see if a website is responding to HTTP requests, you can test an URL in R with the RCurl library, which is an R interface to the curl HTTP client library.
Example:
> library(RCurl);
> getURL("http://www.google.com")
[1] "<!doctype html><ht....
If you want to examine the response code (for 200, 404, etc.) you will need to write a custom function to pass as the "header" option to getURL().
We can use a system2
call to get the return status of the ping command in the shell. On Windows (and probably linux) following will work :
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
If you want to capture the output of ping, you can either set stdout = ""
, or use a system call:
> 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"
using the option intern = TRUE
makes it possible to save the output in a vector. I leave it to the reader as an exercise to rearrange this in order to get some decent output.
To get the status code
library(httr)
b <- GET("http://www.google.com")
b$status_code
[1] 200
RCurl::url.exists
works for localhost (where ping doesn't always) and is faster than RCurl::getURL
.
> library(RCurl)
> url.exists("google.com")
[1] TRUE
> url.exists("localhost:8888")
[1] TRUE
> url.exists("localhost:8012")
[1] FALSE
Note that it is possible to set the timeout (which by default is rather long)
> url.exists("google.com", timeout = 5) # timeout in seconds
[1] TRUE