2015-06-26 5 views
1

Я пытаюсь получить информацию о репозиториях, используя API github. Для этого я использую R. Некоторые URL-адреса бросают 403 ошибки. К сожалению, это останавливает мою функцию и прерывает функцию fromJSON. снова Вызов fromJSON всегда будет приводить к «ошибки клиента: (403) Запрещенный»Веб-скребок в R с jsonlite

Есть ли способ для обработки исключений в R так что моя функция может продолжить выполнение, если я получаю 403.

Моя функция заключается в следующем :

getData <- function(start, end) { 
    languages = NULL 
    names = NULL 
    base_url <- 'https://api.github.com/users/' 
    for(num in start:end) { 
    url <- print(paste(base_url,num, '/repos', sep='')) 
    df<- fromJSON(url) 
    languages <- c(languages, df$language) 
    names <- c(names, df$name) 
    } 
    r = data.frame(languages, names) 
    return(r) 
} 
+0

Вам нужно очистить его таким образом? В R есть несколько пакетов github api, включая этот https://github.com/cscheid/rgithub – hrbrmstr

+0

. Ваш '403 Forbidden', скорее всего, API GitHub говорит вам, что вы превысили лимит API без аутентификации, кстати. – hrbrmstr

ответ

1

См.? Попробуйте и попробуйте TryKatch для руководства по обработке исключений.

Вот POC, который показывает, как 404 ошибка из fromJSON можно продолжать, идя на печать «ОК»:

> try({fromJSON("http://www.google.com/nosuch")}) ; cat("ok\n") 
Error in download_raw(txt) : client error: (404) Not Found 
ok 

Вы можете проверить отдачу от try, чтобы увидеть, если код поднял ставку ошибка. Подробнее см. Страницы справки.

1

Вот лучший способ сделать это с помощью httr для обработки запросов. Он также использует plyr для основного цикла. Недействительные записи содержат в них НС. Вы можете удалить их позже, если это необходимо.

library("httr"); library("plyr"); library("jsonlite") 
getData <- function(start, end) { 
    base_url <- "https://api.github.com/users/" 
    ldply(start:end, function(num) { 
    cat(url <- paste0(base_url,num, "/repos"), "\n") 
    resp <- GET(url) 
    if (status_code(resp) == 200) { 
     df <- fromJSON(content(resp, "text")) 
     out <- data.frame(language = NA, name = NA) 
     if (length(df) > 0) { 
     out <- df[, c("language", "name")] 
     } 
    } 
    out 
    }) 
} 
2

Как я уже сказал в своем комментарии, вам может быть лучше использовать API GH из одного из пакетов R, который его реализует. Однако, если вы решили построить его с нуля, следующий код:

  • использует встроенный в JSON-> декодирование R, который httr дает вам бесплатно
  • проверяет наличие действительных кодов ответа
  • счета для потенциально отсутствующих полей в возвращаемом значении
  • использует data.table как для эффективности и упрощения обработки данных каркасного здания

Это также дает вам прогресс бар s бесплатно с pbapply.

library(httr) 
library(data.table) 
library(pbapply) 

get_data <- function(start, end) { 
    base_url <- 'https://api.github.com/users/%d/repos' 
    pblapply(start:end, function(i) { 
    resp <- GET(sprintf(base_url, i)) 
    warn_for_status(resp) 
    if (status_code(resp) == 200) { 
     dat <- content(resp, as="parsed") 
     data.table(name=sapply(dat, function(x) ifelse(is.null(x[["name"]]), NA, x[["name"]])), 
       language=sapply(dat, function(x) ifelse(is.null(x[["language"]]), NA, x[["language"]]))) 
    } else { 
     data.table(language=NA, name=NA) 
    } 
    }) 
} 

gh <- rbindlist(get_data(1, 6)) 

gh 
##      name  language 
## 1: python-youtube-library  Python 
## 2:      t   NA 
## 3:    dotfiles   VimL 
## 4:    pair-box   NA 
## 5:   6.github.com JavaScript 
## 6:    AndAnd.Net   C# 
## 7:   backbone-tunes JavaScript 
## 8:   battletower CoffeeScript 
## 9:    BeastMode   Ruby 
## 10: blurry_search.coffee JavaScript 
## 11:    bootstrap   CSS 
## 12:  browser-deprecator JavaScript 
## 13:   classify.js JavaScript 
## 14:   cocoa-example Objective-C 
## 15:    Colander CoffeeScript 
## 16:  comic_reader.js JavaScript 
## 17:   crawl-tools  Python 
## 18:   CS-Projects  Python 
## 19:    cssfast CoffeeScript 
## 20:    danbooru   Ruby 
## 21:     Dex CoffeeScript 
## 22:    dnode-ruby   Ruby 
## 23:    domain-gen   Ruby 
## 24:   domainatrix   Ruby 
## 25:    Doodler   Java 
## 26:    dotfiles   VimL 
## 27:     dothis   Ruby 
## 28:    elixir-web  Elixir 
## 29:   faster_manga CoffeeScript 
## 30:     favmix   Java 
## 31:     fluent   Ruby 
## 32:  fluid-image-grid JavaScript 
## 33:    freeform   Ruby 
## 34:   FreeYourCode   Ruby 
##      name  language 

Пройдите бесплатный доступ к API. Этот код предупредит вас, если он получит 403, но продолжит обработку (вы можете изменить это с помощью stop_for_status против warn_for_status или просто проверить и остановить самостоятельно). Таким образом вы получите неправильный код NA.

ИМО было бы гораздо выгоднее использовать аутентифицированный доступ к API.

Смежные вопросы