2016-10-21 6 views
0

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

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

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

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

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

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

+0

У вас есть дополнительные кавычки и пробелы (\ "), от которых вам нужно избавиться. Я не уверен, что вы пытаетесь сделать с' readLines' и 'cat', либо просто создайте одну строку (или более длинный вектор для 'lapply') с' paste0'. Кроме того, 'httr' полезна, если вы хотите перенести этот процесс на следующий уровень. – alistaire

ответ

1

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

0
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, вам также можно попробовать this package (он не компилируется хорошо на macOS и совсем не на Windows IIRC), который будет выполнять всю обработку локально.