Получить данные из URL json в R

#json #r

#json #r

Вопрос:

Я использую R, и я хотел бы получать информацию JSON из URL, и у меня есть около 5000 пользовательских агентов для отправки в этот API (http://www.useragentstring.com/pages/api.php)

Я использую этот код для создания URL и объединения пользовательского агента:

 url_1<-paste(" "http://www.useragentstring.com/?uas=",uaelenchi[11,1],"amp;getJSON=all"",sep = '');
json_data2<-fromJSON(readLines(cat(url_1)))
  

Но я получаю эту ошибку:

 Error in readLines(cat(url_1)) : 'con' is not a connection
  

Любые предложения будут действительно оценены! Спасибо

Комментарии:

1. У вас есть лишние кавычки и пробелы ( «), от которых вам нужно избавиться. Я тоже не уверен, что вы пытаетесь сделать с readLines и cat ; просто создайте одну строку (или более длинный вектор to lapply ) с paste0 помощью. Также httr полезно, если вы хотите перевести этот процесс на следующий уровень.

Ответ №1:

Я использую rjson::fromJSON(file = paste(your_url)) . Если вы приведете воспроизводимый пример, я мог бы проверить, работает ли он в вашем случае.

Ответ №2:

 library(httr)
library(jsonlite)
library(purrr)

uas <- c("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0", 
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0", 
"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11", 
"Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0", 
"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11", 
"Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0", 
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36", 
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36")

parse_uas <- function(uas) {
  res <- GET("http://www.useragentstring.com/", query=list(uas=uas, getJSON="all"))
  stop_for_status(res)
  content(res, as="text", encoding="UTF-8") %>% 
    fromJSON(res, flatten=TRUE) %>% 
    as.data.frame(stringsAsFactors=FALSE)
}

map_df(uas, parse_uas)
  

Для сохранения вызовов API вам следует добавить уровень кэширования к parse_uas() функции, что можно довольно легко сделать с помощью memoise пакета:

 library(memoise)

.parse_uas <- function(uas) {
  res <- GET("http://www.useragentstring.com/", query=list(uas=uas, getJSON="all"))
  stop_for_status(res)
  content(res, as="text", encoding="UTF-8") %>% 
    fromJSON(res, flatten=TRUE) %>% 
    as.data.frame(stringsAsFactors=FALSE)
}

parse_uas <- memoise(.parse_uas)
  

Кроме того, если вы используете Linux, вы также можете попробовать этот пакет (он плохо компилируется в macOS и совсем не компилируется в Windows IIRC), который будет выполнять всю обработку локально.