2016-09-21 2 views
1

과거에 여러 번 사용 했으므로 RedditExtractoR 패키지를 사용하려고합니다. 지난 달 이후로 사용하지 않았지만 이번 주에 사용하려고하면 빈 데이터 프레임을 반환합니다. R RedditExtractoR 패키지 해결 방법

get_reddit(subreddit="jokes") 
|======================================================================================================================================| 100% 
    [1] id    structure  post_date  comm_date  num_comments  subreddit  upvote_prop  post_score  
    [9] author   user    comment_score controversiality comment   title   post_text  link    
    [17] domain   URL    
    <0 rows> (or 0-length row.names)' 

나는 기능 get_reddit()을 탐구하고이 기능 reddit_urls()을 사용하고 URL을하고 JSON으로 해당 페이지를로드하는 것 같다. reddit_urls() 함수는 Reddit 페이지의 URL이있는 데이터 프레임을 반환하고 .JSON을 URL 끝에 추가하면 해당 페이지가 여전히 JSON 개체로로드됩니다.

이 패키지에 문제가 있거나 다른 방법으로 JSON 객체를 구문 분석하여 데이터 파일로 만들 수 있습니까?

고맙습니다.

답변

1

나는 동일한 문제가있었습니다. 여기에 제 수정점이 있습니다 ...

https?://에 대한 옵션을 제거한 경우 https://reddit_content()이어야합니다. 그래서 기능은 다음과 같습니다

reddit_content <- function (URL, wait_time = 2) 
{ 
    if (is.null(URL) | length(URL) == 0 | !is.character(URL)) { 
     stop("invalid URL parameter") 
    } 
    GetAttribute = function(node, feature) { 
     Attribute = node$data[[feature]] 
     replies = node$data$replies 
     reply.nodes = if (is.list(replies)) 
      replies$data$children 
     else NULL 
     return(list(Attribute, lapply(reply.nodes, function(x) { 
      GetAttribute(x, feature) 
     }))) 
    } 
    get.structure = function(node, depth = 0) { 
     if (is.null(node)) { 
      return(list()) 
     } 
     filter = is.null(node$data$author) 
     replies = node$data$replies 
     reply.nodes = if (is.list(replies)) 
      replies$data$children 
     else NULL 
     return(list(paste0(filter, " ", depth), lapply(1:length(reply.nodes), 
      function(x) get.structure(reply.nodes[[x]], paste0(depth, 
       "_", x))))) 
    } 
    data_extract = data.frame(id = numeric(), structure = character(), 
     post_date = as.Date(character()), comm_date = as.Date(character()), 
     num_comments = numeric(), subreddit = character(), upvote_prop = numeric(), 
     post_score = numeric(), author = character(), user = character(), 
     comment_score = numeric(), controversiality = numeric(), 
     comment = character(), title = character(), post_text = character(), 
     link = character(), domain = character(), URL = character()) 
    pb = utils::txtProgressBar(min = 0, max = length(URL), style = 3) 
    for (i in seq(URL)) { 
     if (!grepl("^https://(.*)", URL[i])) 
      URL[i] = paste0("https://www.", gsub("^.*(reddit\\..*$)", 
       "\\1", URL[i])) 
     if (!grepl("\\?ref=search_posts$", URL[i])) 
      URL[i] = paste0(gsub("/$", "", URL[i]), "/?ref=search_posts") 
     X = paste0(gsub("\\?ref=search_posts$", "", URL[i]), 
      ".json?limit=500") 
     raw_data = tryCatch(RJSONIO::fromJSON(readLines(X, warn = FALSE)), 
      error = function(e) NULL) 
     if (is.null(raw_data)) { 
      Sys.sleep(min(1, wait_time)) 
      raw_data = tryCatch(RJSONIO::fromJSON(readLines(X, 
       warn = FALSE)), error = function(e) NULL) 
     } 
     if (is.null(raw_data) == FALSE) { 
      meta.node = raw_data[[1]]$data$children[[1]]$data 
      main.node = raw_data[[2]]$data$children 
      if (min(length(meta.node), length(main.node)) > 0) { 
       structure = unlist(lapply(1:length(main.node), 
        function(x) get.structure(main.node[[x]], x))) 
       TEMP = data.frame(id = NA, structure = gsub("FALSE ", 
        "", structure[!grepl("TRUE", structure)]), 
        post_date = format(as.Date(as.POSIXct(meta.node$created_utc, 
        origin = "1970-01-01")), "%d-%m-%y"), comm_date = format(as.Date(as.POSIXct(unlist(lapply(main.node, 
        function(x) { 
         GetAttribute(x, "created_utc") 
        })), origin = "1970-01-01")), "%d-%m-%y"), 
        num_comments = meta.node$num_comments, subreddit = ifelse(is.null(meta.node$subreddit), 
        "UNKNOWN", meta.node$subreddit), upvote_prop = meta.node$upvote_ratio, 
        post_score = meta.node$score, author = meta.node$author, 
        user = unlist(lapply(main.node, function(x) { 
        GetAttribute(x, "author") 
        })), comment_score = unlist(lapply(main.node, 
        function(x) { 
         GetAttribute(x, "score") 
        })), controversiality = unlist(lapply(main.node, 
        function(x) { 
         GetAttribute(x, "controversiality") 
        })), comment = unlist(lapply(main.node, function(x) { 
        GetAttribute(x, "body") 
        })), title = meta.node$title, post_text = meta.node$selftext, 
        link = meta.node$url, domain = meta.node$domain, 
        URL = URL[i], stringsAsFactors = FALSE) 
       TEMP$id = 1:nrow(TEMP) 
       if (dim(TEMP)[1] > 0 & dim(TEMP)[2] > 0) 
        data_extract = rbind(TEMP, data_extract) 
       else print(paste("missed", i, ":", URL[i])) 
      } 
     } 
     utils::setTxtProgressBar(pb, i) 
     Sys.sleep(min(2, wait_time)) 
    } 
    close(pb) 
    return(data_extract) 
} 

그리고 다음에 get_reddit() 기능을 재설정 :

get_reddit <- function (search_terms = NA, regex_filter = "", subreddit = NA, 
    cn_threshold = 1, page_threshold = 1, sort_by = "comments", 
    wait_time = 2) 
{ 
    URL = unique(as.character(reddit_urls(search_terms, regex_filter, 
     subreddit, cn_threshold, page_threshold, sort_by, wait_time)$URL)) 
    retrieved_data = reddit_content(URL, wait_time) 
    return(retrieved_data) 
}