Функция decode_short_URL из пакета twitteR не работает

Я использую decode_short_url из twitteR пакет для декодирования сокращенных URL-адресов из сообщений Twitter, но я не могу получить желаемые результаты, он всегда возвращает одинаковые результаты, такие как:

decode_short_url(decode_short_url("http://bit.ly/23226se656"))

## http://bit.ly/23226se656
## [1] "http://bit.ly/23226se656

1 ответ

Решение

ОБНОВЛЕНИЕ Я упаковал эту функциональность в пакет и сумел получить ее в CRAN в тот же день. Теперь вы можете просто сделать:

library(longurl)

expand_urls("http://bit.ly/23226se656", check=TRUE, warn=TRUE)
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

## Source: local data frame [1 x 2]
## 
##                   orig_url expanded_url
## 1 http://bit.ly/23226se656           NA
## 
## Warning message:
## In FUN(X[[i]], ...) : client error: (404) Not Found

Вы можете передать вектор URL-адресов и получить data_frame/data.frame обратно в том виде.


Этот конкретный URL-адрес bit.ly дает 404 ошибка. Вот версия decode_short_url который имеет необязательный check параметр, который будет пытаться HEAD запросить и выдать предупреждающее сообщение для любого состояния HTTP, кроме 200.

Вы можете дополнительно изменить его, чтобы вернуть NA в случае "расширенной" ссылки 404 (я понятия не имею, что вам нужно, чтобы действительно делать, если ссылка плохая).

Обратите внимание, что добавление HEAD Запрос значительно замедлит процесс, поэтому вы можете сделать первый проход с check=FALSE в отдельный столбец, затем сравните те, которые не были "расширены", затем отметьте те, которые check=TRUE,

Вы также можете переименовать это, чтобы избежать конфликтов пространства имен с тем из twitteR,

decode_short_url <- function(url, check=FALSE, ...) {

  require(httr)

  request_url <- paste("http://api.longurl.org/v2/expand?url=", 
                      url, "&format=json", sep="")
  response <- GET(request_url, query=list(useragent="twitteR"), ...)

  parsed <- content(response, as="parsed")

  ret <- NULL
  if (!("long-url" %in% names(parsed))) {
    ret <- url
  } else {
    ret <- parsed[["long-url"]]
  }

  if (check) warn_for_status(HEAD(url))

  return(url)

}

decode_short_url("http://bit.ly/23226se656", check=TRUE)

## [1] "http://bit.ly/23226se656"
## Warning message:
## In decode_short_url("http://bit.ly/23226se656", check = TRUE) :
##   client error: (404) Not Found
Другие вопросы по тегам