декодировать tinyurl в R, чтобы получить полный путь URL? - PullRequest
13 голосов
/ 23 марта 2010

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

Ответы [ 4 ]

16 голосов
/ 23 марта 2010

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

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' ниже содержит один сокращенный URL и один обычный URL.

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

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

 sapply(u, decode.short.url) 

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

НТН

Тони Бреял

1 голос
/ 24 апреля 2013

Я использовал код Тони Бреяля, но функция вернула значения 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)
1 голос
/ 23 марта 2010

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

0 голосов
/ 23 марта 2010
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) )
...