R/scraper.R

Defines functions pega_state lista_processos lista_processos_pag baixa_processo_jurisprudencia parser_jurisprudencia parser_jurisprudencia_pag pega_tag parser_jurisprudencia_arq rm_accent consolidar_resultados

Documented in lista_processos parser_jurisprudencia parser_jurisprudencia_pag

#' @export
pega_state <- function(r) {
  r %>%
    httr::content('text') %>%
    xml2::read_html() %>%
    rvest::html_node('#javax\\.faces\\.ViewState') %>%
    rvest::html_attr('value')
}

#' Funcao que baixa lista de processos do carf
#'
#' @export
lista_processos <- function(de, ate, path, min_pag = 1, max_pag = Inf) {
  url1 <- 'https://carf.fazenda.gov.br/sincon/public/pages/ConsultarJurisprudencia/consultarJurisprudenciaCarf.jsf'
  r <- httr::GET(url1, httr::config(ssl_verifypeer = FALSE))
  state <- pega_state(r)
  j_id <- xml2::read_html(r) %>%
    rvest::html_node('#botaoPesquisarCarf') %>%
    rvest::html_attr('onclick')
  j_id <- paste('consultaJurisprudenciaForm',
                regmatches(j_id, regexpr('j_id[0-9]{1,2}', j_id)), sep = ':')
  dados <- list(
    'AJAXREQUEST' = '_viewRoot',
    'consultaJurisprudenciaForm' = 'consultaJurisprudenciaForm',
    'consultaJurisprudenciaForm:dataInicialInputDate' = de,
    'consultaJurisprudenciaForm:dataFinalInputDate' = ate,
    'consultaJurisprudenciaForm:campoPesquisa1' = '1',
    'campoPesquisa2' = '2',
    'consultaJurisprudenciaForm:campoPesquisa3' = '1',
    'javax.faces.ViewState' = state
  )
  dados[[j_id]] <- j_id
  r2 <- httr::POST(url1, body = dados, httr::config(ssl_verifypeer = FALSE))
  #cat(httr::content(r2, 'text'), file='teste.html')
  # crawlr:::visualize.response(r2)
  h <- httr::content(r2, 'text')
  paginas <- regexec('[0-9]+ de ([0-9]+)', h)
  paginas <- as.numeric(regmatches(h, paginas)[[1]][2])
  if (is.infinite(max_pag - min_pag)) max_pag <- paginas
  cat(sprintf('baixando de %d a %d...\n', min_pag, max_pag))
  aux <- sapply(min_pag:max_pag, lista_processos_pag, r = r2, path = path)
  invisible(aux)
}

lista_processos_pag <- function(pag, r, path) {
  cat(sprintf('pag_%05d', pag), '\n')
  url_pag <- 'https://carf.fazenda.gov.br/sincon/public/pages/ConsultarJurisprudencia/listaJurisprudenciaCarf.jsf'
  state <- pega_state(r)
  dados <- list('AJAXREQUEST' = '_viewRoot',
                'formAcordaos' = 'formAcordaos',
                'javax.faces.ViewState' = state,
                'formAcordaos:dataScroller_2' = as.character(pag),
                'ajaxSingle' = 'formAcordaos:dataScroller_2',
                'AJAX:EVENTS_COUNT' = '1')
  r_pag <- httr::POST(url_pag, body = dados, httr::config(ssl_verifypeer = FALSE))
  arq_pagina <- sprintf('%s/pag_%05d.html', path, pag)
  if (!file.exists(arq_pagina)) {
    cat(httr::content(r_pag, 'text'), file = arq_pagina)
  }
  pega_state(r_pag)
  aux <- sapply(((pag - 1) * 10):((pag - 1) * 10 + 9),
                baixa_processo_jurisprudencia,
                r = r_pag, pag = pag, path = path)
  invisible(aux)
}

baixa_processo_jurisprudencia <- function(id, r, pag, path) {
  tryCatch({
    url_pag <- 'https://carf.fazenda.gov.br/sincon/public/pages/ConsultarJurisprudencia/listaJurisprudenciaCarf.jsf'
    state <- pega_state(r)
    dados <- list('formAcordaos' = 'formAcordaos',
                  'javax.faces.ViewState' = state)
    form <- sprintf('formAcordaos:tblJurisprudencia:%d:numDecisao', id)
    dados[[form]] <- form
    r_processo <- httr::POST(url_pag, body = dados,
                             httr::config(ssl_verifypeer = FALSE))
    n_processo <- xml2::read_html(r_processo)
    n_processo <- rvest::html_node(n_processo, '#formAcordaos\\:numProcesso')
    n_processo <- gsub('[^0-9]', '', rvest::html_text(n_processo))
    cat(sprintf('pag %05d | id %05d | processo %s', pag, id, n_processo), '\n')
    # cat(httr::content(r_processo, 'text'), file = 'teste.html')
    arq_processo <- sprintf('%s/%07d_pag_%05d_p_%s.html', path, id, pag, n_processo)
    if (!file.exists(arq_processo)) {
      cat(httr::content(r_processo, 'text'), file = arq_processo)
    }
  }, error = function(e) {
    n_processo <- 'xxxxxxxxxxxxxxxxx'
    arq_processo <- sprintf('%s/%07d_pag_%05d_p_%s.html', path, id, pag, n_processo)
    if (!file.exists(arq_processo)) {
      cat(e$message, file = arq_processo)
    }
    cat(sprintf('pag %05d | id %05d | processo %s', pag, id, n_processo), '\n')
  })
}

#' transforma arquivo html em data_frame
#'
#' @export
parser_jurisprudencia <- function(arqs, verbose = FALSE) {
  dfp <- dplyr::data_frame(arq = arqs) %>%
    dplyr::mutate(n_processo = stringr::str_match(arq, '_p_([0-9]+)')[, 2])
  d <- dplyr::do(dplyr::group_by(dfp, n_processo, arq),
                 parser_jurisprudencia_arq(.$arq, verbose = verbose))
  d <- dplyr::ungroup(d)
  d
}

#' transforma arquivo html em data_frame
#'
#' @export
parser_jurisprudencia_pag <- function(arqs, spread = FALSE, verbose = FALSE) {
  parser_jurisprudencia_pag_um <- function(arq, verbose) {
    h <- xml2::read_html(arq)
    tabelas <- rvest::html_nodes(h, xpath = '//table[@id="formAcordaos:tblJurisprudencia"]//table')
    tbl <- lapply(tabelas, rvest::html_table, fill = TRUE)
    tbl <- lapply(tbl, function(x) {x$id <- runif(1); x})
    tbl <- dplyr::bind_rows(tbl)[c('X1', 'id')]
    names(tbl) <- c('keyval', 'id')
    tbl <- dplyr::mutate(tbl, keyval = gsub('//.*\n', '', keyval),
                         keyval = ifelse(
                           stringr::str_detect(keyval, '^[0-9]'),
                           paste0('n_acordao:', keyval), keyval))
    tbl <- tidyr::separate(tbl, keyval, c('key', 'val'), '\\:', extra = 'merge')
    tbl$key <- stringr::str_trim(abjutils::rm_accent(tolower(tbl$key)))
    tbl$key <- gsub('[()]', '', gsub(' +', '_', tbl$key))
    tbl <- dplyr::filter(tbl, !is.na(key), key != '')
    ano <- gsub('/.*', '', gsub('.*//', '', arq))
    a <- gsub('\\.html', '.rds', gsub('.*/', '', arq))
    # saveRDS(tbl, sprintf('~/Dropbox/Projects/crawlercarf/jurisprudencia/temp_pags/%s_%s', ano, a))
    tbl
  }
  d <- dplyr::data_frame(arq = arqs) %>%
    dplyr::mutate(pag = stringr::str_match(arq, 'pag_([0-9]+)')[, 2])
  d <- dplyr::group_by(d, pag, arq)
  d <- dplyr::do(d, parser_jurisprudencia_pag_um(.$arq, verbose = verbose))
  d <- dplyr::ungroup(d)
  if (spread) d <- tidyr::spread(d, key, val)
  d
}

pega_tag <- function(h, xpath) {
  tag <- tryCatch({
    rvest::html_text(rvest::html_node(h, xpath = xpath))
  }, error = function(e) {
    ''
  })
  tag
}

parser_jurisprudencia_arq <- function(arq, verbose = FALSE) {
  try({
    if (verbose) cat(arq, '\n')
    h <- xml2::read_html(arq)
    n_processo <- pega_tag(h, '//*[@id="formAcordaos:numProcesso"]')
    contribuinte <- pega_tag(h, '//*[@id="formAcordaos:contribuinte"]')
    tipo_recurso <- pega_tag(h, '//*[@id="formAcordaos:tdivTipoRecurso"]/span[2]')
    relator <- pega_tag(h, '//*[@id="formAcordaos:relator"]')
    data_sessao <- pega_tag(h, '//*[@id="formAcordaos:dataSessao"]')
    n_acordao <- pega_tag(h, '//*[@id="formAcordaos:numDecisao"]')
    tributo <- pega_tag(h, '//*[@id="formAcordaos:tdivMateria"]/span[2]')
    txt_ementa <- pega_tag(h, '//*[@id="formAcordaos:ementa"]')
    txt_decisao <- pega_tag(h, '//*[@id="formAcordaos:textDecisao"]')
    n_anexos <- length(rvest::html_nodes(h, xpath = '//img[contains(@id, "imageAnexos")]'))

    d <- data.frame(n_acordao = n_acordao,
                    n_processo = n_processo,
                    tipo_recurso = tipo_recurso,
                    tributo = tributo,
                    data_sessao = data_sessao,
                    contibuinte = contribuinte,
                    relator = relator,
                    n_anexos = n_anexos,
                    txt_ementa = txt_ementa,
                    txt_decisao = txt_decisao,
                    stringsAsFactors = FALSE)
    return(d)
  })
  return(data.frame(erro = 'erro', stringsAsFactors = FALSE))
}

rm_accent <- function(x) {
  gsub("`|\\'", "", iconv(x, to = "ASCII//TRANSLIT"))
}

#' @export
consolidar_resultados <- function(d) {
  cat('resultados...\n')
  negar_provimento <- 'negar?(do)?(am)? (o )?provimento|negou se (o )?provimento|recurso nao provido|negar lhes? provimento|negando lhes? provimento|nega lo provime'
  dar_provimento <- 'dar?(do)? (o )?provimento|deu se (o )?provimento|recurso provido|dar lhes? provimento'
  em_parte <- 'em parte|parcial'
  diligencia <- 'diligencia'
  nao_conhecer <- 'nao conhece|nao reconhecer'
  anular <- 'nul(a|o|i)'

  d_aux <- d %>%
    dplyr::mutate(txt_decisao2 = gsub(' +', ' ', gsub(
      '\n|\r', ' ', gsub('[[:punct:]]|\n\r|\r\n', ' ', tolower(txt_decisao)))
    ),
    txt_decisao2 = rm_accent(txt_decisao2),
    negar_provimento = stringr::str_detect(txt_decisao2, negar_provimento),
    dar_provimento = stringr::str_detect(txt_decisao2, dar_provimento),
    em_parte = stringr::str_detect(txt_decisao2, em_parte),
    diligencia = stringr::str_detect(txt_decisao2, diligencia),
    nao_conhecer = stringr::str_detect(txt_decisao2, nao_conhecer),
    anular = stringr::str_detect(txt_decisao2, anular)) %>%
    dplyr::mutate(soma = negar_provimento + (dar_provimento | em_parte) +
             diligencia + nao_conhecer + anular) %>%
    dplyr::mutate(negar_provimento = ifelse(negar_provimento, 'negar_provimento', ''),
           dar_provimento = ifelse(dar_provimento, 'dar_provimento', ''),
           em_parte = ifelse(em_parte, 'em_parte', ''),
           diligencia = ifelse(diligencia, 'diligencia', ''),
           anular = ifelse(anular, 'anular', ''),
           nao_conhecer = ifelse(nao_conhecer, 'nao_conhecer', ''),
           comb = str_trim(gsub(' +', ' ', paste(negar_provimento,
                                                 dar_provimento,
                                                 em_parte,
                                                 diligencia,
                                                 anular,
                                                 nao_conhecer)))) %>%
    dplyr::mutate(comb = ifelse(stringr::str_detect(comb, 'em_parte'), 'em_parte', comb),
           comb = ifelse(stringr::str_detect(comb, 'negar') & stringr::str_detect(comb, 'dar_'),
                         'em_parte', comb),
           comb = ifelse(stringr::str_detect(comb, 'negar'), 'negar_provimento', comb),
           comb = ifelse(stringr::str_detect(comb, 'anular') &
                           stringr::str_detect(comb, 'dar_') &
                           !stringr::str_detect(comb, 'nao_conhecer'),
                         'dar_provimento', comb),
           comb = ifelse(stringr::str_detect(comb, 'anular') &
                           stringr::str_detect(comb, 'dar_') &
                           stringr::str_detect(comb, 'nao_conhecer'),
                         'dar_provimento', comb),
           comb = ifelse(stringr::str_detect(comb, 'dar_') &
                           !stringr::str_detect(comb, 'anular') &
                           stringr::str_detect(comb, 'nao_conhecer'),
                         'em_parte', comb),
           comb = ifelse(stringr::str_detect(comb, 'anular|nao_conhecer|dilig'),
                         'anulado, nao conhecido ou diligencia', comb),
           comb = ifelse(comb == '', 'vazio', comb))
  result <- d_aux %>%
    dplyr::select(-(negar_provimento:soma), -txt_decisao2) %>%
    dplyr::mutate(resultado = comb) %>%
    dplyr::mutate(decisao = resultado,
           resultado = ifelse(decisao == 'negar_provimento' &
                                tipo_recurso %in% c('RECURSO DE OFÍCIO',
                                                    'RECURSO ESPECIAL DO PROCURADOR'),
                              'FAVORAVEL', resultado),
           resultado = ifelse(decisao == 'dar_provimento' &
                                tipo_recurso %in% c('RECURSO DE OFÍCIO',
                                                    'RECURSO ESPECIAL DO PROCURADOR'),
                              'DESFAVORAVEL', resultado),
           resultado = ifelse(decisao == 'dar_provimento' &
                                tipo_recurso %in% c('RECURSO VOLUNTARIO',
                                                    'RECURSO ESPECIAL DO CONTRIBUINTE'),
                              'FAVORAVEL', resultado),
           resultado = ifelse(decisao == 'negar_provimento' &
                                tipo_recurso %in% c('RECURSO VOLUNTARIO',
                                                    'RECURSO ESPECIAL DO CONTRIBUINTE'),
                              'DESFAVORAVEL', resultado),
           resultado = ifelse(decisao == 'em_parte',
                              'PARCIALMENTE FAVORAVEL', resultado),
           resultado = toupper(resultado),
           resultado = ifelse(stringr::str_detect(resultado, '_'), 'VAZIO', resultado))
  return(result)
}
jtrecenti/valorCarf documentation built on May 20, 2019, 3:18 a.m.