Декодировать tinyurl в R, чтобы получить полный URL-адрес?

Есть ли способ декодировать tinyURL ссылки в R, чтобы я мог видеть, на каких веб-страницах они действительно ссылаются?

Ответы

Ответ 1

Ниже представлено быстрое и грязное решение, но должно быть выполнено:

library(RCurl)

decode.short.url <- function(u) {
  x <- try( getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE) )
  if(class(x) == 'try-error') {
    return(u)
  } else {
    x <- strsplit(x, "Location: ")[[1]][2]
    return(strsplit(x, "\r")[[1]][1])
  }
}

Переменная 'u' ниже содержит один shortend url и один регулярный url.

u <- c("http://tinyurl.com/adcd", "http://www.google.com") 

Затем вы можете получить расширенные результаты, выполнив следующие действия.

 sapply(u, decode.short.url) 

Вышеупомянутое должно работать для большинства служб, которые сокращают URL-адрес, а не только tinyURL. Я думаю.

НТН

Тони Брейал

Ответ 2

Я не знаю R, но в целом вам нужно сделать http-запрос на tinyurl-url. Вы должны вернуть ответ 301 с фактическим URL.

Ответ 3

Я использовал код Тони Брейла, но функция вернула значения NA для тех URL-адресов, где перенаправления URL-адресов не было. Хотя Тони перечислил "google.com" в своем примере, я думаю, что Google перенаправляет вас в любом случае на какую-то локализованную версию google.com.

Вот как я изменил код Тони, чтобы справиться с этим:

decode.short.url <- function(u) {
  x <- try( getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE) )
  if(class(x) == 'try-error') {
    print(paste("***", u, "--> ERORR!!!!"))    
    return(u)
  } else {
    x <- strsplit(x, "Location: ")[[1]][2]
    x.2  <- strsplit(x, "\r")[[1]][1]
    if (is.na(x.2)){
      print(paste("***", u, "--> No change."))
      return(u)
    }else{
      print(paste("***", x.2, "--> resolved in -->", x.2))  
      return(x.2)
    }
  }
}


u <- list("http://www.amazon.com", "http://tinyurl.com/adcd") 
urls <- sapply(u, decode.short.url)

Ответ 4

library(RCurl)

decode.short.url <- function(u) {
  x <- try( getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE) )
  if(class(x) == 'try-error') {
    return(u)
  } else {
    x <- strsplit(x, "Location: ")[[1]][2]
    return(strsplit(x, "\r")[[1]][1])
  }
}


( u <- c("http://tinyurl.com/adcd", "http://tinyurl.com/fnqsh") )
( sapply(u, decode.short.url) )